gpt4 book ai didi

java - 在迭代中更新 textArea

转载 作者:行者123 更新时间:2023-11-29 03:16:45 25 4
gpt4 key购买 nike

我有一个有趣的项目,我需要在迭代中更改文本区域的内容。

它是一个角色,一个“弹丸”,通过一根绳子移动。字符串被更新并发送到迭代内的 textArea,当角色到达墙壁时迭代停止。

但我的 textArea 仅在我离开迭代时更新(视觉上)。当我在其中时,textArea 卡住,就好像它在等待迭代一样,即使其中有 Thread.sleep()。

我做了一个 MVCE 来举例说明下面的问题,注意文本只在迭代后显示,我希望它在每一步都适用。

public class GUIProblem extends JFrame{
public GUIProblem() {
setSize(640, 480);

JPanel panel = new JPanel();
getContentPane().add(panel, BorderLayout.CENTER);

final JTextArea textArea = new JTextArea();
textArea.setRows(10);
textArea.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent arg0) {
int i = 0;
while(i < 10){
textArea.setText("this text only appears after the iteration, i want it to appear in each step of the iteration!");
System.out.println("iterating..." + i++);
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
textArea.setColumns(30);
panel.add(textArea);
}

/**
*
*/
private static final long serialVersionUID = 1L;

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
GUIProblem gui = new GUIProblem( );
gui.setVisible(true);
}
});
JOptionPane.showMessageDialog(null, "Click the textArea!");
}
}

最佳答案

您遇到了一个典型的 Swing 线程问题,您在迭代及其 Thread.sleep() 调用中停止了 Swing 事件线程。解决方案与类似问题相同:使用 Swing Timer或后台线程,例如 SwingWorker。在您的情况下,请使用计时器。

例如,由于您发布了 MCVE

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class GUIProblem extends JFrame {
public GUIProblem() {
// setSize(640, 480);

JPanel panel = new JPanel();
getContentPane().add(panel, BorderLayout.CENTER);

final JTextArea textArea = new JTextArea(20, 50);
textArea.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent mEvt) {
int i = 0;
int timerDelay = 200;
new Timer(timerDelay, new ActionListener() {
int count = 0;
private final int MAX_COUNT = 10;
@Override
public void actionPerformed(ActionEvent e) {
if (count >= MAX_COUNT) {
((Timer) e.getSource()).stop(); // stop the timer
return;
}
textArea.append("Count is: " + count + "\n");
count++;
}
}).start();
}
});

panel.add(new JScrollPane(textArea));
}

/**
*
*/
private static final long serialVersionUID = 1L;

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
GUIProblem gui = new GUIProblem();
gui.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
gui.pack();
gui.setLocationRelativeTo(null);
gui.setVisible(true);
}
});
JOptionPane.showMessageDialog(null, "Click the textArea!");
}
}

关于java - 在迭代中更新 textArea,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26109577/

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