我试图创建一个JDialog,它将在JLabel上向用户显示动态消息。 消息应该是从1到10的计数(并且应该每秒更改一个数字)。 事情是,当我调试它时 - 它就在“dia.setVisible(true);”之后停止。 ,除非我关闭JDialog,否则不会继续。 是否有任何可能的方法来修复它? 感谢。
看看代码:
@Override
public void run() {
dia = new JDialog(parentDialog, true);
dia.setLocationRelativeTo(parentFrame);
String text = "Text ";
dia.setSize(300, 150);
jl = new JLabel(text);
dia.getContentPane().add(jl);
dia.setVisible(true);
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(1000);
jl.setText(text + " " + i);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
答案 0 :(得分:3)
不要将Thread.sleep(int)
用于Swing GUI,导致冻结直到Thread.sleep(int)
结束
使用Swing Timer
代替使用Thread.sleep(int)
请勿使用dia.setSize(300, 150)
,了解LayoutManager
的工作原理
答案 1 :(得分:2)
setVisible
是对JDialog的阻止调用。您应该启动另一个Thread并将Runnable
传递给它。 Runnable.run()
方法应该包含你的循环。
答案 2 :(得分:2)
看看这个代码示例,这是在javax.swing.Timer Tutorials的帮助下使用动态文本的正确方法,而不是使用Thread.sleep(...)
thingy,
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DialogExample extends JDialog
{
private Timer timer;
private JLabel changingLabel;
private int count = 0;
private String initialText = "TEXT";
private ActionListener timerAction = new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
count++;
if (count == 10)
timer.stop();
changingLabel.setText(initialText + count);
}
};
private void createDialog()
{
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
setLocationByPlatform(true);
JPanel contentPane = new JPanel();
changingLabel = new JLabel(initialText);
contentPane.add(changingLabel);
add(contentPane);
pack();
setVisible(true);
timer = new Timer(1000, timerAction);
timer.start();
}
public static void main(String... args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
new DialogExample().createDialog();
}
});
}
}
答案 3 :(得分:0)
确保jl
定义为final
:
...
dia.getContentPane().add(jl);
new Thread(new Runnable() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(1000);
jl.setText(text + " " + i);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).run();
dia.setVisible(true);