2017-02-21 104 views
0

所以,我在我的Java Swing项目中遇到了这个问题,我正在制作一个bot,它会自动运行while循环并输出用户可以在文本字段中定义的文本。Java之后没有UI更新线程

在这里你可以看到我的代码添加一个TextLine到一个JLabel到我的框架:

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




     } 
    }); 

通过该按钮:

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

之后,我按下面的按钮,开始我的机器人我开始一个线程,它贯穿输出字符串的代码。但是在运行该线程之后,我的框架不会再显示新添加的jlabel,而是通过单击btnStartTalking按钮运行线程后单击btnAddTalking按钮来添加的!所以,我的问题是:现在是否有人会这样做(为什么我的UI在运行线程后不再更新)?

格尔茨,

Jarnov

在这里你可以看到我的整个代码两班(1级):

import java.awt.EventQueue; 
import java.awt.event.InputEvent; 

import javax.swing.JFrame; 
import javax.swing.JTextField; 

import com.sun.glass.events.KeyEvent; 
import com.sun.glass.ui.Robot; 

import java.awt.AWTException; 
import java.awt.BorderLayout; 
import javax.swing.BoxLayout; 
import javax.swing.ButtonGroup; 
import javax.swing.ButtonModel; 
import javax.swing.JButton; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.JLabel; 
import javax.swing.GroupLayout; 
import javax.swing.ImageIcon; 
import javax.swing.GroupLayout.Alignment; 
import javax.swing.SpringLayout; 
import javax.swing.SwingConstants; 
import javax.swing.JRadioButton; 

public class AutoTalker { 

private static JFrame frame; 
private JTextField txtTalk; 
private JTextField timeTalk; 
public String robotTalk; 
private JButton btnStopTalking; 
private JButton btnAddTalking; 
private JButton btnStartTalking; 
private int yLabel = 266; 
private Runnable autoTalkStart; 


/** 
* Launch the application. 
*/ 


public static void NewFrame() { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       AutoTalker window = new AutoTalker(); 
       window.frame.setVisible(true); 
       frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

/** 
* Create the application. 
* @return 
*/ 


public AutoTalker() { 
    initialize(); 
} 




/** 
* Initialize the contents of the frame. 
*/ 
private void initialize() { 



    frame = new JFrame(); 
    frame.setBounds(100, 100, 450, 415); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setTitle("AutoTalker"); 
    frame.getContentPane().setLayout(null); 


    JRadioButton rdbtnGlow = new JRadioButton("Glow"); 
    rdbtnGlow.setBounds(6, 113, 64, 23); 
    rdbtnGlow.setActionCommand("glow"); 
    frame.getContentPane().add(rdbtnGlow); 


    JRadioButton rdbtnFlash = new JRadioButton("Flash"); 
    rdbtnFlash.setBounds(182, 113, 69, 23); 
    rdbtnGlow.setActionCommand("flash"); 
    frame.getContentPane().add(rdbtnFlash); 


    JRadioButton rdbtnRed = new JRadioButton("Red"); 
    rdbtnRed.setBounds(364, 113, 64, 23); 
    rdbtnGlow.setActionCommand("red"); 
    frame.getContentPane().add(rdbtnRed); 


    final ButtonGroup rdbtnPressed = new ButtonGroup(); 
    rdbtnPressed.add(rdbtnRed); 
    rdbtnPressed.add(rdbtnFlash); 
    rdbtnPressed.add(rdbtnGlow); 

    txtTalk = new JTextField(); 
    txtTalk.setBounds(130, 28, 173, 20); 
    txtTalk.setColumns(10); 

    btnStopTalking = new JButton("Stop AutoTalk"); 
    btnStopTalking.setBounds(144, 177, 146, 23); 
    btnStopTalking.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      Talk.action = "stop"; 
      btnStartTalking.setEnabled(true); 
      btnStopTalking.setEnabled(false); 
      btnAddTalking.setEnabled(true); 
      frame.repaint(); 

     } 
    }); 





    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(); 
      frame.repaint(); 




     } 
    }); 

    timeTalk = new JTextField(); 
    timeTalk.setBounds(174, 71, 86, 20); 
    timeTalk.setColumns(10); 

    JLabel lblNewLabel = new JLabel("Text:"); 
    lblNewLabel.setBounds(24, 28, 46, 20); 

    JLabel lblDelayInMs = new JLabel("Delay in ms:"); 
    lblDelayInMs.setBounds(24, 71, 101, 20); 
    frame.getContentPane().add(txtTalk); 
    frame.getContentPane().add(btnStartTalking); 
    frame.getContentPane().add(btnStopTalking); 
    frame.getContentPane().add(timeTalk); 

    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); 
    btnStopTalking.setEnabled(false); 








} 
} 

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


} 



} 
+0

您在问题文本中提到了JavaFX,但这不是JavaFX代码。另外,不建议使用'com.sun.glass'类,因为它们不是公开导出的JRE API的一部分,它们的接口可能会在未来的Java版本中更改或删除。 – jewelsea

+0

感谢您的回复。我认为这是JavaFX代码,但我可能是错的:)。你知道我究竟做错了什么吗? –

+0

我不是Swing开发的专家,所以我会保留回答这个问题。我编辑了您的问题以删除JavaFX引用并添加一个Swing标签,这可能会帮助您选择愿意查看它的Swing专家。如果你提供了一个[mcve](http://stackoverflow.com/help/mcve)(注意它必须是* minimal *和* complete *),你可能会得到更好的回应机会,而不是倾销你的整个代码。它可以编译并执行以运行)。此外,用正确的缩进格式化代码并删除无用的空格。 – jewelsea

回答

0

改用

invalidate(); 
validate();