2013-02-13 146 views
0

下面的程序基本上调用JFrame的frame.repaint()来动态填充框架。 在同一行上,我想要有2个标签(West & East),并且标签动态变化。 我已经尝试了lotta的东西,Jlabel label.repaint(),label.removeAll()等,但它不起作用。我已经离开了代码,干净,这样就可以填补...如何动态更改JLabel的内容

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

我没有看到任何'JLabel'中的代码。 downvote – 2013-02-13 10:19:47

+1

正如我所提到的,我已经尝试过Jlabel并且失败了......所以我已经清理了所有Jlabel varibales – 2013-02-13 10:22:32

+0

那么,如果您清理了所有JLabel,那么问题是什么? – 2013-02-13 10:28:55

回答

-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); 
    } 
} 
+0

或'label.setIcon(icon);' – 2013-02-13 10:20:56

+1

因此,您的示例在EDT之外创建UI,只是运气好,可以运行。这是不该做的一个很好的例子。看看[初始线程](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html) – MadProgrammer 2013-02-13 10:31:29

+0

agreeeeeeeeeeeeeeeeed – mKorbel 2013-02-13 15:40:18

2

从你的代码看起来,你是阻止事件调度线程(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(); 

     } 

    } 

} 
+0

请问为什么'timer.setCoalesce(true);',看到很多次最后一次 – mKorbel 2013-02-13 15:38:54

+1

@mkorbel据我所知,coalesce意味着如果计时器发现自己有多个事件同时触发(因为某种原因),它们将被合并成一个事件,而不是一个事件紧密时间事件的数量。对我来说,确保我不会使EDT不必要地饱和 – MadProgrammer 2013-02-13 19:28:29