美好的一天! 我开发程序客户端 - 服务器并遇到一个问题,我真的不知道如何解决它。
所以,我的按钮很少。当按钮单击然后信息发送到服务器,服务器执行一些工作并发送结果。按钮的监听器接收该然后调用必须在屏幕上绘制结果的其他类的方法。
所以,这是问题所在。服务器向我发送的结果很少,程序必须立即绘制。但它没有那样做!它等待所有消息都会到来,然后才会得出结果。
所以我想知道如何在屏幕上立即绘制结果!
代码: Button的听众:
public class ShowFrame extends JFrame
{
startButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
try
{
messageToServer.println("Start");
while( true )
{
fserver = answerOfServer.readLine(); //Get result from server
if ( fserver.equals("Finish") )
{
break;
}
if( fserver.equals("Busy 1") )
{
ShowFrame.this.stuff.setBusy( 1 );
}
if( fserver.equals("Busy 2") )
{
ShowFrame.this.stuff.setBusy( 2 );
}
//...Same code
}
} catch (IOException ex) {
Logger.getLogger(ShowFrame.class.getName()).log(Level.SEVERE, null, ex);
}
DrawStuff stuff = new DrawStuff();
//...
}
在屏幕上绘制结果的类:
public class DrawStuff extends JComponent
{
public DrawStuff()
{
s1 = false;
s2 = false;
s3 = false;
s4_1 = false;
s4_2 = false;
s4_3 = false;
}
@Override
public void paintComponent( Graphics g )
{
Graphics2D g2 = (Graphics2D) g;
//...
if ( s1 )
{
g2.draw(line1_of_P1);
g2.draw(line2_of_P1);
}
//...
}
public void setBusy( int i ) //If such id found then figure will be drawn by prog.
{
if ( i == 1 )
{
s1 = true;
}
else if ( i == 2 )
{
s2 = true;
}
else if ( i == 3 )
{
s3 = true;
}
else if ( i == 4 )
{
s4_1 = true;
}
else if ( i == 5 )
{
s4_2 = true;
}
else if ( i == 6 )
{
s4_3 = true;
}
this.repaint(); //DOESN'T WORK AS IT MUST!
}
//...
}
答案 0 :(得分:10)
您在事件派发线程中执行读取并且它不好。你应该在单独的线程中执行它(因为它是长时间运行的任务)。见http://download.oracle.com/javase/tutorial/uiswing/concurrency/index.html
答案 1 :(得分:1)
您需要在单独的线程中执行实际操作,以便事件调度线程可以继续运行(需要运行它来绘制屏幕)。您可以使用以下命令创建并启动新线程:
Thread newThread = new Thread(new Runnable() {
@Override
public void run() {
// put your actions to perform in here
}});
newThread.start();
在你的动作监听器中调用它。