最近Windows10にアップグレードしましたが、Windows 8.1で機能していたJavaFXコードが10でフリーズするようです。ダイアログ内でコンボボックスを開くまで、問題を追跡しました。これにより、JavaFXプログラムがフリーズするようです。他の誰かが同じ問題を抱えていますか? (Windows 10コンピューターはまだ数が少なく、かなりの差があるため、バグが実際にJavaFXの問題であることを確認することをお勧めします)
以下にサンプルコードを添付しました。メインステージのComboBoxは問題ありませんが、ダイアログを開いてそこでComboBoxを使用しようとすると、すべてがフリーズします。 Eclipse4.4.0でJava 8u51を使用しています
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();
}
}
バグレポート によると、一時的な回避策は次のシステムプロパティを設定することです。
Java -Dglass.accessible.force=false ...
または、アプリケーションのコードでは:
System.setProperty("glass.accessible.force", "false");
または、「Windowsナレーターのスクリーンリーダーを実行します(ユーザー補助機能を有効のままにします)」。
このバグはJDK8u40で導入されたようで、タッチスクリーンがインストールされて有効になっているWindows10システムに影響します。
いくつかの簡単なテストは、それが私にとって問題を解決したことを示しているようです。
他の回答で述べたように、これはIntelグラフィックプロセッサで発生するエラーである可能性が高く、ドライバの更新では解決されないようです。
ただし、このバグは うまくいけば修正されます ですが、今のところ、コンボボックスをマウスの押下に集中させて問題を解決するイベントを追加することをお勧めします。以下のコードを追加するだけです。
comboBox.setOnMousePressed(new EventHandler<MouseEvent>(){
@Override
public void handle(MouseEvent event) {
comboBox.requestFocus();
}
});
JDK 8u72以降 にアップグレードすると、問題が修正されます。
これは、特定のWindows10タッチスクリーンコンピューターに影響を与えるJDK8u40の 既知の問題 でした。焦点が合っていないComboBoxをクリックすると、プログラムが応答しなくなります。この問題は2015年9月17日に解決されました。つまり、JDK8u72以降のどのバージョンでも発生しないはずです。
JDKをアップグレードするオプションがない場合は、 2つの既知の回避策 があります。
System.setProperty("glass.accessible.force", "false");
を追加して、ユーザー補助を無効にしてアプリを実行しますIntel HD4000でも同じ問題が発生しています。
私は解決策があるかもしれません。アプリケーションでのComboBoxのすべての使用法をChoiceBoxに置き換えました。これは理想的ではありませんが、私のような小さなアプリケーションの場合、OracleまたはIntelが協力するまでは最良の選択肢かもしれません。