Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java线程后没有UI更新_Java_Multithreading_Swing_Frame_Windowbuilder - Fatal编程技术网

Java线程后没有UI更新

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

因此,我在我的JavaSwing项目中遇到了这个问题,我正在制作一个机器人,它自动运行在whileloop中,并输出一个用户可以在textfield中定义的文本

在这里,您可以看到我将文本行添加到我的框架的jlabel中的代码:

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