2012-03-25 85 views
8
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(); 

    } 
} 

我看到这样的效果,当这个程序执行。是否有可能消除它(零点必须是点)?JLabel油漆点

enter image description here

+2

这基本上是因为你的文本溢出'JLabel'的边界。 – 2012-03-25 18:50:56

+0

+1 [sscce](http://sscce.org/)。 – trashgod 2012-03-25 19:29:21

回答

3

我在回答代码示例只,

import java.awt.EventQueue; 
import java.awt.GridLayout; 
import javax.swing.*; 

public class Demo { 

    private JFrame jf; 
    private JLabel[] labels; 
    private JPanel panel; 

    public Demo() { 
     labels = new JLabel[10]; 
     Box vbox = Box.createVerticalBox(); 
     for (int i = 0; i < 10; i++) { 
      labels[i] = new JLabel(); 
      labels[i].setText("10000000000000000000000000000000000000"); 
      vbox.add(labels[i]); 
     } 
     panel = new JPanel(); 
     panel.setLayout(new GridLayout()); 
     panel.add(vbox); 
     jf = new JFrame(); 
     jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jf.add(panel); 
     jf.pack(); 
     jf.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new DemoRunnable()); 
    } 

    public void updateState() { 
     for (final JLabel l : labels) { 
      if (Math.random() > 0.5) { 
       EventQueue.invokeLater(new Runnable() { 

        @Override 
        public void run() { 
         l.setText("777777777777777777777777777777777777"); 
        } 
       }); 
      } else { 
       EventQueue.invokeLater(new Runnable() { 

        @Override 
        public void run() { 
         l.setText("10000000000000000000000000000000000000"); 
        } 
       }); 
      } 
     } 
    } 
} 

class DemoRunnable implements Runnable { 

    private 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(250); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
        demo.updateState(); 
       } 
      } 
     }); 
     t.start(); 
    } 
} 
+0

对于invokeLater(),+1以及为什么'javax.swing.Timer'非常方便。 – trashgod 2012-03-25 20:40:15

+0

@trashgod同意为+1,但我认为OP不明白FlowLayout的工作方式, – mKorbel 2012-03-25 20:51:50

+0

@mKorbel flowLayout如何影响我的问题?如果我正确理解这种行为的原因(奇怪的点)是在EDT之外调用'setText',但'setText'不是线程安全的方法 – eXXXXXXXXXXX2 2012-03-26 06:25:02

4

代替setSize()使用pack()采取组件的仔细计算首选大小的优势。您还需要初始化您的标签:

labels[i] = new JLabel("10000000000000000000000000000000000000"); 

还要考虑javax.swing.Timer,而不是一个单独的线程。

附录:方便的是,每个Swing Timer共享一个公用后台线程,并且在事件分派线程上调用actionPerformed()。替代方案是SwingWorker,图示为here

+0

另请参见[并发中的摆动](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)。 – trashgod 2012-03-25 18:57:36

+0

我应该定期为我的问题调用setText(),所以我需要另一种解决方案(我的代码只是示例) – eXXXXXXXXXXX2 2012-03-25 19:17:14