2013-04-11 48 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