2013-04-11 72 views
0

你好,欢迎大家,这是我的第一个问题,所以我希望它是一个好问题。我正在探索swing API,并且遇到了一个突然出现在我脑海中的问题。我基本上是问我自己,如果我可以建立一个程序,可以使用while()循环,显示多个JTextArea中的一样你可以在控制台这样的:Java:我无法多次运行JTextArea?

while(x<100){ 
    System.out.println("This is the number: " + x) 
    x++; 
} 

我想这在JFrame中输入代码在这里打印,但我似乎无法弄清楚如何。我试图使用JTextArea,但我真的不认为这是正确的方法。我尝试过标签,但这根本不起作用。这是源代码。

import javax.swing.*; 
import java.awt.BorderLayout; 
import java.awt.Container; 

public class MainFrame extends JFrame{ 

    public static int x=0; 
    public static int y = 0; 
    MainFrame(String title){ 
     super(title); 
     // Set Layout 
     setLayout(new BorderLayout()); 

     while(x<100){ 
      y++; 
      x++; 
      System.out.println(x); 
      Container pane= getContentPane(); 
      JTextArea x = new TextArea("Wateva" + y); 
      JButton button= new JButton("Wateva man"); 
      pane.add(button, BorderLayout.SOUTH); 
      pane.add(x); 
     } 
    } 
} 

在控制台x显示每增加1,这意味着循环正确运行。我可以作为初学者程序员的唯一解释是它创建了JTextArea,但它意识到x已被更新,因此它覆盖了旧的JTextArea,并且它为每个数字执行此操作,直到达到100 。我想我使用的是错误类型的JComponent,但这就是我来到这里的原因。所以,如果任何人都可以给我提示或解决如何解决,这将非常感激。

+3

您的代码根本不涉及JTextArea ... – 2013-04-11 20:04:24

+0

您正在将所有组件添加到同一个地方...也许它们正在彼此铺设? – HectorLector 2013-04-11 20:09:57

+0

我的不好...我复制并粘贴了我正在试验的代码。我更新了它,它现在应该是一个JTextArea。 – 2013-04-11 20:25:13

回答

2

欢迎屏蔽事件调度线程。

除了别的以外,EDT还负责处理重新绘制请求。你不应该进行阻断EDT任何操作,相反,你应该使用像一个SwingWorker

看看Concurrency in Swing更多细节

与例如更新

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.util.List; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.SwingWorker; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class TestTextArea03 { 

    public static void main(String[] args) { 
     new TestTextArea03(); 
    } 

    public TestTextArea03() { 
     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 JTextArea textArea; 

     private TestPane() { 
      setLayout(new BorderLayout()); 
      textArea = new JTextArea(10, 10); 
      add(new JScrollPane(textArea)); 

      new TextWorker().execute(); 
     } 

     public class TextWorker extends SwingWorker<Void, String> { 

      @Override 
      protected void process(List<String> chunks) { 
       for (String text : chunks) { 
        textArea.append(text + "\n"); 
       } 
      } 

      @Override 
      protected Void doInBackground() throws Exception { 
       Thread.sleep(1000); 
       for (int x = 0; x < 10; x++) { 
        publish(String.valueOf(x)); 
        Thread.sleep(250); 
       } 
       return null; 
      } 

     } 

    } 

} 

或者摆动计时器

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.List; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.SwingWorker; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class TestTextArea03 { 

    public static void main(String[] args) { 
     new TestTextArea03(); 
    } 

    public TestTextArea03() { 
     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 JTextArea textArea; 
     private int x; 

     private TestPane() { 
      setLayout(new BorderLayout()); 
      textArea = new JTextArea(10, 10); 
      add(new JScrollPane(textArea)); 

      Timer timer = new Timer(250, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        x++; 
        textArea.append(String.valueOf(x) + "\n"); 
       } 
      }); 
      timer.setRepeats(true); 
      timer.setCoalesce(true); 
      timer.start(); 
     }   
    }  
} 
+1

或'javax.swing.Timer',用于[示例](http://stackoverflow.com/a/5529043/230513)。 – trashgod 2013-04-11 20:12:29

+0

@Lonenebula老实说,谁知道,但概念/要求是相同的:P – MadProgrammer 2013-04-11 20:21:46

+0

谢谢你的快速回答。当我在看挥杆时,我了解了美国东部时间。我了解到,你不应该在其中执行过于复杂的操作。我的代码中有哪部分完全“封锁”了EDT。你究竟是什么意思的“封锁”? – 2013-04-11 20:24:17