Java基础知识(3): Swing编程
1、主要内容
通过Swing编写图形用户界面
2、Swing控件编程
用Swing编写图形用户界面主要涉及JFrame, JPanel, JButton等等类。其中,JFrame是界面布局的桌子;JPanel是放置控件的幕布,铺在JFrame上将空间分成若干块;JButton等控件添加到JPanel的指定位置中。
2.1JFrame相关方法
setTitle("")设置窗口名称
setBounds()设置窗口位置和尺寸
setLayout(null)关闭窗口布局管理器使得后面的setBounds生效
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)定义窗口关闭事件
setResizable(false)禁用最大化
getContentPane()返回窗体的contentPane对象
getContentPane().add(JPanel)添加JPanel容器
2.2 JPanel相关方法
setBounds()设置窗口位置和尺寸,在JFrame内的相对位置
setLayout(null)关闭窗口布局管理器使得控件的setBounds生效
add()添加控件
2.3 JButton等控件
setBounds()设置窗口位置和尺寸,在JPanel内的相对位置
代码如下:
public class mainFrame extends JFrame{
	public TextArea revArea;
	public JButton button1;
	public JButton button2;
	public JButton button3;
	public JButton button4;
	public JButton button5;
	public JButton button6;
	
	
	public mainFrame() {
		
		this.setTitle("服务器");
		this.setBounds(300, 200, 500, 500);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setLayout(null);
		this.setResizable(false);
		
		JPanel panel_1 = new JPanel();
		panel_1.setLocation(350, 20);
		panel_1.setSize(100, 300);
		panel_1.setLayout(null);
		
		button1 = new JButton("Exp 1");
		button1.setBounds(0, 0, 100, 30);
		button2 = new JButton("Exp 2");
		button2.setBounds(0, 50, 100, 30);
		button3 = new JButton("Exp 3");
		button3.setBounds(0, 100, 100, 30);
		button4 = new JButton("Exp 4");
		button4.setBounds(0, 150, 100, 30);
		button5 = new JButton("保存");
		button5.setBounds(0, 200, 100, 30);
		button6 = new JButton("任务取消");
		button6.setBounds(0, 250, 100, 30);
		
		panel_1.add(button1);
		panel_1.add(button2);
		panel_1.add(button3);
		panel_1.add(button4);
		panel_1.add(button5);
		panel_1.add(button6);
		
		
		this.getContentPane().add(panel_1);
		
		revArea = new TextArea();
		revArea.setBounds(10, 10, 280, 440);
		
		this.getContentPane().add(revArea);
		
		Event();
		
	}  
3、Swing的并发
当一个Swing控件触发一个长期运行任务时,那么这个长期运行任务就占用了事件分发线程(图形界面的线程),导致按钮无法立刻弹起来。解决方法是在响应触发时分配单独的线程执行长期运行的任务。可以使用单线程的Executor线程池,它自动将待处理任务排队,然后按顺序执行。
button2.addActionListener(new ActionListener() {
			
			public void actionPerformed(ActionEvent e) {
				revArea.append("实验二
");
				executor.execute(new Runnable() {
					public void run() {
						c.Experment_2(file);
					}
				});
			}
			
		}); 
其中,c.Experment_2()是一个长期运行任务。
public ExecutorService executor = Executors.newSingleThreadExecutor();
4、遗留的问题
在实际问题中遇到了如何异步终止线程的问题。
一般的方法是通过外部方法改变control变量的值来终止线程
while (control) {
			
			} 
但是在有阻塞IO或等待锁时,无法用这种方法来终止。
