我有一个有各种面板的窗口。在一个面板上,我有一个名为dogTalk的JTextArea,我在其中更新了它的文本。 用户点击按钮后,我希望文本在setText中添加我在下面提到的内容。
我使用了sleep方法,以便用户可以读取我更新的文本,窗口可以在4秒内自动关闭。 (我不希望用户能够在关闭时关闭窗口,因此我没有使用Jframe.EXIT_ON_CLOSE但是使用了JFrame.DO_NOTHING_ON_CLOSE并在睡眠和系统的帮助下使用了我的自动关闭功能。分机(0))
但是,我注意到sleep方法不允许dogTalk更新。它打印出来"我们正在工作"但是,我猜这是窗户的问题? 我知道睡眠导致问题,而不是我的代码中的其他东西,因为当我注释掉sleep和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);
}
答案 0 :(得分: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();
}
答案 1 :(得分:0)
恰好在dogTalk.setText(dogTalk.getText() + "\nWow bone very wow much thanks bye.");
之后输入以下代码:
dogTalk.revalidate();
dogTalk.repaint();
答案 2 :(得分: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);
}
}