当前位置: 首页 > 面试题库 >

Java:我不能多次运行JTextArea吗?

汝志
2023-03-14
问题内容

您好,欢迎大家,这是我的第一个问题,我希望这是一个好问题。我正在探索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中的并发以了解更多详细信息

更新了示例

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();
        }        
    }    
}


 类似资料:
  • 我已经从Dockerfile中构建了一个名为Centos+ssh的基本映像。在Centos+ssh的Dockerfile中,我使用CMD来运行ssh服务。 然后我想构建一个映像,运行其他名为rabbitmq的服务,DockerFile: 若要启动rabbitmq容器,请运行: 但是ssh服务不工作,它感测RabbitMQ的Dockerfile CMD覆盖Centos的CMD。 CMD如何在dock

  • 我有一个具有固定大小的,并且允许换行和单词。 有人想办法弄到它吗?

  • 我在jupyter中,选择kernel scala 2.11,当我放置返回数据时运行平稳: 然后,当我执行时,它返回

  • 我正在将代码从Processing移植到Netbeans Java。我在运行多个java类时遇到问题。我的代码分为14个类,其中我的主要类仅包括这组代码: 无论项目何时运行,都只会弹出一个灰色背景的小屏幕,然而,仅此而已。在我看来,它无法读取其他13个类的所有代码。有什么想法吗?

  • 我之前已经实现过几次Spring批处理,但它设计为一天只运行一次。 现在,我有了一个新的要求,每当记录插入表中时,我都需要开始批处理。当插入新记录时,它将启动作业,批处理将生成PDF并将其保存在存储库中,并向用户发送邮件。 我不知道如何设计一天运行多次的spring批处理,或者在这种情况下使用spring批处理是否正确。有人能解释一下吗。谢谢