2015-08-03 12 views
26

Recentemente ho aggiornato a Windows 10 e il codice JavaFX che ha funzionato in Windows 8.1 sembra bloccarsi in 10. Ho rintracciato il problema in giù per aprire un ComboBox all'interno di una finestra di dialogo. Questo sembra bloccare qualsiasi programma JavaFX. Qualcun altro ha lo stesso problema? (I computer Windows 10 sono ancora pochi e lontani tra di loro, quindi sarebbe bene confermare che il bug è in effetti un problema JavaFX)JavaFX ComboBox non risponde su Windows 10

Ho allegato il codice di esempio qui sotto. Il ComboBox nel palco principale va bene, ma quando apro una finestra di dialogo e provo a usare il ComboBox lì, l'intera cosa si blocca. Sto utilizzando 8u51 Java in Eclipse 4.4.0

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(); 

} 

} 
+2

rilevante JDK bug dalla risposta cancellato: https://bugs.openjdk.java.net/browse/JDK-8132897 – berry120

+1

ho aggiornato il mio PC e il mio computer portatile a Windows 10. Questo problema esiste sul mio portatile e non il mio PC: \ –

+0

Ho notato nella segnalazione di bug che il blocco della casella combinata sembra essere un problema all'interno di una fase mentre i miei problemi sono limitati ai soli dialoghi. Quindi questo significa che siamo praticamente bloccati fino a quando non uscirà un nuovo jdk? – macster110

risposta

16

Secondo il bug report, una soluzione temporanea è l'impostazione del seguente proprietà di sistema:

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

o, nel codice di un'applicazione:

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

Or alternativamente "Esegui lo screen reader di Windows Narrator (con accessibilità abilitata a sinistra)".

Il bug sembra essere stato introdotto in JDK 8u40 e interessa i sistemi Windows 10 con uno schermo tattile installato e abilitato.

Alcuni test rapidi sembrano indicare che ha risolto il problema per me.

+0

Questo è stato corretto in JDK 8u72 ([vedi risposta sotto] (https://stackoverflow.com/a/43266269/3357935)) –

1

Sto avendo lo stesso problema con un Intel HD 4000.

io possa avere una soluzione però. Ho appena sostituito ogni utilizzo di ComboBox nella mia applicazione con ChoiceBox. Non è l'ideale, ma per piccole applicazioni come la mia, potrebbe essere l'opzione migliore fino a quando Oracle, o Intel, non riusciranno a mettere insieme le loro azioni.

6

Come accennato in altre risposte, è probabile che si tratti di un errore nei processori grafici Intel e sembra non essere risolto da un aggiornamento del driver.

Tuttavia, per quanto questo errore sia hopefully being fixed, per ora raccomando di aggiungere un evento che concentra la casella su una macchina da stampa del mouse e quindi risolve il problema. È sufficiente aggiungere il codice qui sotto:

comboBox.setOnMousePressed(new EventHandler<MouseEvent>(){ 
    @Override 
    public void handle(MouseEvent event) { 
     comboBox.requestFocus(); 
    } 
}); 
-1

I miei due centesimi in ritardo, ma io confermo che

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

(come pubblicato da @PingZing)

ha risolto lo stesso problema sul mio app. La capacità tocco era semplicemente dato da ....

Pen 'n touch Wacom bamboo create tablet 

che sta dando di Windows 10 funzionalità touch

+0

Questo dovrebbe essere lasciato come commento sulla risposta di PingZing, piuttosto che come risposta autonoma. –

1

Aggiornamento a JDK 8u72 or newer dovrebbe risolvere il problema.

Questo era un known issue in JDK 8u40 che influisce su alcuni computer con touchscreen Windows 10. Fare clic su un ComboBox fuori fuoco causerebbe la mancata risposta dei programmi. Il problema è stato risolto il 17 settembre 2015, il che significa che non dovrebbe accadere su alcuna versione dopo JDK 8u72.

Se l'aggiornamento del JDK non è un'opzione, ci sono two known workarounds.

  1. eseguire la vostra applicazione con l'accessibilità disattivata con l'aggiunta di System.setProperty("glass.accessible.force", "false");
  2. Eseguire il lettore di schermo di Windows Narratore (con l'accessibilità sinistra abilitato).