Java线程后没有UI更新
因此,我在我的JavaSwing项目中遇到了这个问题,我正在制作一个机器人,它自动运行在whileloop中,并输出一个用户可以在textfield中定义的文本 在这里,您可以看到我将文本行添加到我的框架的jlabel中的代码:Java线程后没有UI更新,java,multithreading,swing,frame,windowbuilder,Java,Multithreading,Swing,Frame,Windowbuilder,因此,我在我的JavaSwing项目中遇到了这个问题,我正在制作一个机器人,它自动运行在whileloop中,并输出一个用户可以在textfield中定义的文本 在这里,您可以看到我将文本行添加到我的框架的jlabel中的代码: btnAddTalking = new JButton("Add"); btnAddTalking.setBounds(144, 211, 146, 23); btnAddTalking.addActionListener(new ActionListe
btnAddTalking = new JButton("Add");
btnAddTalking.setBounds(144, 211, 146, 23);
btnAddTalking.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(!txtTalk.getText().equals("")) {
JLabel newLabel = new JLabel(txtTalk.getText());
newLabel.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent arg0) {
frame.remove(newLabel);
frame.repaint();
}
});
newLabel.setHorizontalAlignment(SwingConstants.CENTER);
newLabel.setBounds(159, yLabel, 101, 20);
frame.getContentPane().add(newLabel);
yLabel = yLabel + 20;
frame.getContentPane().setLayout(null);
frame.repaint();
Talk.addTalk(txtTalk.getText());
}
}
});
frame.getContentPane().add(btnAddTalking);
frame.getContentPane().add(lblNewLabel);
frame.getContentPane().add(lblDelayInMs);
之后,我按下以下按钮启动我的机器人:
btnStartTalking = new JButton("Start AutoTalk");
btnStartTalking.setBounds(144, 143, 146, 23);
btnStartTalking.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
int robotDelay = Integer.parseInt(timeTalk.getText());
Talk.action = "start";
robotTalk = txtTalk.getText();
if (rdbtnRed.isSelected() == true) {
robotTalk = "red:" + txtTalk.getText();
} else if (rdbtnFlash.isSelected() == true) {
robotTalk = "flash1:" + txtTalk.getText();
} else if (rdbtnGlow.isSelected() == true) {
robotTalk = "glow1:" + txtTalk.getText();
}
autoTalkStart = new Runnable() {
public void run() {
try {
btnStartTalking.setEnabled(false);
btnStopTalking.setEnabled(true);
btnAddTalking.setEnabled(false);
Talk test = new Talk(robotDelay);
} catch (AWTException | InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
new Thread(autoTalkStart).start();
}
});
通过该按钮,我启动一个线程,该线程通过输出字符串的代码运行。但是在我运行该线程之后,我的框架不再显示新添加的jlabel,而您在通过单击btnStartTalking按钮运行线程之后,通过单击btnAddTalking按钮添加的jlabel!所以,我的问题是:现在有人知道这是怎么可能的吗(为什么我的UI在我运行线程后不再更新)
格里茨
雅诺夫
在这里,您可以看到这两个类(类1)的全部代码:
第2类:
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.io.IOException;
import java.util.ArrayList;
public class Talk extends AutoTalker {
Robot robot = new Robot();
public static String action;
public static ArrayList<String> Talks = new ArrayList<String>();
public Talk(int wait) throws AWTException, InterruptedException {
robot.delay(5000);
while(action == "start") {
for(int i = 0; i < Talks.size();i++) {
String text = Talks.get(i);
type(text);
robot.delay(wait);
}
}
}
public static void addTalk(String text) {
Talks.add(text);
}
private void type(String s)
{
for (int i = 0; i < s.length(); i++){
char c = s.charAt(i);
switch(c) {
case '!':
robot.keyPress(KeyEvent.VK_SHIFT);
robot.keyPress(KeyEvent.VK_1);
robot.keyRelease(KeyEvent.VK_SHIFT);
robot.keyRelease(KeyEvent.VK_1);
break;
case ':':
robot.keyPress(KeyEvent.VK_SHIFT);
robot.keyPress(KeyEvent.VK_SEMICOLON);
robot.keyRelease(KeyEvent.VK_SEMICOLON);
robot.keyRelease(KeyEvent.VK_SHIFT);
break;
default:
robot.keyPress(Character.toUpperCase(c));
break;
}
robot.delay(10);
}
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);
robot.delay(10);
}
}
import java.awt.AWTException;
导入java.awt.Robot;
导入java.awt.event.InputEvent;
导入java.awt.event.KeyEvent;
导入java.io.IOException;
导入java.util.ArrayList;
公共类谈话扩展自动通话器{
机器人=新机器人();
公共静态字符串动作;
public static ArrayList Talks=new ArrayList();
public Talk(int wait)抛出AWTException、InterruptedException{
机器人延迟(5000);
while(action==“start”){
对于(inti=0;i
改用
invalidate();
validate();
您在问题文本中提到了JavaFX,但这不是JavaFX代码。另外,不建议使用
com.sun.glass
类,因为它们不是公开导出的JRE API的一部分,它们的接口可能会在将来的Java版本中更改或删除。感谢您的回复。我以为这是JavaFX代码,但我可能错了:)。你知道我到底做错了什么吗?我不是Swing开发方面的专家,所以我不会回答这个问题。我编辑了您的问题,删除了JavaFX引用并添加了一个Swing标记,这可能会帮助您找到一些愿意查看它的Swing专家。如果您提供一个(注意,它必须是最小的和完整的,因为它可以被编译和执行以运行),而不是转储整个代码,您可能会得到更好的响应机会。另外,用正确的缩进和删除无用的空白来格式化代码。
invalidate();
validate();