码迷,mamicode.com
首页 > 编程语言 > 详细

java界面编程(1) ------ Swing基础

时间:2014-11-15 00:13:21      阅读:284      评论:0      收藏:0      [点我收藏+]

标签:java界面编程   swing   线程   ui   

         本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 

         最近想学下java的界面编程,在此记录下。

    大多数的Swing应用都被构建在基础的JFrame内部,JFrame在你作用的任何操作系统中都可以创建视窗应用。

看如下一个最简单的JFrame例子:

JFrame frame = new JFrame("Hello Swing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 100);
frame.setVisible(true);
       这样就创建了一个带标题的视窗,其中,setDefaultCloseOperation()告诉JFrame当用记执行关闭操作时应该做些什么。EXIT_ON_CLOSE常量告诉它要退出程序。而如果没有这个调用,默认的行为是什么都不做,因此应用将不会关闭。setSize()以像素为单位设置视窗的大小。JFrame默认是不显示的,所以需要设置setVisible(true),才能显示在屏幕上。效果如下图所示:

bubuko.com,布布扣

       下面,给该视窗添加一个标签,主要代码如下:

     JLabel label = new JLabel("A Label");
	frame.add(label);
	try {
		TimeUnit.SECONDS.sleep(1);
	} catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	label.setText("Hi,this is a different");
  这里面的TimeUnit.SECONDS.sleep(1)指的是过1秒钟后执行下面的操作,即重新设置JLabel显示的文字。效果如下:

bubuko.com,布布扣bubuko.com,布布扣

       上述是直接在Main()线程执行UI事件更新屏幕,但这并不是一种好的想法,Swing有它自己的专用线程来接收UI事件并更新屏幕,如果从其他线程着手对屏幕时进行操作,那么就可能会产生冲突和死锁。所以其他线程包括main()线程,应该通过Swing事件分发线程提交要执行的任务。可以通过将任务提交给SwingUtilities.invokeLater()来实现。

  如果我们将这种方式应用于面的例子,那么代码如下:

		final JLabel label = new JLabel("A Label");
		frame.add(label);
		TimeUnit.SECONDS.sleep(1);
		SwingUtilities.invokeLater(new Runnable() {
			
			@Override
			public void run() {
				label.setText("Hi,this is a different");
			}
		});

  如上述代码,不用直接操作JLabel,取而代之的是,提交一个runnable,因此也就不会产生冲突。

  既然,Swing有它自己专用的线程来接收UI事件,那么,我们也不应该直接在Main()线程中操作JFrame,因此,我们将JFrame的操作也统一用Swing专用的线程来实现,则上述例子就变成:

public class test {

	private static JLabel label;
	private static JFrame frame;
	
	private static void InitJFrame(){
		frame = new JFrame("Hello Swing");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(300, 100);
		frame.setVisible(true);
		
		label = new JLabel("A Label");
		frame.add(label);
	} 
	/**
	 * @param args
	 * @throws InterruptedException 
	 */
	public static void main(String[] args) throws InterruptedException {
		
		SwingUtilities.invokeLater(new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				InitJFrame();
			}
		});
		TimeUnit.SECONDS.sleep(1);
		SwingUtilities.invokeLater(new Runnable() {
			
			@Override
			public void run() {
				label.setText("Hi,this is a different");
			}
		});
		
	}
	
}
     当然了,因为创建JFrame有两种方式,一种是new JFrame(),另一种就是直接继承JFrame,上面的完整代码用的是第一种方法,第二方法完整代码如下:

public class SwingTest extends JFrame{

	private static JLabel label;
	private static SwingTest st;
	
	public SwingTest() {
		super("Hello Swing");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(300, 100);
		setVisible(true);
		
		label = new JLabel("A Label");
		add(label);
		
	}
	
	/**
	 * @param args
	 * @throws InterruptedException 
	 */
	public static void main(String[] args) throws InterruptedException {
		
		SwingUtilities.invokeLater(new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				st = new SwingTest();
			}
		});
		TimeUnit.SECONDS.sleep(1);
		SwingUtilities.invokeLater(new Runnable() {
			
			@Override
			public void run() {
				label.setText("Hi,this is a different");
			}
		});
		
	}
	
}
  这里要注意一点,对sleep()的调用不能在构造器的内部,如果放在内部,JLabel的初始文本就永远都不会出现。这主要是因为构造器在sleep()调用完毕和新的标签插入之前不会结束。


 


java界面编程(1) ------ Swing基础

标签:java界面编程   swing   线程   ui   

原文地址:http://blog.csdn.net/jesson20121020/article/details/41115243

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!