本文是作者原创文章,欢迎转载,请注明出处 from:@Eric_Lai

框架

在Java中,顶层窗口被称为框架。在AWT中,有一个被称为Frame的类用于描述顶层窗口。这个类的swing版本名称是JFrame,扩展与Frame类。用于修饰部件,由用户的窗口系统负责绘制。以下为显示一个空框架的简单代码:

public class FrameTest {	
	public static void main(String args[]) {
		EventQueue.invokeLater(new Runnable() {			
			@Override
			public void run() {
				SimpleFrame frame = new SimpleFrame();
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				frame.setVisible(true);
				frame.setTitle("hello java");				
			}
		});
	}
}
class SimpleFrame extends JFrame{
	
	private static final int DEFAULT_WIDTH = 300;
	private static final int DEFAULT_HEIGHT = 200;
	
	public SimpleFrame () {
		setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
	}
	
}

框架大小

如果没有指定框架的大小,所有框架的默认值为0×0像素。 专业的做法需要检测屏幕的分辨率,根据其分辨率来编写其框架的大小。获取当前电脑的分辨率可以按照如下操作:

Toolkit kit = Toolkit.getDefualtToolkit();
Dimension screenSize = kit. getScreenSize();
int screenWidth = screenSize.width;
int screenHeight = screenSize.height;

在这个基础上,可以将框架的大小设置成为屏幕的某个百分比值,运用以下代码:

setSize(screenWidth / 你希望的值, screenHeigth/ 你希望的值);
setLocationByPlatom(true);

如果想将框架的尺寸设置为最大,可以:

frame.setExtendedState(Frame.MAXIMIZED_BOTH);

在组件当中显示信息

在Java当中,框架是被设计来放置组件的容器,可以将用户界面元素放置在其中。通常情况下,我们讲信息绘制在一种组件上,再将这个组件添加到框架当中。JFrame的结构相当的复杂,有一些列的面板组成。swing程序员最关注的是其中的内容面板(content plane)。在设计框架的时候,需要用以下代码将组件添加到框架当中:

Container contentPane = frame.getContentPane();
Component c = ....;
contentPane.add(c);

其中,绘制组件的时候需要定义一个扩展于JComponent的类,并重写其中的paintComponent方法。在java中,所有的绘制都必须使用Graphics对象,其中包含了绘制图案、图像和文本的方法:

public class NotHelloWorldComponent extends JComponent {
	
	public static final int MESSAGE_X = 40;
	public static final int MESSAGE_Y = 70;
	
	public static final int DEFAULT_WIDTH = 300;
	public static final int DEFAULT_HEIGHT = 200;
	
	public void paintComponent(Graphics g){
		g.drawString("NOT A HELLOW WORLD PROGORM", MESSAGE_X, MESSAGE_Y);
	}
	
	public Dimension getPreferreSize() {
		return new Dimension(DEFAULT_WIDTH,DEFAULT_HEIGHT);
	}
}

适配器类

适配器类的唯一作用:实现接口中的所有方法,但是每个方法都没有做任何事情。 使用方法:新建一个类继承该适配器类。

动作

通常,激活一个命令可以有多个方式。无论命令是通过什么方式下达的,其处理都应该是一样的。swing包提供了一个非常实用的机制来封装命令,并将ta连接到多个事件源,这就是Action接口。 一个动作是一个封装了命令的说明(一个字符串或者一个图标)和执行命令所需要的参数的对象。 Action接口包含下列的方法:

void actionPerformed(ActionEvent event)
//接下来两个方法允许启用或者禁止这个动作,检查动作是否可用
void setEnable(boolean b)
boolean isEnable()
//接下来两个方法允许储存和检索动作对象中的任意名/值。有两个重要的预设字符串:Action.NAME和Action.SMALL_ICON
void putValue(String key, Object value)
Object getValue(String key)
//接下来两个方法能够让其他对象在动作对象的属性发生变化是得到通告
void addPropertyChangeListener(PropertyChangleListener lister)
void removePropertyChangeListener(PropertyChangleListener lister)

示例

这个例子将展示一个用按键和键盘将框架背景颜色改变的程序代码:

public class ActionFrame extends JFrame {

	// 创建一个按键面板
	private JPanel buttonPanel = new JPanel();

	// 创建框架的参数
	private static final int DEFAULT_WIDTH = 300;
	private static final int DEFAULT_HEIGHT = 200;

	private Action MakeAction(String name, String colorname, Icon icon, Color c) {

		Action nameAction = new ColorAction(colorname, icon, c);
		buttonPanel.add(new JButton(nameAction));
		return nameAction;
	}
	
	public ActionFrame() {
		setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

		this.add(buttonPanel);

		InputMap imap = buttonPanel
				.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
		ActionMap amap = buttonPanel.getActionMap();
		
		imap.put(KeyStroke.getKeyStroke("ctrl Y"), "panel.yellow");
		amap.put("panel.yellow", MakeAction("yellow", "Yellow", new ImageIcon("yellow-ball.gif"),
				Color.YELLOW));
		
		imap.put(KeyStroke.getKeyStroke("ctrl B"), "panel.blue");
		amap.put("panel.blue", MakeAction("blue", "Blue", new ImageIcon("blue-ball.gif"), Color.BLUE));
		
		imap.put(KeyStroke.getKeyStroke("ctrl R"), "panel.red");
		amap.put("panel.red",MakeAction("red", "Red", new ImageIcon("red-ball.gif"), Color.RED));
		
	}

	public class ColorAction extends AbstractAction {

		public ColorAction(String name, Icon icon, Color c) {
			putValue(Action.NAME, name);
			putValue(Action.SMALL_ICON, icon);
			putValue(Action.SHORT_DESCRIPTION,"set panel to " + name.toLowerCase());
			putValue("color", c);
		}

		public void actionPerformed(ActionEvent event) {
			Color c = (Color) getValue("color");
			buttonPanel.setBackground(c);
		}
	}

}