Java:我不能多次运行JTextArea?

时间:2013-04-11 20:02:59

标签: java swing

您好,欢迎大家,这是我的第一个问题,所以我希望它是一个好问题。我正在探索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类型,但这就是我在这里的原因。因此,如果有人可以给我提示或解决方法,我将非常感激。

1 个答案:

答案 0 :(得分: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();
        }        
    }    
}