2014-03-25 35 views
0

我在做一個Platform.RunLater來更新TextField。在這裏,您可以看到代碼:稍後運行不起作用JavaFX

public class FXMLDocumentController implements Initializable { 

    @FXML 
    private TextField carlos; 
    RXTX main = new RXTX(); 

    public void Test(){ 
    Platform.runLater(new Runnable() { 
        @Override public void run() { 
         carlos.setText("Test");  
        } 
       }); 

    } 



    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     main.initialize(); 
     Thread t=new Thread() { 
      public void run() { 
       //the following line will keep this app alive for 1000 seconds, 
       //waiting for events to occur and responding to them (printing incoming messages to console). 
       try {Thread.sleep(1000000);} catch (InterruptedException ie) {} 
      } 
     }; 
     t.start(); 
     System.out.println("Started"); 
    }  

} 

這:

public class RXTX implements SerialPortEventListener{ 


    private String Temperature; 

     SerialPort serialPort; 
     /** The port we're normally going to use. */ 
    private static final String PORT_NAMES[] = { 
      "COM4" // Windows 
    }; 
    /** 
    * A BufferedReader which will be fed by a InputStreamReader 
    * converting the bytes into characters 
    * making the displayed results codepage independent 
    */ 
    private BufferedReader input; 
    /** The output stream to the port */ 
    private OutputStream output; 
    /** Milliseconds to block while waiting for port open */ 
    private static final int TIME_OUT = 2000; 
    /** Default bits per second for COM port. */ 
    private static final int DATA_RATE = 9600; 

    public void initialize() { 
     CommPortIdentifier portId = null; 
     Enumeration portEnum = CommPortIdentifier.getPortIdentifiers(); 

     //First, Find an instance of serial port as set in PORT_NAMES. 
     while (portEnum.hasMoreElements()) { 
      CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement(); 
      for (String portName : PORT_NAMES) { 
       if (currPortId.getName().equals(portName)) { 
        portId = currPortId; 
        break; 
       } 
      } 
     } 
     if (portId == null) { 
      System.out.println("Could not find COM port."); 
      return; 
     } 

     try { 
      // open serial port, and use class name for the appName. 
      serialPort = (SerialPort) portId.open(this.getClass().getName(), 
        TIME_OUT); 

      // set port parameters 
      serialPort.setSerialPortParams(DATA_RATE, 
        SerialPort.DATABITS_8, 
        SerialPort.STOPBITS_1, 
        SerialPort.PARITY_NONE); 

      // open the streams 
      input = new BufferedReader(new InputStreamReader(serialPort.getInputStream())); 
      output = serialPort.getOutputStream(); 

      // add event listeners 
      serialPort.addEventListener(this); 
      serialPort.notifyOnDataAvailable(true); 
     } catch (Exception e) { 
      System.err.println(e.toString()); 
     } 
    } 

    /** 
    * This should be called when you stop using the port. 
    * This will prevent port locking on platforms like Linux. 
    */ 
    public synchronized void close() { 
     if (serialPort != null) { 
      serialPort.removeEventListener(); 
      serialPort.close(); 
     } 
    } 

    /** 
    * Handle an event on the serial port. Read the data and print it. 
    */ 
    public synchronized void serialEvent(SerialPortEvent oEvent) { 
     if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) { 
      try { 
       String inputLine=input.readLine(); 
       System.out.println(inputLine); 
           GetData(inputLine); 
      } catch (Exception e) { 
       System.err.println(e.toString()); 
      } 
     } 
     // Ignore all the other eventTypes, but you should consider the other ones. 
    } 

     @FXML 
    private void GetData(String Data) { 

      if(Data.contains("Temperature")){ 
       FXMLDocumentController main = new FXMLDocumentController(); 
       main.Test(); 
      } 

     } 
} 

嘛,所以我不工作。它返回一個錯誤這樣的:在可運行在顯示java.lang.NullPointerException openpilot.FXMLDocumentController $ 1.run(FXMLDocumentController.java:35) 在

異常 com.sun.javafx.application.PlatformImpl $ 4 $ 1 .RUN(PlatformImpl.java:182) 在 com.sun.javafx.application.PlatformImpl $ 4 $ 1.run(PlatformImpl.java:179) 在java.security.AccessController.doPrivileged(本機方法)在 的com.sun .javafx.application.PlatformImpl $ 4.run(PlatformImpl.java:179) at com.sun.glass.ui.InvokeLaterDispatcher $ Future.run(InvokeLaterDispatcher.java:76) at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)at com.sun.glass.ui.win.WinApplication.access $ 100(WinApplication.java:17) at com.sun.glass在java.lang.Thread.run(Thread.java:744).ui.win.WinApplication $ 3 $ 1.run(WinApplication.java:67)

+0

那麼哪個是FXMLDocumentController中的第35行? –

回答

1

不要使用new創建FXML控制器,使用FXMLLoader.load()

在您的特殊情況下,最好使用Platform.runLater()在JavaFX應用程序線程上調用load()。

它是創建@FXML帶註釋節點的實例的FXMLLoader。所以除非你使用loader,否則@FXML節點永遠不會被創建。因此,在這種情況下,您的「carlos」TextField爲空,因爲沒有創建這樣的TextField,導致您的NullPointerException。

NullPointerException錯誤與runLater無效或無法工作。

您的代碼中可能還有其他很多錯誤。

我建議在處理與串口通信的多線程應用程序之前,先花更多時間編寫基本的單線程JavaFX應用程序。

+1

FXML被加載到主文件中。但是,我無法加載它。我怎麼能把它? – user3203690