2014-05-11 41 views
0

我在JavaFX文件中编写了一些代码。现在,我得到这个错误码:这是什么IllegalStateExeption?

Exception in thread "usb4java IRP Queue Processor" java.lang.IllegalStateException: Not on FX application thread; currentThread = usb4java IRP Queue Processor 
at com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:210) 
at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:393) 
at javafx.scene.Scene.<init>(Scene.java:374) 
at javafx.scene.Scene.<init>(Scene.java:232) 
at app.model.Window.<init>(Window.java:28) 
at app.model.UsbDataInputListener.dataEventOccurred(UsbDataInputListener.java:38) 
at org.usb4java.javax.PipeListenerList.dataEventOccurred(PipeListenerList.java:49) 
at org.usb4java.javax.Pipe.sendEvent(Pipe.java:270) 
at org.usb4java.javax.IrpQueue.finishIrp(IrpQueue.java:48) 
at org.usb4java.javax.AbstractIrpQueue.process(AbstractIrpQueue.java:118) 
at org.usb4java.javax.AbstractIrpQueue$1.run(AbstractIrpQueue.java:73) 
at java.lang.Thread.run(Thread.java:745) 

BUILD停止(总时间41秒),

我不知道如何处理这个疑难问题知道,它与一个线程的问题(我认为) ,但我不知道什么是真的错了,或者这个异常会对我说什么...... 下面是一些代码:

public class UsbDataInputListener implements UsbPipeListener { 

@Override 
public void errorEventOccurred(UsbPipeErrorEvent upee) { 
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
} 

@Override 
public void dataEventOccurred(UsbPipeDataEvent upde) { 
    final byte[] recData = upde.getData(); //Übertragene Bytes 
    //Input wird überprüft 
    //Aktion für die jeweilige Taste wird durchgeführt 
    if(Arrays.equals(recData, Keys.POWER)){ 
     try { 
      System.out.println("Power of pressed ..."); 
      ShutdownInfoController isc = new ShutdownInfoController(); 
      Window shtdnWin = new Window("/app/view/ShutdownInfoView.fxml","Info zum Herunterfahren", 
        isc,false); 

     } catch (IOException ex) { 
      Logger.getLogger(UsbDataInputListener.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    }else if(Arrays.equals(recData, Keys.MUSIC)){ 

    }else if(Arrays.equals(recData, Keys.GAME)){ 

    }else if(Arrays.equals(recData, Keys.GALLERY)){ 

    }else if(Arrays.equals(recData, Keys.VIDEO)){ 

    }else if(Arrays.equals(recData, Keys.BEFORE)){ 

    }else if(Arrays.equals(recData, Keys.NEXT)){ 

    }else if(Arrays.equals(recData, Keys.BACKWARD)){ 

    }else if(Arrays.equals(recData, Keys.FORWARD)){ 

    }else if(Arrays.equals(recData, Keys.PLAY)){ 

    }else if(Arrays.equals(recData, Keys.STOP)){ 

    }else if(Arrays.equals(recData, Keys.MUTE)){ 

    }else if(Arrays.equals(recData, Keys.VOL_DOWN)){ 

    }else if(Arrays.equals(recData, Keys.VOL_UP)){ 

    }else if(Arrays.equals(recData, Keys.NUMBER_ONE)){ 

    }else if(Arrays.equals(recData, Keys.UP)){ 

    }else if(Arrays.equals(recData, Keys.NUMBER_THREE)){ 

    }else if(Arrays.equals(recData, Keys.LEFT)){ 

    }else if(Arrays.equals(recData, Keys.ENTER)){ 

    }else if(Arrays.equals(recData, Keys.RIGHT)){ 

    }else if(Arrays.equals(recData, Keys.NUMBER_SEVEN)){ 

    }else if(Arrays.equals(recData, Keys.DOWN)){ 

    }else if(Arrays.equals(recData, Keys.ESCAPE)){ 

    }else if(Arrays.equals(recData, Keys.ZERO)){ 

    } 
} 

}

public class Window implements Initializable{ 

private static Stage stage; 
// Konstruktor errichtet neues Fenster 
public Window(String fxml, String windowName, Object controller, boolean fullscreen) throws IOException{ 
    FXMLLoader loader = new FXMLLoader(getClass().getResource(fxml)); //Lädt die zugehörige FXML 
    loader.setController(controller); //Setzt den Controller 
    Parent root = (Parent) loader.load(); 
    Scene scene = new Scene(root); 
    Window.stage.setTitle(windowName); //Name des Fensters 
    Window.stage.setScene(scene); 
    Window.stage.setFullScreen(fullscreen); //Setz Vollbild, wenn fullscreen = true 
    Window.stage.show(); //Zeigt das Fentsre 
} 

public static void setStage(Stage stage){ 
    Window.stage = stage; 
} 

public static Stage getStage(){ 
    return Window.stage; 
} 
//Schließt das Fenster 
public static void close(){ 
    Window.stage.close(); 
} 

@Override 
public void initialize(URL location, ResourceBundle resources) { 

} 

}

public class ShutdownInfoController implements Initializable { 

@FXML Button yesButton; 
@FXML Button noButton; 


public void onYesButtonRequest(ActionEvent e) throws IOException{ 
    String cmdtext = "shutdown.exe /s /hybrid /t 0 "; // Befehl um PC herunterzufahren 
    Runtime.getRuntime().exec(cmdtext); // Befehl wird ausgeführt; 
} 

public void onNoButtonRequest(ActionEvent e){ 
    Window.close(); //Fenster wird geschlossen 
} 

/** 
* Initializes the controller class. 
*/ 
@Override 
public void initialize(URL url, ResourceBundle rb) { 
    // TODO 
}  

}

任何一个想法有什么不对?

回答

1

如例外情况所示,您正在FX应用程序线程的场景图上进行操作。在JavaFX中,所有操作场景图的操作都必须在FX应用程序线程中调用。任何改变节点状态或创建新节点的操作必须发生在所述线程上。

现在,您的逻辑很详细,所以很可能您正在多个位置的场景图上进行操作。对于执行此类工作的任何操作,请通过Platform.runLater()在FX应用程序线程上运行。该方法采用Runnable,您可以使用它来调用场景图形代码。

+0

谢谢,工作正常;) – Chris