gpt4 book ai didi

Java:我无法多次运行 JTextArea?

转载 作者:行者123 更新时间:2023-12-02 07:07:11 24 4
gpt4 key购买 nike

大家好,欢迎大家,这是我的第一个问题,所以我希望这是一个好的问题。我在探索 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 覆盖旧的 JTextArea,并对每个数字执行此操作,直到达到 100 .我认为我使用了错误类型的 JComponent,但这就是我在这里的原因。因此,如果有人能给我提示或解决方案,我将不胜感激。

最佳答案

欢迎阻塞事件调度线程。

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

}

}

}

或者 Swing 计时器

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

关于Java:我无法多次运行 JTextArea?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15957845/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com