0

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

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

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

if (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);

}

4

3 回答 3

1

与其调用 ,不如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();
}
于 2015-05-21T19:42:13.427 回答
0

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

dogTalk.revalidate();
dogTalk.repaint();
于 2015-05-21T05:52:20.310 回答
0

以下代码运行良好,我使用了 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);

}   

}

于 2015-05-21T07:00:45.753 回答