• java编程接口(1) ------ Swing基金会


             本文提出了自己的学习笔记。欢迎转载,但请注明出处: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)。才干显示在屏幕上。

    效果例如以下图所看到的:


           以下。给该视窗加入一个标签,主要代码例如以下:

         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显示的文字。

    效果例如以下:

           上述是直接在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()调用完成和新的标签插入之前不会结束。


     


    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    mysql中事务隔离级别可重复读说明
    Zookeeper安装与启动
    PHP闭包之bind和bindTo
    使用WebPack打包
    用Python下载momentum中的精美壁纸
    supervisor使用
    Shell脚本:RedisKey批量删除
    使用Certbot配置站点的https
    PHPfmt代码格式化
    创建用私钥签名的证书
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4797829.html
Copyright © 2020-2023  润新知