Java的Swing编程中,使用SwingWorker线程模式以及顶层容器可以实现多线程的UI操作,避免了长时间运行的任务卡住了界面的情况。下面将详细介绍如何使用SwingWorker线程模式及顶层容器进行Swing编程。
一、SwingWorker线程模式
SwingWorker是Java提供的一个工具类,用于在后台线程中执行耗时的任务,并在任务完成后通知Swing应用程序。
1.创建SwingWorker类
public class SwingWorkerDemo extends SwingWorker<Void, Integer>{
private JTextArea textArea;
public SwingWorkerDemo(JTextArea textArea) {
this.textArea = textArea;
}
@Override
protected Void doInBackground() throws Exception {
int i = 0;
while (i < 100) {
Thread.sleep(100);
i++;
publish(i); //在doInBackground中通过publish方法通知process方法
}
return null;
}
@Override
protected void process(List<Integer> chunks) { //在process方法中更新UI组件
for (Integer chunk : chunks) {
textArea.append(String.valueOf(chunk) + "\n");
}
}
@Override
protected void done() { //在done方法中任务完成后通知Swing应用程序
System.out.println("Done!");
}
}
2.启动SwingWorker类
public class Main{
public static void main(String[] args) {
JTextArea textArea = new JTextArea();
JFrame frame = new JFrame();
frame.add(textArea);
frame.setSize(200, 300);
frame.setVisible(true);
SwingWorkerDemo worker = new SwingWorkerDemo(textArea); //创建SwingWorker对象
worker.execute(); //启动SwingWorker线程
}
}
二、顶层容器
顶层容器是Swing组件的一个父容器,如JFrame、JDialog等。使用顶层容器可以实现窗口的创建和UI布局等操作。
1.创建顶层容器
JFrame frame = new JFrame("My Frame"); //创建JFrame窗口
frame.setSize(500, 500); //设置窗口大小
frame.setLocationRelativeTo(null); //将窗口居中显示
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置关闭窗口时的操作
2.向顶层容器添加组件
JButton button = new JButton("Click me");
frame.add(button, BorderLayout.NORTH);
3.显示顶层容器
frame.setVisible(true);
三、整合SwingWorker线程模式和顶层容器
下面的示例实现了一个在SwingWorker线程中递增计数,在JFrame窗口中显示计数结果的功能。
public class Demo extends JFrame{
private JTextArea textArea;
public Demo() {
textArea = new JTextArea();
JButton button = new JButton("Start");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
SwingWorker<Void, Integer> worker = new SwingWorker<Void, Integer>() {
@Override
protected Void doInBackground() throws Exception {
int i = 0;
while (i < 100) {
Thread.sleep(100);
i++;
publish(i);
}
return null;
}
@Override
protected void process(List<Integer> chunks) {
for (Integer chunk : chunks) {
textArea.append(String.valueOf(chunk) + "\n");
}
}
@Override
protected void done() {
System.out.println("Done!");
}
};
worker.execute();
}
});
setLayout(new BorderLayout());
add(button, BorderLayout.NORTH);
add(textArea, BorderLayout.CENTER);
setTitle("SwingWorker Demo");
setSize(200, 300);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
new Demo();
}
}
以上就是关于Java的Swing编程中使用SwingWorker线程模式及顶层容器的攻略,希望能够帮助了解Swing编程的读者。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java的Swing编程中使用SwingWorker线程模式及顶层容器 - Python技术站