java swing 组件技术(上)

    第一次写自己的博客,明知道写得很水,还是努力去写了,希望踏出第一步之后,能有着更好的发展。这几天看了一些资料,总结了一下自己所学的关于java swing的知识。

一、        java swing 组件技术简介

1.swing的特性

l  是AWT的扩展,swing比AWT提供了更多的组件和外观

l  它是纯java代码编写(除了JFrameJDialogJApplet),因此与平台无关

2.AWT的缺点

      组件少而且是本地代码实现(无法实现跨平台)

3.swing 和 AWT相比

      一个重要的的改进在于swing把一个组件的处理分为图形部分和数据处理部分(MVC模型)

l  图形部分由编程环境统一处理(View

l  数据部分由一个数据处理模型进行处理(Model

4.swing编程应注意的问题

l  swing和AWT组件不要混合使用,可能会导致不能正常显示的错误

l  正确理解轻量级组件与重量级组件的不同

轻量级组件——swing组件,由纯java代码实现,占用系统资源少

重量级组件——AWT组件,有本地c代码实现,占用系统资源多

(注:JFrameJDialogJApplet(顶层容器)是重量级组件)

 

二、        swing的“外观和感觉”(LookAndFeel

1.swing中常见的“LookAndFeel”

Metal风格 (默认)

 javax.swing.plaf.metal.MetalLookAndFeel

Windows风格

com.sun.java.swing.plaf.windows.WindowsLookAndFeel

Windows Classic风格

com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel

Motif风格

com.sun.java.swing.plaf.motif.MotifLookAndFeel

Mac风格 (需要在相关的操作系统上方可实现)

com.sun.java.swing.plaf.mac.MacLookAndFeel

GTK风格 (需要在相关的操作系统上方可实现)

com.sun.java.swing.plaf.gtk.GTKLookAndFeel

可跨平台的默认风格

UIManager.getCrossPlatformLookAndFeelClassName()

当前系统的风格

UIManager.getSystemLookAndFeelClassName()

意义:通过LookAndFeel机制,我们可以是程序的设计者任意转换程序的人机界面来对应不同的操作系统

      2.设置swingLookAndFeel

      在swing中,采用UIManager类来管理swing界面的LookAndFeelUIManager类提供静态方法setLookAndFeel()来设置界面的LookAndFeel,该方法是一个重载方法,提供两个重载方式:

      setLookAndFeel(LookAndFeel newLookAndFeel)

      setLookAndFeel( String className)

其中:参数newLookAndFeel表示组件的某种外观,className表示组件某种外观的名字

      2-1.设置方法(静态设置,动态设置)

静态设置——设计时指定LookAndFeel

eg1:

String lookAndFeel = "javax.swing.plaf.metal.MetalLookAndFeel";
UIManager.setLookAndFeel(lookAndFeel);

eg2:

String lookAndFeel = UIManager.getCrossPlatformLookAndFeelClassName();
UIManager.setLookAndFeel(lookAndFeel);

 

动态设置——运行时指定LookAndFeel

eg:

UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());

//运行时动态更新外观

SwingUtilities.updateComponentTreeUI(this)


附:SwingUtilities.updateComponentTreeUI(Component c)

    对组件c重新设置外观

注:由于JFrame、JDialogJApplet(顶层容器)为重量级组件,因此他们的外观只与操作系统平台有关系,在相同的操作系统平台下表现相同的外观

2-2.程序代码

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class LookAndFeelDemo2 extends JFrame {

	private JRadioButton radio1 = new JRadioButton("Metal");
	private JRadioButton radio2 = new JRadioButton("Windows");
	private JRadioButton radio3 = new JRadioButton("Motif");
	private JPanel panelNorth = new JPanel();
	private JPanel panelSouth = new JPanel();
	private JTextArea area = new JTextArea(6, 20);
	private JButton btn = new JButton("button");
	private JCheckBox chk = new JCheckBox("checkBox");
	private JComboBox cmbLookAndFeel = new JComboBox(new String[] { "Metal",
			"Widows", "Motif", "GTK" });

	public LookAndFeelDemo2(String title) {
		super(title);
		Container contentPane = this.getContentPane();
		ButtonGroup group = new ButtonGroup();
		group.add(radio1);
		group.add(radio2);
		group.add(radio3);

		panelNorth.add(radio1);
		panelNorth.add(radio2);
		panelNorth.add(radio3);

		panelSouth.add(btn);
		panelSouth.add(chk);
		panelSouth.add(cmbLookAndFeel);

		contentPane.add(panelNorth, BorderLayout.NORTH);
		contentPane.add(area, BorderLayout.CENTER);
		contentPane.add(panelSouth, BorderLayout.SOUTH);
		pack();

		setVisible(true);
		setSize(300, 400);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		// 监听Item事件
		radio1.addItemListener(new MyItemListener());
		radio2.addItemListener(new MyItemListener());
		radio3.addItemListener(new MyItemListener());

	}

	private class MyItemListener implements ItemListener {

		public void itemStateChanged(ItemEvent e) {
			// 取得点击按钮的名字
			String itemName = ((JRadioButton) e.getSource()).getText();
			changeLookAndFeel(itemName);
		}
	}

	// 设置外观的private类型方法

	private void changeLookAndFeel(String name) {

		String lookAndFeel = "";
		if (name.equals("Metal")) {
			lookAndFeel = "javax.swing.plaf.metal.MetalLookAndFeel";

		} else if (name.equals("Windows")) {
			lookAndFeel = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
		} else if (name.equals("Motif")) {
			lookAndFeel = "com.sun.java.swing.plaf.motif.MotifLookAndFeel";
		}else{
			//取得默认的metal外观
			lookAndFeel = "javax.swing.plaf.metal.MetalLookAndFeel";
		}

		try {
			UIManager.setLookAndFeel(lookAndFeel);
			// 运行时指定LookAndFeel,需要SwingUtilities.updateComponentTreeUI(Component
			// c)实现动态的更新
			SwingUtilities.updateComponentTreeUI(this);
			area.setText("当前外观类名:\n" + lookAndFeel);
		} catch (Exception ex) {
			ex.printStackTrace();
		}

	}

	public static void main(String[] args) {
		new LookAndFeelDemo2("LookAndFeel");
	}
}
java swing 组件技术(上) java swing 组件技术(上) java swing 组件技术(上)

三、        swing组件

1.swing组件的分类

java swing 组件技术(上)

2.往swing容器里添加组件

      对于swing顶层容器(JFrameJDialogJApplet),在添加组件时,不能直接调用容器的add()方法。

      往顶层容器添加组件可用以下方法:

a)     通过getContentPane()方法获得当前容器的内容面板对象,在调用容器的add()方法加入各个组件

b)     先利用JPanel类生成一个内容面板对象panel,再将各个组件加入到panel中,然后调用的容器的setContentPane()方法,将panel加入到当前容器中

3.使用swing组件的基本规则

a)     把swing组件放入一个顶层容器中

b)     避免使用非swing的重量级组件

c)     往swing顶层容器添加组件时,不能直接调用add()方法

d)     内容面板缺省的布局策略是BorderLayout,不能对顶层容器进行布局

 

.swing的事件处理

a)     Swing组件可以产生AWT包中的事件

b)     有自己的事件包(javax.swing.event)

c)     Component类的五种事件

d)     能激活Container类的ContainerEvent事件的Swing组件

Swing组件中的容器(如:JFrame, JPane)

复合组件(如:JComboBox

你可能感兴趣的:(java,swing,LookAndFeel)