繁体   English   中英

为什么sleep方法会影响/不显示面板上更新的JTextArea?

[英]Why is the sleep method affecting/not showing my updated JTextArea on the panel?

我有一个带有各种面板的窗口。 在一个面板上,我有一个名为dogTalk的JTextArea,用于更新其文本。 在用户单击按钮后,我希望文本在setText中添加我在下面提到的内容。

我使用了sleep方法,以便用户可以阅读我的更新文本,并且窗口可以在4秒钟内自动关闭。 (我不希望用户能够在关闭时关闭窗口,因此我没有使用Jframe.EXIT_ON_CLOSE,而是使用了JFrame.DO_NOTHING_ON_CLOSE,并借助sleep和system.ext(0)进行了自动关闭。 )

但是,我注意到sleep方法不允许dogTalk进行更新。 不过,它会打印出“我们正在工作”的信息,所以我想这是窗户的问题吗? 我知道睡眠是导致问题的原因,而不是代码中的其他问题,因为当我注释掉sleep和system.exit(0)并测试我的if语句是否正在执行时,我注意到JTextArea确实用我的语句进行了更新! 请你帮助我好吗?

如果(e.getActionCommand()。equals(“ buybone”)){

        System.out.println("We're working");
        dogTalk.setText(dogTalk.getText() + "\nWow bone very wow much thanks bye.");
        try
        {  
            TimeUnit.SECONDS.sleep(4);
        }
        catch ( InterruptedException e1 )
        {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

       System.exit(0);

}

与其调用System.exit ,不如让应用程序正常退出。 当没有非守护进程线程仍然存在时,应用程序终止。 守护程序只是一个标志,用于确定如果该线程仍在运行,则JVM是否应终止。 如果非守护程序线程正在运行,JVM仍将终止。

话虽如此,问题在于您正在事件调度线程上调用sleep

EDT处理Swing和AWT组件的所有更新和渲染,并执行事件侦听器中指定的行为(例如ActionListener#actionPerformed(ActionEvent) )。 如果您导致它阻塞(通过休眠或其他形式的阻塞),它将无法处理更新和渲染。 调用setText ,EDT需要能够调整文本。 您可以通过强迫其进入睡眠状态来防止这种情况发生。

怎么修

产生一个新线程,让它等待4秒钟,然后处置它:

Java 8+

public void actionPerformed(ActionEvent e) {
     dogTalk.setText(...);
     new Thread(() -> {
          TimeUnit.SECONDS.sleep(4);
          frame.dispose();
     }).start();
}

在Java 8之前

public void actionPerformed(ActionEvent e) {
    dogTalk.setText(...);
    new Thread(new Runnable() {
        public void run() {
            TimeUnit.SECONDS.sleep(4);
            frame.dispose();
        }
    }).start();
}

就在dogTalk.setText(dogTalk.getText() + "\\nWow bone very wow much thanks bye."); 输入以下代码:

dogTalk.revalidate();
dogTalk.repaint();

以下代码运行良好,我使用了工作正常的Frame.update函数。 在您的情况下,您必须更新面板

           dogTalk.setText(dogTalk.getText() + "\nWow bone very wow much thanks bye.");
        frame.update(getGraphics());
        try
        {  
            TimeUnit.SECONDS.sleep(4);
        }
        catch ( InterruptedException e1 )
        {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        System.exit(0);

这是我的完整程序

public class TestSleep extends JFrame implements ActionListener{

JTextArea are=new JTextArea("asdjkfh");

JButton button=new JButton("Submit done");

public TestSleep()
{
    are.setBounds(20, 20, 30, 10);
    button.setBounds(10, 50, 20, 20);
    this.add(are);
    this.add(button);
    button.addActionListener(this);

}
public static void main(String[] args)
{
    TestSleep sleep=new TestSleep();
    sleep.setLayout(new GridLayout());
    sleep.setVisible(true);
    sleep.setBounds(10, 10, 500, 280);
}
@Override
public void actionPerformed(ActionEvent e)
{
        System.out.println("Working");
        are.setText(are.getText() + "\nWow bone very wow much thanks bye.");
        this.update(getGraphics());
        try
        {  
            TimeUnit.SECONDS.sleep(4);
        }
        catch ( InterruptedException e1 )
        {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        System.exit(0);

}   

}

暂无
暂无

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

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