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()调用完毕和新的标签插入之前不会结束。

 

时间: 2024-08-26 17:57:41

java界面编程(1) ------ Swing基础的相关文章

java界面编程(4) ------ Swing事件模型

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 在Swing的事件模型中,组件可以发起(触发)一个事件.每种事件的类型由不同的类表示,当事件被触发时,它将被一个或多个"监听器"接收,监听器负责处理事件.所以,事件发生的地方可以与事件处理的地方分离开.既然是以这种方式使用Swing组件,那么就只需要编写组件收到事件时将被调用的代码.所谓事件监听器,就是一个"实现特定类型的监听器接口"类对象. 下面

Java界面编程-建立一个可以画出图形的简单框架

引子:总共使用3个.java文件,建立一个简单界面编程的框架. 第1个文件:NotHelloWorldComponent.java //NotHelloWorldComponent.java 1 import java.awt.*; 2 import java.awt.geom.*; 3 import javax.swing.*; 4 5 public class NotHelloWorldComponent extends JComponent { 6 public static final

java 界面编程

转载之u010345869的博客,这里学习下 /* * java复选框和单选按钮 */ import javax.swing.*; import java.awt.*; public class Test0 extends JFrame{ JList jlist; //列表框 JComboBox jcb; //下拉框 JPanel jp1, jp2; //面板 JLabel jlb1, jlb2; JScrollPane jsp; //滚动控件 //构造函数 public Test0(){ jp

java 界面编程(上)

一.AWT介绍 1)AWT(Abstract windows toolkit) 包括了很多类和接口,用于java Application的GUI(Graphics User Interface图形界面编程) 2)GUI的各种元素(窗口,按钮,文本框)等都由java类来实现 3)使用AWT所涉及的类一般在java.awt包及其子包中. 4)Container和Component是AWT中的两个核心类. 所有的可以显示出来的图形元素都被称为Componnet,Component代表了所有的可见的图形

java 界面编程中 JButton问题

在图形化界面编程中,按钮JButton使用时需要布置按钮的位置,更改按钮大小. 1)按钮初始化 JButton button = new JButton() /*在new JButton()括号中可以添加按钮显示的字符等 JButton button = new JButton("JButtonExample") 但是不能初始化按钮的大小和位置*/ 2)JButton按钮的在面板中位置的确定 对JButton大小的设置     ——因为JButton是属于小器件类型的,所以一般的set

Swing:关于Java界面编程的第一课,如何正确的处理界面中的线程

转载:http://blog.csdn.net/sunyiz/article/details/8004573 关于 Java 的 GUI ,关于 Swing,其实有一件事情是非常重要的 那就是线程! 如何正确的使用 GUI 线程, 什么样的代码应该在 GUI 线程上执行? 什么样的代码应该用其他线程执行? 其实这些都很重要, 但是,很多关于 Java 的教材都没有强调过这些,甚至有的书完全就忽略了这一点 所以,我在这里要给所以开始接触 Swing 的人,讲述一个重要概念: Swing 中的线程

java界面编程(3) ------ 控制布局

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 在java 中,组件放置在窗体上的方式可能与其他的GUI系统都不相同.首先,它完全基于代码,没有用来控制组件布置的"资源".第二,组件旋转在窗体上的方式不是通过绝对坐标控制,而是由"布局管理器"根据组件加入的顺序决定位置.使用不同的布局管理器,组件的大小,形状和位置将大不相同,此外,布局管理器还可以适应applet或应用程序窗口的大小,所以如果窗口

java界面编程(2) ------ 按钮,文本输入框和文本区域

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 上节创建了视窗,这是其他组件的容器,这节就来创建按钮. 创建按钮,只需要在希望出现的地方调用JButton的构造器即可. JButton是一个组件,它有自己的小窗口,能作为整个更新过程的一部分而自动被重绘.也就是说,你不必显示绘制一个按钮或者别的类型的控件,只要将其放在窗体上,它们可以自动绘制自己.采用上节的例子,在其基础上修改如下: public class SwingTes

java 界面编程用socket实现服务端与客户端的循环通信。

服务端: package 实验五聊天; import java.awt.BorderLayout; import java.awt.EventQueue; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.ne