下面的程序,基本上调用JFrame的frame.repaint()来动态填充框架内部。 在同一行上,我希望框架有2个标签(West& East),并且标签会动态变化。 我尝试了很多东西,例如Jlabel label.repaint(),label.removeAll()等,但它不起作用。我已经离开了代码,干净,以便你可以填写......
JFrame frame=new JFrame();
frame.setSize(512, 512);
frame.add(image1);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
start_sum=0;
while(true)
{
frame.repaint();
try {
Thread.sleep(sleep_for_each_rotation);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
start_sum+=radian/divide_size; //Some calculation stuff
if(start_sum>=360)
start_sum=0;
}
答案 0 :(得分:2)
从代码的外观来看,您正在阻止事件调度线程(EDT)。
EDT负责(除其他事项外)处理重绘事件。这意味着如果您阻止EDT,则不能重新绘制任何内容。
您遇到的另一个问题是,除了EDT之外,您不应该从任何线程创建或修改任何UI组件。
请查看Concurrency in Swing了解详情。
以下示例仅使用javax.swing.Timer
,但从事物的声音中,您可能会发现Swing Worker更有用
public class TestLabelAnimation {
public static void main(String[] args) {
new TestLabelAnimation();
}
public TestLabelAnimation() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private JLabel left;
private JLabel right;
public TestPane() {
setLayout(new BorderLayout());
left = new JLabel("0");
right = new JLabel("0");
add(left, BorderLayout.WEST);
add(right, BorderLayout.EAST);
Timer timer = new Timer(250, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
left.setText(Integer.toString((int)Math.round(Math.random() * 100)));
right.setText(Integer.toString((int)Math.round(Math.random() * 100)));
}
});
timer.setRepeats(true);
timer.setCoalesce(true);
timer.start();
}
}
}
答案 1 :(得分:-1)
只需使用JLabel.setText (String)
方法,如下例所示:
public static void main (String[] args) throws Exception {
final JLabel label = new JLabel (String.valueOf (System.currentTimeMillis()));
JFrame frame = new JFrame ();
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout (new BorderLayout ());
frame.getContentPane().add (label, BorderLayout.CENTER);
frame.pack ();
frame.setVisible(true);
while (true)
{
final String newText = String.valueOf (System.currentTimeMillis ());
SwingUtilities.invokeLater (new Runnable ()
{
@Override
public void run() {
label.setText (newText);
}
});
Thread.sleep (100L);
}
}