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

稍后运行不适用JavaFX

屠杰
2023-03-14

我在做一个Platform.Runlater来更新一个TextField。在这里您可以看到代码:

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

        }
}

在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.glass.ui.win.winapplication._runloop(本机方法)在com.sun.glass.ui.win.winapplication.access$100(winapplication.java:17)在com.sun.glass.ui.win.winapplication.3$1.run(winapplication.java:67)在java.lang.thread.run(thread.java:744)

共有1个答案

燕正卿
2023-03-14

不要使用new创建FXML控制器,而是使用fxmlloader.load()。

在您的特殊情况下,最好使用platform.runlater()调用JavaFX应用程序线程上的load()。

FXMLLoader创建@fxml注释节点的实例。因此,除非使用加载器,否则将永远不会创建@fxml节点。因此,在本例中,您的“Carlos”TextField是null,因为没有任何东西创建这样的TextField,导致您的NullPointerException。

您的代码中可能还有很多其他错误。

我建议在处理与串行端口通信的多线程应用程序之前,先花更多的时间编写基本的单线程JavaFX应用程序。

 类似资料:
  • 本文向大家介绍Android 稍后运行意图,包括了Android 稍后运行意图的使用技巧和注意事项,需要的朋友参考一下 示例 创建一个接收器。这堂课将收到您的意图并按照您的意愿进行处理。 给AlarmManager一个意图。此示例将在1分钟后触发将意图发送到AlarmReceiver。            

  • 我已经用spring Security保护了我的spring boot应用程序(基本身份验证)。我为可以使用监视和管理的用户添加了角色管理。我设置management.security.roles=management。具有此角色的用户只能看到状态(使用运行状况终结点)。如果我设置management.security.role=management,则一切正常(具有此角色的用户可查看所有健康参数

  • 我正在写一个JavaApplet使用JavaFX嵌入Swing。用户可以通过以下代码使用JFXPanel启动带有JavaFX组件的Swing GUI: 当Applet首先启动时,用户可以创建GUI元素并关闭它。以后他可以再创造。为此,我需要在内存中保存一个不可见的JFrame,其中包含一个JFXPanel的整个运行时,我从来没有使用过,因为我在某个地方读到,否则JavaFX应用程序线程会停止。现在

  • 我正在使用NSeriveBus构建一个系统,它应该只在特定的时间段将消息发送给远程处理程序。到目前为止,我设法将所有消息放在一个处理队列上,并从那里检查远程处理程序的可用性,如果处理程序不可用,我就不会通过边界发送消息。要做到这一点,我正在使用 但国家安全局会继续努力。这不像其他侦听器将在几分钟内启动并运行,但它可能有几个小时的停机窗口,因此这并不完全有效。 想知道是否有办法让总线稍后重试消息,或

  • 问题内容: 我在夹层中使用Django1.7。我创建了简单的配置文件(根据Mezzanine文档),存储在单独的应用程序“配置文件”中: 创建迁移会返回: 当我运行“迁移配置文件”时: 问题是,当我尝试打开与mezzanine.accounts相关的任何页面(例如更新帐户)时,它崩溃并显示: 我做错了什么? 问题答案: 在MySQL数据库中,从表中删除行。 删除迁移文件夹中的所有迁移文件。 重试并

  • 我正在使用azure datafactory WebHook获取管道运行的详细信息-使用以下链接按工厂查询。邮递https://management.azure.com/subscriptions/{订阅ID}/resourceGroups/{resourceGroupName}/providers/Microsoft。数据工厂/工厂/{factoryName}/queryPipelineRuns