简体   繁体   English

EDT和更新状态文本

[英]EDT and updating status textArea

I want to create new thread (for Server). 我想创建新线程(用于服务器)。 I have textArea where I put my logs, I created a new class status which handles it. 我有放置日志的textArea,我创建了一个处理它的新类状态。 I run new thread for object "server", I try to "deliver" my status object to server and there do status.setStatus("blabal"); 我为对象“服务器”运行新线程,尝试将状态对象“传递”到服务器,然后执行status.setStatus(“ blabal”);。 But there is a problem.... 但有个问题....

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Server.<init>(Server.java:16)
at Main.MainPanelButtonStartActionPerformed(Main.java:154)
at Main.access$000(Main.java:9)
at Main$1.actionPerformed(Main.java:63)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.JToggleButton$ToggleButtonModel.setPressed(JToggleButton.java:308)
at 

javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6505)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
    at java.awt.Component.processEvent(Component.java:6270)
    at java.awt.Container.processEvent(Container.java:2229)
    at java.awt.Component.dispatchEventImpl(Component.java:4861)
    at java.awt.Container.dispatchEventImpl(Container.java:2287)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
    at java.awt.Container.dispatchEventImpl(Container.java:2273)
    at java.awt.Window.dispatchEventImpl(Window.java:2719)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:723)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:682)
    at java.awt.EventQueue$3.run(EventQueue.java:680)
    at java.security.AccessController.doPrivileged(Native Method)
    at              java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    at java.awt.EventQueue$4.run(EventQueue.java:696)
    at java.awt.EventQueue$4.run(EventQueue.java:694)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:693)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at  java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
Exception in thread "Thread-2" java.lang.NullPointerException
    at Server.run(Server.java:23)
    at java.lang.Thread.run(Thread.java:722)
BUILD SUCCESSFUL (total time: 3 seconds)

My code: private void MainPanelButtonStartActionPerformed(java.awt.event.ActionEvent evt) { 我的代码:private void MainPanelButtonStartActionPerformed(java.awt.event.ActionEvent evt){

    if(!serverCreated) {           
        server = new Server(Integer.parseInt(MainPanelTextPort.getText())); 
        server.setStatusObj(status);
        serverThread = new Thread(server);          
        //SwingUtilities.invokeLater(serverThread); don't know how to use it correctly
        serverThread.start();              
        MainPanelButtonStart.setText("Stop");
        serverCreated = true;
    } else {
        if(!(serverThread.isInterrupted()))
        {
            try {
                server.getServerSocket().close();
            } catch(IOException e) {}

            serverThread.interrupt();
            MainPanelButtonStart.setText("Start");
            serverCreated = false;
        }
    }
}  

The variable status is not instantiated on this line in the Server constructor: Server构造函数中,未在此行上实例化变量status

status.setStatus("Server Created.");

Assuming this represents RUNNING , STOPPED , etc. these can be set internally in the Server class as it will be able to determine the run state of the server itself. 假设它表示RUNNINGSTOPPED等,则可以在Server类中对其进行内部设置,因为它可以确定服务器本身的运行状态。


Regular Threads do not encapsulate correct interaction with the Event Dispatch Thread . 常规Threads不会封装与Event Dispatch Thread正确交互。 SwingWorker would be a better option here. 在这里, SwingWorker将是一个更好的选择。 This post has an example. 这篇文章有一个例子。

Aside: Given Java code conventions , MainPanelTextPort would be represented as mainPanelTextPort . 另外:给定Java代码约定MainPanelTextPort将表示为mainPanelTextPort

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM