[英]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. 假设它表示
RUNNING
, STOPPED
等,则可以在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.