import java.awt.Graphics;
import javax.swing.*;
public class Demo
{
JFrame jf;
JLabel[] labels;
JPanel panel;
public Demo()
{
jf = new JFrame();
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
labels = new JLabel[10];
Box vbox = Box.createVerticalBox();
for (int i = 0; i < 10; i++)
{
labels[i] = new JLabel();
vbox.add(labels[i]);
}
panel = new JPanel();
panel.add(vbox);
jf.add(panel);
jf.setSize(300, 250);
jf.setVisible(true);
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new DemoRunnable());
}
public void updateState()
{
for (JLabel l : labels)
{
if (Math.random() > 0.5)
l.setText("777777777777777777777777777777777777");
else
l.setText("10000000000000000000000000000000000000");
}
}
}
class DemoRunnable implements Runnable
{
Demo demo;
DemoRunnable()
{
this.demo = new Demo();
}
@Override
public void run()
{
Thread t = new Thread(new Runnable()
{
@Override
public void run()
{
while (true)
{
try
{
Thread.sleep(0);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
demo.updateState();
}
}
});
t.start();
}
}
我在执行这个程序时看到了这样的效果。是否可以消除它(必须用零代替点)?
最佳答案
使用 pack()
代替 setSize()
来利用组件精心计算的首选大小。您还需要初始化标签:
labels[i] = new JLabel("10000000000000000000000000000000000000");
同时考虑 javax.swing.Timer
而不是单独的线程。
附录:方便的是,每个 Swing Timer
共享一个公共(public)后台线程,actionPerformed()
在事件调度线程上调用。另一种选择是 SwingWorker
,如图 here .
关于java - JLabel 绘制点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9862861/