首页上一页 1 下一页尾页 2 条记录 1/1页
敢问高手,swing线程中,invokelater(runnable)是怎样调用run()方法的? 困扰我几天了,nnd
发表在Java图书答疑
2014-12-24
是否精华
是
否
版块置顶:
是
否
就是下面这个程序,我不知道它的执行顺序,只知道首先main();可是main后面跟了个run()方法,后面一个代码块里又有一个run()方法,到底调用哪个呢?整个程序的执行顺序是怎样?
package com.lzw;
import java.awt.*;
import java.awt.event.*;
import java.lang.reflect.InvocationTargetException;
import java.util.Vector;
import javax.swing.*;
public class EventQueueInvokerLaterDemo extends JFrame {
private ButtonGroup buttonGroup = new ButtonGroup(); // 按钮组
private JList list; // 列表组件
private Vector listData = new Vector(); // 列表数据
public static void main(String args[]) {
try {
EventQueue.invokeAndWait(new Runnable() {
public void run() {
try {
EventQueueInvokerLaterDemo frame = new EventQueueInvokerLaterDemo();
} catch (Exception e) {
e.printStackTrace();
}
}
});
} catch (InterruptedException e) { // 捕获异常
e.printStackTrace();
} catch (InvocationTargetException e) { // 捕获异常
e.printStackTrace();
}
}
/**
* Create the frame
*/
public EventQueueInvokerLaterDemo() {
super();
setBounds(100, 100, 236, 204); // 设置窗体大小位置
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JScrollPane scrollPane = new JScrollPane(); // 创建高度面板
getContentPane().add(scrollPane, BorderLayout.CENTER);
list = new JList(); // 创建列表组件
scrollPane.setViewportView(list); // 滚动面板控制列表
final JPanel buttonPanel = new JPanel(); // 创建按钮面板
getContentPane().add(buttonPanel, BorderLayout.SOUTH);
final JButton button = new JButton(); // 创建按钮
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
do_button_actionPerformed(e); // 调用按钮事件处理方法
}
});
button.setText("添加列表选项"); // 设置按钮名称
buttonPanel.add(button); // 添加按钮到面板
final JPanel panel = new JPanel(); // 创建单选按钮面板
panel.setLayout(new GridLayout(0, 1)); // 使用网格布局
getContentPane().add(panel, BorderLayout.EAST);
final JRadioButton radioButton_1 = new JRadioButton(); // 创建单选按钮1
buttonGroup.add(radioButton_1);
radioButton_1.setText("单选1");
radioButton_1.setSelected(true);
panel.add(radioButton_1);
final JRadioButton radioButton_2 = new JRadioButton(); // 创建单选按钮2
buttonGroup.add(radioButton_2);
radioButton_2.setText("单选2");
panel.add(radioButton_2);
final JRadioButton radioButton_3 = new JRadioButton(); // 创建单选按钮3
buttonGroup.add(radioButton_3);
radioButton_3.setText("单选3");
panel.add(radioButton_3);
final JRadioButton radioButton_4 = new JRadioButton(); // 创建单选按钮4
buttonGroup.add(radioButton_4);
radioButton_4.setText("单选4");
panel.add(radioButton_4);
setVisible(true); // 显示窗体
}
/**
* 这是<b>添加列表选项</b>按钮的事件处理方法
* @param e 事件对象
*/
protected void do_button_actionPerformed(final ActionEvent e) {
new Thread() { // 开辟一个新的线程执行费时业务
public void run() {
for (int i = 0; i < 10; i++) { // 循环添加10个列表选项
Runnable runnable = new Runnable() { // 创建Runnable对象
public void run() { // 在run方法中操作Swing界面
listData.add("选项" + listData.size());
list.setListData(listData);
}
};
EventQueue.invokeLater(runnable); // 在事件队列中执行Runnable对象
try {
Thread.sleep(1000); // 阻塞UI线程1秒
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
}.start(); // 启动业务线程
}
}
package com.lzw;
import java.awt.*;
import java.awt.event.*;
import java.lang.reflect.InvocationTargetException;
import java.util.Vector;
import javax.swing.*;
public class EventQueueInvokerLaterDemo extends JFrame {
private ButtonGroup buttonGroup = new ButtonGroup(); // 按钮组
private JList list; // 列表组件
private Vector listData = new Vector(); // 列表数据
public static void main(String args[]) {
try {
EventQueue.invokeAndWait(new Runnable() {
public void run() {
try {
EventQueueInvokerLaterDemo frame = new EventQueueInvokerLaterDemo();
} catch (Exception e) {
e.printStackTrace();
}
}
});
} catch (InterruptedException e) { // 捕获异常
e.printStackTrace();
} catch (InvocationTargetException e) { // 捕获异常
e.printStackTrace();
}
}
/**
* Create the frame
*/
public EventQueueInvokerLaterDemo() {
super();
setBounds(100, 100, 236, 204); // 设置窗体大小位置
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JScrollPane scrollPane = new JScrollPane(); // 创建高度面板
getContentPane().add(scrollPane, BorderLayout.CENTER);
list = new JList(); // 创建列表组件
scrollPane.setViewportView(list); // 滚动面板控制列表
final JPanel buttonPanel = new JPanel(); // 创建按钮面板
getContentPane().add(buttonPanel, BorderLayout.SOUTH);
final JButton button = new JButton(); // 创建按钮
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
do_button_actionPerformed(e); // 调用按钮事件处理方法
}
});
button.setText("添加列表选项"); // 设置按钮名称
buttonPanel.add(button); // 添加按钮到面板
final JPanel panel = new JPanel(); // 创建单选按钮面板
panel.setLayout(new GridLayout(0, 1)); // 使用网格布局
getContentPane().add(panel, BorderLayout.EAST);
final JRadioButton radioButton_1 = new JRadioButton(); // 创建单选按钮1
buttonGroup.add(radioButton_1);
radioButton_1.setText("单选1");
radioButton_1.setSelected(true);
panel.add(radioButton_1);
final JRadioButton radioButton_2 = new JRadioButton(); // 创建单选按钮2
buttonGroup.add(radioButton_2);
radioButton_2.setText("单选2");
panel.add(radioButton_2);
final JRadioButton radioButton_3 = new JRadioButton(); // 创建单选按钮3
buttonGroup.add(radioButton_3);
radioButton_3.setText("单选3");
panel.add(radioButton_3);
final JRadioButton radioButton_4 = new JRadioButton(); // 创建单选按钮4
buttonGroup.add(radioButton_4);
radioButton_4.setText("单选4");
panel.add(radioButton_4);
setVisible(true); // 显示窗体
}
/**
* 这是<b>添加列表选项</b>按钮的事件处理方法
* @param e 事件对象
*/
protected void do_button_actionPerformed(final ActionEvent e) {
new Thread() { // 开辟一个新的线程执行费时业务
public void run() {
for (int i = 0; i < 10; i++) { // 循环添加10个列表选项
Runnable runnable = new Runnable() { // 创建Runnable对象
public void run() { // 在run方法中操作Swing界面
listData.add("选项" + listData.size());
list.setListData(listData);
}
};
EventQueue.invokeLater(runnable); // 在事件队列中执行Runnable对象
try {
Thread.sleep(1000); // 阻塞UI线程1秒
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
}.start(); // 启动业务线程
}
}