1.swing介绍
Swing是SUN推出的轻量级的开发用户界面的工具包,最初它的设计是在单线程环境下运行的,它的执行也是单线程的,这也就是为什么我们说Swing不是多线程安全的。所以为了编写交互性更高的UI界面,必须了解其内部的线程运行机制。
Swing程序往往包括了三种类型的线程,而且运行一个Swing应用程序,都会自动创建三个线程,分别是:
1)初始化线程:
它运行程序的主方法
2)事件调度线程:
它负责捕获系统事件
3)任务线程:
捕获的事件将发送到这一个线程做处理。
2.swing模式
所有的事件(如键盘按下、鼠标移动)都放置到一个事件队列中。Java.awt.EventQueue对象负责从这个队列中取出事件并适当地派发它们。EventQueue的派发机制由单独的一个线程管理,这个线程称为事件派发线程(EDT,Event Dispatch Thread)。
比如在JTextField按下一个键,EDT把这个按键事件派发到这个组件的键监听器。这个组件接着更新他的模式(执行actionPerformed方法),并把一个绘制请求发布到事件队列(EventQueue)。EDT从这个队列中取出这个绘制请求并再次通知这个组件,让它重新绘制自身。
3.swing实例
package window;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JLabel;
import javax.swing.JSlider;
public class aa extends JFrame implements ChangeListener {
private JPanel contentPane;
public JTextField textField;
private JTextField textField_1;
private String ss;
public JSlider slider;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
aa frame = new aa();
frame.setVisible(true);
Thread thread = new My();
thread.start();
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public aa() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
textField = new JTextField();
textField.setBounds(150, 100, 142, 21);
contentPane.add(textField);
textField.setColumns(10);
new Thread(new Runnable() {
@Override
public void run() {
try {
for (int i = 0; true; i++) {
textField.setText(String.format("当前进度:%s", i));
Thread.sleep(200);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
textField_1 = new JTextField();
textField_1.setColumns(10);
textField_1.setBounds(150, 42, 142, 21);
contentPane.add(textField_1);
JButton btnNewButton = new JButton("\u767B\u5F55");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if (ss == null) {
ss = "s";
} else {
ss += "s";
}
System.out.println(slider.getValue());
}
});
btnNewButton.setBounds(104, 137, 95, 25);
contentPane.add(btnNewButton);
JLabel lblNewLabel = new JLabel("\u8D26\u53F7:");
lblNewLabel.setBounds(82, 45, 30, 15);
contentPane.add(lblNewLabel);
JLabel label = new JLabel("\u5BC6\u7801:");
label.setBounds(82, 105, 30, 15);
contentPane.add(label);
slider = new JSlider();
slider.setBounds(121, 194, 200, 24);
contentPane.add(slider);
textField_1.setText("" + slider.getValue());
new Thread(new Runnable() {
@Override
public void run() {
try {
for (int i = 0; true; i++) {
textField_1.setText(String.format("当前进度:%s", i));
Thread.sleep(100);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
JButton button = new JButton("\u767B\u5F55");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("sss");
}
});
button.setBounds(226, 137, 95, 25);
contentPane.add(button);
slider.addChangeListener(this);
}
@Override
public void stateChanged(ChangeEvent e) {
textField_1.setText("" + slider.getValue());
System.out.println(slider.getValue());
}
}