2012-03-25 9 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(); 

    } 
} 

Vedo tale effetto quando questo programma è perfomed. È possibile eliminarlo (gli zeri devono essere invece punti)?JLabel dipinge punti

enter image description here

+2

Questo è fondamentalmente perché il testo è traboccante 'limiti di JLabel'. –

+0

+1 per [sscce] (http://sscce.org/). – trashgod

risposta

3

mio codice in risposta è unico esempio,

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

+1 per 'invokeLater()', e una buona illustrazione del perché 'javax.swing.Timer' è così conveniente. – trashgod

+0

@trashgod concordato era +1, ma penso che OP non capisca come funziona il FlowLayout, – mKorbel

+0

@mKorbel Come può l'impatto di flowLayout sul mio problema? Se capisco correttamente la ragione di tale comportamento (strani puntini) è stata chiamata 'setText' all'esterno di EDT ma' setText' non è un metodo thread safe – eXXXXXXXXXXX2

4

Invece di setSize() uso pack() di sfruttare dimensione preferita attentamente calcolato del componente. Avrete anche bisogno di inizializzare l'etichetta:

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

Considera anche javax.swing.Timer invece di un thread separato.

Addendum: convenientemente, ogni Swing Timer condivide un thread in background comune e actionPerformed() viene chiamato nel thread di invio eventi. Un'alternativa è SwingWorker, illustrato here.

+0

Vedere anche [Concurrency in Swing] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/). – trashgod

+0

Dovrei chiamare 'setText()' regolarmente per il mio problema, quindi ho bisogno di un'altra soluzione (il mio codice in questione è solo per esempio) – eXXXXXXXXXXX2