常用的Swing组件有:
按钮:JButton
单选按钮:JRadioButton
复选框:JCheckBox
文本区:JTextArea
文本字段:JTextField
列表:JList
下拉列表:JComboBox
树:JTree
表格:JTable
接下来我们简单讲解一下Swing模型:一个Java GUI通常由顶层容器、中间容器以及多个原子组件组成。每个原子组件或容器都可能触发相应事件的产生。容器是一类能够在其中容纳其他组件的特殊组件。Swing的GUI组件类是按照类属层次以树状结构进行组织的。在这个树的最顶层,即树的根部,使一个最基本的容器类,被称为顶层容器。Swing 提供了三个通用的顶层容器类JFrame,JDialog和JApplet。JFrame提供了基于窗体的应用程序,JDialog提供对话框形式的界面,JApplet提供Java小应用程序的界面形式。在顶层容器下是中间容器,用于容纳其他的组件。通常窗格本身在显示界面中是看不到的。面板类Panel是一种中间容器,它的唯一作用是使组件更容易定位。顶层容器通过getContentPane()方法获取内部的一个内容窗格。
基于这些知识的基础下,我们可以设计一个简单的类似于每个系统都自带的简易计算器,对两个操作数进行加减乘除的简单运算或者对单个操作数进行开根运算。
好的,废话不多说,接下来我们看代码吧~
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import java.awt.Color;
public class caculator {
//定义窗口以及相应组件
private JFrame frame;
private JPanel panelwest;
private JPanel panelcenter;
private JPanel paneleast;
//定义一个文本输入框
private JTextField tf;
//定义各种按钮,包括数字0~9、"+-*/"、清空、小数点、开根符号以及等号
private JButton[] buttonNumber = new JButton[10];
private JButton buttonAdd;
private JButton buttonSub;
private JButton buttonMultiply;
private JButton buttonDivision;
private JButton buttonClear;
private JButton buttonEqual;
private JButton buttonPoint;
private JButton buttonSqrt;
//定义按钮监听器
private ButtonListener listener;
//构造方法
public caculator(){
initView();
setWest();
setCenter();
setEast();
addListener();
setFrame();
}
//设置窗口
private void setFrame() {
//加载布局
frame.setLayout(new BorderLayout());
//在布局内添加组件
frame.add(paneleast,BorderLayout.EAST);
frame.add(tf,BorderLayout.NORTH);
frame.add(panelwest,BorderLayout.WEST);
frame.add(panelcenter,BorderLayout.CENTER);
//设置文本输入框的背景颜色
tf.setBackground(Color.WHITE);
//展开窗口
frame.pack();
frame.setLocation(500,500);
//退出进程,不加此句,关闭页面但程序进程仍在后台运行
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//一个UI界面默认都是不可见的,setVisible方法可调节UI界面的可见性
frame.setVisible(true);
}
//对按钮进行监听
private void addListener() {
for(int i = 0;i <= 9; i++){
buttonNumber[i].addActionListener(listener);
}
buttonAdd.addActionListener(listener);
buttonSub.addActionListener(listener);
buttonMultiply.addActionListener(listener);
buttonDivision.addActionListener(listener);
buttonClear.addActionListener(listener);
buttonEqual.addActionListener(listener);
buttonPoint.addActionListener(listener);
buttonSqrt.addActionListener(listener);
}
//初始化西边按钮的初始显示值
private void setWest() {
buttonNumber[0] = new JButton("0");
buttonPoint = new JButton(".");
buttonClear = new JButton("CE");
panelwest.setLayout(new GridLayout(3,1));
panelwest.add(buttonNumber[0]);
panelwest.add(buttonPoint);
panelwest.add(buttonClear);
}
//初始化右边按钮的初始显示值
private void setEast() {
buttonAdd = new JButton("+");
buttonSub = new JButton("-");
buttonMultiply = new JButton("*");
buttonDivision = new JButton("/");
buttonSqrt = new JButton("√");
buttonEqual = new JButton("=");
paneleast.setLayout(new GridLayout(3,2));
paneleast.add(buttonAdd);
paneleast.add(buttonSub);
paneleast.add(buttonMultiply);
paneleast.add(buttonDivision);
paneleast.add(buttonSqrt);
paneleast.add(buttonEqual);
}
//初始化中间按钮的初始显示值
private void setCenter() {
for(int i = 1;i <= 9; i++){
buttonNumber[i] = new JButton("" + i);
}
//GirdLayout(rows,cols);
panelcenter.setLayout(new GridLayout(3,3));
for(int i = 1;i <= 9; i++){
panelcenter.add(buttonNumber[i]);
}
}
//实例化框架组件与监听器
private void initView() {
tf = new JTextField(30);
//将textField的字体设置靠右
tf.setHorizontalAlignment(JTextField.RIGHT);
frame = new JFrame("简易计算机");
panelcenter = new JPanel();
panelwest = new JPanel();
paneleast = new JPanel();
listener = new ButtonListener();
}
class ButtonListener implements ActionListener{
int mark = 0;//记录当前进行何种计算
boolean flag = true;//记录为第几个操作数赋值
boolean Flag = true;//记录当前是否做第一次运算
double temp = 0;//作为中间变量存储数值
double operand1 = 0;//用于存储第一个操作数
double operand2 = 0;//用于存储第二个操作数
double result = 0;//用于存储计算结果
int count = 0;//由线程特性计算开根号
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getSource()==buttonPoint){
tf.setText("0.");
}
if(e.getSource()==buttonClear){
tf.setText("");
mark = 0;
Flag = true;
flag = true;
operand1 = 0;
operand2 = 0;
result = 0;
}
for(int i = 0;i <= 9;i++){
if(e.getSource()==buttonNumber[i]){
tf.setText(tf.getText() + ("" + i));
temp = Double.parseDouble(tf.getText());
if(Flag){
operand1 = flag?temp:operand1;
operand2 = !flag?temp:operand2;
flag = false;
}
else{
operand1 = result;
operand2 = temp;
System.out.println("operand1:" + operand1 + " operand2:" + operand2);
}
}
if(e.getSource()==buttonAdd){
tf.setText("");
mark = 0;
}
if(e.getSource()==buttonSub){
tf.setText("");
mark = 1;
}
if(e.getSource()==buttonMultiply){
tf.setText("");
mark = 2;
}
if(e.getSource()==buttonDivision){
tf.setText("");
mark = 3;
}
if(e.getSource()==buttonSqrt){
count++;
if(count % 9 == 0){
result = Math.sqrt(temp);
temp = result;
// else result = Math.sqrt(result);
System.out.println(result);
tf.setText(result + "");
}
}
if(e.getSource()==buttonEqual){
if(mark == 0){
result = operand1 + operand2;
}
if(mark == 1){
result = operand1 - operand2;
}
if(mark == 2){
result = operand1 * operand2;
}
if(mark == 3){
result = operand1 / operand2;
}
tf.setText(result + "");
flag = false;
Flag = false;
}
}
}
}