网格布局像电子数据表一样,按行列排列所有的组件。不过,它的每个单元大小都是一样的。计算器程序就使用了网格布局来排列计算器按钮。当缩放窗口时,计算器按钮将随之变大或变小,但所有的按钮尺寸始终保持一致。
在网格布局对象的构造器中,需要指定行数和列数:
添加组件,从第一行的第一列开始,然后是第一行的第二列,以此类推。panel.setLayout(new CridLayout(4,4));
panel.add(new JButton(1));
panel.add(new JButton( 2 ));
下面是一个计算器的代码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* Created by IBM on 2017/9/15.
*/
public class CalculatorPanel extends JFrame {
private JButton display;
private JPanel panel;
private double result;
private String lastCommaand;
private boolean start;
public static void main(String[]args){
CalculatorPanel buttonFrame=new CalculatorPanel();
buttonFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
buttonFrame.setVisible(true);
}
public CalculatorPanel(){
setLayout(new BorderLayout());
result=0;
lastCommaand="=";
start=true;
//add the display
display=new JButton("0");
display.setEnabled(false);//按钮作为显示计算结果的控件
add(display,BorderLayout.NORTH);
ActionListener insert=new InsertAction();
ActionListener command=new CommandAction();
panel=new JPanel();
panel.setLayout(new GridLayout(4,4));
addButton("7",insert);
addButton("8",insert);
addButton("8",insert);
addButton("/",command);
addButton("4",insert);
addButton("5",insert);
addButton("6",insert);
addButton("*",command);
addButton("1",insert);
addButton("2",insert);
addButton("3",insert);
addButton("-",command);
addButton("0",insert);
addButton(".",insert);
addButton("=",command);
addButton("+",command);
add(panel,BorderLayout.CENTER
);
}
/**
*
* @param label
* @param listener
*/
private void addButton(String label,ActionListener listener){
JButton button=new JButton(label);
button.addActionListener(listener);
panel.add(button);
}
private class InsertAction implements ActionListener{
public void actionPerformed(ActionEvent event){
String input=event.getActionCommand();
if(start){
display.setText("");
start=false;
}
display.setText(display.getText()+input);
}
}
private class CommandAction implements ActionListener{
public void actionPerformed(ActionEvent event){
String command=event.getActionCommand();
if(start){
if(command.equals("-")){
//display.setText(command);
start=false;
}else lastCommaand=command;
}
else {
calculate(Double.parseDouble(display.getText()));
lastCommaand=command;
start=true;
}
}
}
public void calculate(double x){
if(lastCommaand.equals("+"))result+=x;
else if(lastCommaand.equals("-"))result-=x;
else if(lastCommaand.equals("*"))result*=x;
else if(lastCommaand.equals("/"))result/=x;
else if(lastCommaand.equals("="))result=x;
display.setText(""+result);
}
}
运行结果: