jFrame新线程
jFrame new thread
你能帮我写一个执行windows cmd 命令的简单程序吗?通过单击 jbutton3,我想使用 PING 命令执行代码,并在文本框中设置参数,但问题是在执行期间整个 window 冻结。单击按钮后我尝试 运行 新线程,但 windows 仍然冻结,你能指出我做错了什么吗?
public class GUI extends javax.swing.JFrame implements ActionListener{
public GUI() {
initComponents();
}
private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
Thread worker = new Thread()
{
public void run()
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
try
{
Runtime rt2 = Runtime.getRuntime();
String IP2, COUNT;
IP2 = jTextField4.getText();
COUNT = jTextField3.getText();
Process pr = rt2.exec("cmd /c ping -n " + COUNT + " " + IP2);
BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream()));
String line=null;
while((line=input.readLine()) != null) {
jTextArea1.append(line + "\n");
jTextArea1.repaint();
jTextArea1.update(jTextArea1.getGraphics());
System.out.println(line);
}
jTextArea1.append("\nCOMPLETED!\n");
jTextArea1.repaint();
jTextArea1.update(jTextArea1.getGraphics());
int exitVal = pr.waitFor();
System.out.println("Exited with error code "+exitVal);
}
catch(Exception e)
{
System.out.println(e.toString());
e.printStackTrace();
}
}
});
}
};
worker.start();
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new GUI().setVisible(true);
}
});
}
}
是的,你有一个后台线程,它会立即创建另一个 Runnable 来调用你的 long-运行ning 进程是 运行 在 Swing 事件线程上——它所在的确切位置不应该是 运行(通过将 Runnable 传递给 SwingUtilities.invokeLater 方法)。
解决方案:运行 Swing 事件线程中 不是 运行 的后台线程中的长内容,只有 运行事件线程中的 Swing 代码。
你能帮我写一个执行windows cmd 命令的简单程序吗?通过单击 jbutton3,我想使用 PING 命令执行代码,并在文本框中设置参数,但问题是在执行期间整个 window 冻结。单击按钮后我尝试 运行 新线程,但 windows 仍然冻结,你能指出我做错了什么吗?
public class GUI extends javax.swing.JFrame implements ActionListener{
public GUI() {
initComponents();
}
private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
Thread worker = new Thread()
{
public void run()
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
try
{
Runtime rt2 = Runtime.getRuntime();
String IP2, COUNT;
IP2 = jTextField4.getText();
COUNT = jTextField3.getText();
Process pr = rt2.exec("cmd /c ping -n " + COUNT + " " + IP2);
BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream()));
String line=null;
while((line=input.readLine()) != null) {
jTextArea1.append(line + "\n");
jTextArea1.repaint();
jTextArea1.update(jTextArea1.getGraphics());
System.out.println(line);
}
jTextArea1.append("\nCOMPLETED!\n");
jTextArea1.repaint();
jTextArea1.update(jTextArea1.getGraphics());
int exitVal = pr.waitFor();
System.out.println("Exited with error code "+exitVal);
}
catch(Exception e)
{
System.out.println(e.toString());
e.printStackTrace();
}
}
});
}
};
worker.start();
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new GUI().setVisible(true);
}
});
}
}
是的,你有一个后台线程,它会立即创建另一个 Runnable 来调用你的 long-运行ning 进程是 运行 在 Swing 事件线程上——它所在的确切位置不应该是 运行(通过将 Runnable 传递给 SwingUtilities.invokeLater 方法)。
解决方案:运行 Swing 事件线程中 不是 运行 的后台线程中的长内容,只有 运行事件线程中的 Swing 代码。