JAVA笔记【20131221】

Swing用户界面组件

一、模型-视图-控制器设计模式(MVC)

模型:存储内容

视图:显示内容

控制器:处理用户输入

对于大多数组件来说,模型类实现了名字结尾为Model的接口。按钮就实现了ButtonModel接口。Swing库中的DefaultButtonModel类就实现了ButtonModel接口。

每个JButton对象存储一个按钮模型对象,可使用下面方法获取模型对象。

JButton button = new JButton("blue");
ButtonModel model = button.getModel();

一般来说,每个Swing组件都有一个相关的后缀名为UI的视图对象,但并不是所有的Swing组件都有专门的控制器对象。

其实JButton仅仅是一个继承JComponent类的包装器,JComponent包含一个DefaultButtonModel对象,一些视图数据(例如按钮标签和图标)以及一个负责控制按钮视图的BasicButtonUI对象。


布局管理器:

容器内所有组件都由一个布局管理器(layout manager)进行定位。默认的布局管理器是流布局管理器FlowLayout。

当然也可以使用过其他的布局管理器,通过调用容器的public void setLayout(LayoutManager mgr)

panel.setLayout(new GridBagLayout());

边界布局:

边界布局管理器(border layout manager)是每个JFrame的内容窗格的默认布局管理器。内容窗格被分为东南西北中五个部分。

可以通过指定BorderLayout类的CENTER,NORTH,SOUTH,EAST,WEST常量来决定在哪个部分添加组件。如果没有指定则默认为CENTER。

panel.setLayout(new BorderLayout());
panel.add(blueButton,BorderLayout.NORTH);

JPanel可以直接利用构造方法指定布局管理器,而大多数其它容器没有这种构造方法。但所有容器都有setLayout方法。


网格布局:(GridLayout)

例程:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class CalculatorTest01
{
	public static void main(String[] args)
	{
		CalculatorFrame calcFrame = new CalculatorFrame();
		calcFrame.setSize(200,300);
		calcFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		calcFrame.setVisible(true);
	}
}

class CalculatorFrame extends JFrame
{
	public CalculatorFrame()
	{
		CalculatorPanel calcPanel = new CalculatorPanel();
		setTitle("Calculator");
		add(calcPanel);
		pack();
	}
}

class CalculatorPanel extends JPanel
{
	public CalculatorPanel()
	{
		setLayout(new BorderLayout());
		display = new JButton("0");
		add(display,BorderLayout.NORTH);
		display.setEnabled(false);
		flag=true;
		result=0;
		double1=0;
		double2=0;
		lastCmd="=";
		
		ActionListener insLis = new InsertActionListener();
		ActionListener cmdLis = new CommandActionListener();
		
		panel = new JPanel(new GridLayout(4,4));
		addButton("7",insLis);
		addButton("8",insLis);
		addButton("9",insLis);
		addButton("/",cmdLis);
		addButton("4",insLis);
		addButton("5",insLis);
		addButton("6",insLis);
		addButton("*",cmdLis);
		addButton("1",insLis);
		addButton("2",insLis);
		addButton("3",insLis);
		addButton("-",cmdLis);
		addButton("0",insLis);
		addButton(".",insLis);
		addButton("=",cmdLis);
		addButton("+",cmdLis);
		add(panel,BorderLayout.CENTER);
	}
	
	class InsertActionListener implements ActionListener
	{
		public void actionPerformed(ActionEvent e)
		{
			String temp = e.getActionCommand();
			if(flag)
			{
				display.setText(temp);
				flag=false;
			}
			else
			{
				display.setText(display.getText()+temp);
			}
			
			if(lastCmd.equals("="))
			{
				double1=Double.parseDouble(display.getText());
			}
			else
			{
				double2=Double.parseDouble(display.getText());
			}
		}
	}
	
	class CommandActionListener implements ActionListener
	{
		public void actionPerformed(ActionEvent e)
		{
			flag=true;
			String Cmd = e.getActionCommand();
			if(Cmd.equals("="))
			{
				calculate(double1,double2);
			}
			lastCmd=Cmd;
		}
	}
	
	public void calculate(double x,double y)
	{
		if(lastCmd.equals("+")) result=x+y;
		else if(lastCmd.equals("-")) result=x-y;
		else if(lastCmd.equals("*")) result=x*y;
		else if(lastCmd.equals("/")) result=x/y;
		//else if(lastCmd.equals("=")) result = x;
		double1=result;
		display.setText(""+result);
	}
	
	public void addButton(String label,ActionListener listener)
	{
		JButton button = new JButton(label);
		button.addActionListener(listener);
		panel.add(button);
	}
	
	private JButton display;
	private JPanel panel;
	private boolean flag;
	private double result;
	private double double1;
	private double double2;
	private String lastCmd;
}

运行结果:





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值