Java:我不能多次运行JTextArea?

您好,欢迎大家,这是我的第一个问题,所以我希望这是一个很好的问题。 我正在探索swing API,我遇到了一个突然出现的问题。 我基本上问自己,我是否可以构建一个可以使用while()循环的程序,并在控制台中显示多个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类型,但这就是我在这里的原因。 因此,如果有人能给我提示或解决方法如何解决,这将非常感激。

欢迎阻止事件调度线程。

除其他事项外,EDT负责处理重新绘制请求。 您永远不应该执行阻止EDT的任何操作,而应该使用类似SwingWorker

有关更多详细信息,请参阅Swing中的Concurrency

更新了示例

 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 { @Override protected void process(List 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(); } } }