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

    } 
} 

Veo tal efecto cuando se lleva a cabo este programa. ¿Es posible eliminarlo (los ceros deben ser en cambio puntos)?JLabel pinta puntos

enter image description here

+2

Esto es básicamente porque el texto está desbordando los límites del 'JLabel'. –

+0

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

Respuesta

3

mi código de respuesta es único ejemplo,

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 para 'invokeLater()', y una buena ilustración de por qué 'javax.swing.Timer' es muy conveniente. – trashgod

+0

@trashgod estuvo de acuerdo en +1, pero creo que OP no entiende cómo funciona FlowLayout, – mKorbel

+0

@mKorbel ¿Cómo puede afectar FlowLayout a mi problema? Si entiendo correctamente, la razón de tal comportamiento (puntos extraños) fueron las llamadas de 'setText' fuera de EDT, pero' setText' no es seguro para hilos – eXXXXXXXXXXX2

4

En lugar de setSize() uso pack() para tomar ventaja de tamaño preferido cuidadosamente calculada del componente. Usted también necesitará para inicializar la etiqueta:

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

Considera también javax.swing.Timer en lugar de un hilo separado.

Adición: Convenientemente, cada Swing Timer comparte un hilo de fondo común, y se llama al actionPerformed() en el hilo de envío del evento. Una alternativa es SwingWorker, ilustrada here.

+0

Véase también [Concurrencia en Swing] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/). – trashgod

+0

Debería llamar 'setText()' regularmente para mi problema, así que necesito otra solución (mi código en cuestión es solo un ejemplo) – eXXXXXXXXXXX2