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

    } 
} 

इस कार्यक्रम को प्रभावित होने पर मुझे ऐसा प्रभाव दिखाई देता है। क्या इसे खत्म करना संभव है (शून्य के बजाय शून्य होना चाहिए)?जेएलएबल पेंट्स डॉट

enter image description here

+2

यह मूलतः है, क्योंकि अपने पाठ 'बह निकला है JLabel' की सीमा। [एसएससीई] के लिए –

+0

+1 (http://sscce.org/)। – trashgod

उत्तर

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

+1' invokeLater() 'के लिए +1, और' javax.swing.Timer' का एक अच्छा उदाहरण ' इतना सुविधाजनक है। – trashgod

+0

@trashgod सहमत था +1 था, लेकिन मुझे लगता है कि ओपी समझ में नहीं आता कि FlowLayout कैसे काम करता है, – mKorbel

+0

@mKorbel प्रवाह कैसे कर सकता है मेरी समस्या पर प्रभाव? अगर मैं इस तरह के व्यवहार (अजीब बिंदुओं) के लिए सही ढंग से कारण समझता हूं तो ईडीटी के बाहर 'सेटटेक्स्ट' की कॉल थी, लेकिन 'सेटटेक्स्ट' थ्रेड सुरक्षित विधि नहीं है – eXXXXXXXXXXX2

4

के बजाय setSize() उपयोग pack() घटक के ध्यान से गणना की पसंद किया आकार का लाभ लेने के।

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

इसके अलावा एक अलग थ्रेड के बजाय javax.swing.Timer पर विचार: आप अपने लेबल प्रारंभ करने की आवश्यकता होगी।

अतिरिक्त: प्रत्येक स्विंग Timer एक सामान्य पृष्ठभूमि धागा साझा करता है, और actionPerformed() ईवेंट प्रेषण धागे पर कॉल किया जाता है। एक विकल्प SwingWorker है, सचित्र here

+0

यह भी देखें [स्विंग में Concurrency] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)। – trashgod

+0

मुझे अपनी समस्या के लिए नियमित रूप से 'setText() 'कॉल करना चाहिए, इसलिए मुझे एक अन्य समाधान की आवश्यकता है (प्रश्न में मेरा कोड केवल उदाहरण है) – eXXXXXXXXXXX2

संबंधित मुद्दे