当前位置: 首页 > 知识库问答 >
问题:

JavaFX组合框在Windows 10上没有响应

栾昂雄
2023-03-14

我最近升级到了Windows 10,而在Windows 8.1中运行的JavaFX代码似乎在10年后就冻结了。我一直在追踪这个问题,直到在对话框中打开一个组合框。这似乎冻结了任何JavaFX程序。其他人也有同样的问题吗?(Windows 10计算机仍然很少,所以最好确认该漏洞确实是JavaFX问题)

我在下面附上了示例代码。主阶段中的ComboBox很好,但是当我打开一个对话框并尝试在那里使用ComboBox时,整个东西都冻结了。我在Eclipse 4.4.0中使用Java8u51

package javafxExamples;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ChoiceDialog;
import javafx.scene.control.ComboBox;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class ComboErrorTest extends Application {

String[] list={"Jamie", "Arthur", "Gordon"};

private Stage stage;

public static void main(String[] args) {
    launch(args);
}


@Override
public void start(Stage stage) throws Exception {
    //create box in main stage.
    ComboBox<String> comboBox=new ComboBox<String>(); 
    for (int i=0; i<list.length; i++){
        comboBox.getItems().add(list[i]);
    }
    comboBox.getSelectionModel().select(list[0]);

    BorderPane pane = new BorderPane(comboBox);
    pane.setPrefSize(400, 250);

    //dialog bit
    List<String> choices = new ArrayList<>();
    choices.add("a");
    choices.add("b");
    choices.add("c");

    ChoiceDialog<String> dialog = new ChoiceDialog<>("b", choices);
    dialog.setTitle("Choice Dialog");
    dialog.setHeaderText("Look, a Choice Dialog");
    dialog.setContentText("Choose your letter:");


    Button dialogButton=new Button("Open Dialog...");
    dialogButton.setOnAction((action)->{
        // Traditional way to get the response value.
        Optional<String> result = dialog.showAndWait();
        if (result.isPresent()){
            System.out.println("Your choice: " + result.get());
        }
    });

    pane.setBottom(dialogButton);

    Scene scene = new Scene(pane);

    stage.setTitle("ComboError Demo");
    stage.setScene(scene);
    stage.show();

}

}

共有3个答案

丘浩宕
2023-03-14

升级到JDK 8u72或更新版本应该可以解决这个问题。

这是JDK 8u40中的一个已知问题,会影响某些Windows 10触摸屏计算机。单击“失焦”组合框会导致程序无响应。该问题于2015年9月17日得到解决,这意味着在JDK 8u72之后的任何版本上都不应该出现这种情况。

如果不能升级JDK,那么有两种已知的解决方法。

  1. 通过添加系统,在禁用可访问性的情况下运行应用程序。setProperty(“glass.accessible.force”、“false”)
  2. 运行Windows叙述者屏幕阅读器(启用辅助功能)

雍马鲁
2023-03-14

正如在其他答案中提到的,这可能是英特尔图形处理器的错误,而且似乎无法通过驱动程序更新来解决。

然而,虽然这个错误有望被修复,但现在我建议添加一个事件,将组合框集中在鼠标上,从而解决问题。只需添加以下代码:

comboBox.setOnMousePressed(new EventHandler<MouseEvent>(){
    @Override
    public void handle(MouseEvent event) {
        comboBox.requestFocus();
    }
});
鲁浩言
2023-03-14

根据bug报告,临时解决方案是设置以下系统属性:

java -Dglass.accessible.force=false ... 

或者,在应用程序的代码中:

System.setProperty("glass.accessible.force", "false");

或者,“运行Windows叙述者屏幕阅读器(启用辅助功能)”。

该漏洞似乎是在JDK 8u40中引入的,会影响安装并启用触摸屏的Windows 10系统。

一些快速测试似乎表明它为我解决了问题。

 类似资料:
  • 我需要关于设置组合框按钮单元格的帮助。我使用一个组合框来显示可观察列表中的数据,该列表包含两个列的表中的数据,“步骤”和“下一步”(下一步包含一个插入在步骤列中的项目);我需要做的是显示带有“步骤”列表的组合框列表单元格和相对的“下一步”按钮单元格。现在,我可以正确地看到列表单元格,但我的按钮单元格总是空的。 代码: 提前感谢。

  • 提前谢了。

  • 我试图创建一个,它将显示所选的预览,但是会显示字符串值。 唯一有效的方法似乎是创建

  • 我想要一个组合框,它会在用户键入时过滤列表项。它应该如下工作: 键入时,文本字段应该显示一个可能的选择,但是用户尚未键入的单词部分应该突出显示。 当他打开列表时,下拉框应该只显示可能的选项? 使用箭头键,用户应该在缩小可能的项目后选择剩余的项目之一。 过滤并不重要,跳转到第一个匹配的选择也可以。 有类似的吗?

  • 我正在建立一个简单的可编辑组合框与自动完成。我想根据内部TextField的内容筛选组合框的内容。 我设法使其工作,但当从TextField中删除字符时,我面临一个重新应用自动完成逻辑的问题。 从我所看到的情况来看,在按下键的事件上,文本字段的内容还不包含添加的字符。 所以我只是做了一个简单的逻辑来添加KeyEvent的字符串版本来模拟TextField的内容。我制作了这个灯塔,我需要有全文来应用

  • 我正在尝试使用一个可编辑的组合框。因为我想添加一个用于按回车键的监听器。我尝试了下面的选项,但都不起作用。:( < code>cmb_year是组合框对象。