无法立即在Java中绘制数字

Exi*_*iRe 1 java draw

美好的一天!我开发程序客户端 - 服务器并遇到一个问题,我真的不知道如何解决它.

所以,我有几个按钮.当按钮单击然后信息发送到服务器,服务器执行一些工作并发送结果.按钮的监听器接收该然后调用必须在屏幕上绘制结果的其他类的方法.

所以,这是问题所在.服务器向我发送的结果很少,程序必须立即绘制.但它没有那样做!它等待所有消息都会到来,然后才会得出结果.

所以我想知道如何在屏幕上立即绘制结果!

代码: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();
    //...
}
Run Code Online (Sandbox Code Playgroud)

在屏幕上绘制结果的类:

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!

}
//...
}
Run Code Online (Sandbox Code Playgroud)

Nik*_*zov 10

你在事件派遣线程中执行读取并且它不好.你应该在单独的线程中执行它(因为它是长时间运行的任务).请参阅http://download.oracle.com/javase/tutorial/uiswing/concurrency/index.html