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;
}
运行结果: