设计思路
界面整体窗口采用边界布局,布局策略:North位置的上放一个面板,文本框放入其中,用于显示运算中的数据和结果。Center位置。。。
主要功能
-
点击“帮助”菜单后,界面如下:
-
点击“关于”菜单项,弹出对话框,界面如下:
-
点击“文件”菜单项,并点击“退出”,会关闭弹窗,结束程序。界面如下:
-
能够进行基本的加减乘除运算
代码实现
package com.duguangming.test;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.Math;
public class Demo extends JFrame{
JButton b1,b2,b3,b4,b5,b6, b7,b8,b9,b12,a1,a2,n1,n2,n3,n4,n5,n6,n7,n8,n9,n0;
JMenu fil,hp,fil2;
JMenuItem gy,tu,jz;
JTextField tex;
JPanel pan1;
JPanel pan2;
JPanel pan3;
double result = 0;
double num=0; String ch = "="; //定义字符,用来存放运算符
boolean start;
public Demo (String s) {
super(s); pan1=new JPanel();
pan2=new JPanel();
pan3=new JPanel();
tex=new JTextField();//创建文本框
BorderLayout border=new BorderLayout ();
setSize(300,240);
setLocation(400, 400);
setResizable(false); //窗口大小不可变
setLayout(border);
//**************//生成按键*************************************/
b1=new JButton("."); b2=new JButton("+"); b3=new JButton("-");
b4=new JButton("*"); b5=new JButton("÷"); b6=new JButton("=");
b7=new JButton("sqrt"); b8=new JButton("%"); b9=new JButton("1/x");
a1=new JButton("Back"); a2=new JButton("C"); b12=new JButton("+/-");
n1=new JButton("1"); n2=new JButton("2"); n3=new JButton("3");
n4=new JButton("4"); n5=new JButton("5"); n6=new JButton("6");
n7=new JButton("7"); n8=new JButton("8"); n9=new JButton("9");
n0=new JButton("0"); pan1.add(tex);
GridLayout grid2=new GridLayout ();
pan1.setLayout(grid2);
//pan3布局策略为网格
tex.setBounds(45,25,200,35); tex.setHorizontalAlignment(JTextField.RIGHT);
//将文本输入框里的文字设成右对齐
pan1.setBounds(45,25,200,40); GridLayout grid1=new GridLayout (1,2);
pan2.setLayout(grid1);
//pan3布局策略为网格
pan2.setBounds(45,25,200,30); pan2.add(a1);pan2.add(a2);
GridLayout grid=new GridLayout (5,4); pan3.setLayout(grid);
//pan3布局策略为网格
pan3.setBounds(45,25,200,180);
pan3.add(n7);pan3.add(n8);pan3.add(n9);pan3.add(b5); pan3.add(n4);pan3.add(n5);pan3.add(n6);pan3.add(b4);
pan3.add(n1);pan3.add(n2);pan3.add(n3);pan3.add(b3); pan3.add(n0); pan3.add(b12); pan3.add(b1); pan3.add(b2);
pan3.add(b9); pan3.add(b8); pan3.add(b7); pan3.add(b6); add(pan1, BorderLayout.NORTH); add(pan3, BorderLayout.SOUTH);
add(pan2, BorderLayout.CENTER);
//**************//生成一个菜单栏*************************************/
JMenuBar bar=new JMenuBar(); setJMenuBar(bar); ButtonGroup g=new ButtonGroup();
fil=new JMenu("文件"); hp=new JMenu("帮助"); fil2=new JMenu("文件"); gy=new JMenuItem("关于");
fil.add(fil2); bar.add(fil); bar.add(hp); hp.add(gy); String [] s1={"打开","保存"};
JRadioButtonMenuItem []jj=new JRadioButtonMenuItem[ (s1.length) ];
for(int i=0;i<s1.length;i++) {
jj[i]=new JRadioButtonMenuItem(s1[i]); fil2.add(jj[i]); g.add(jj[i]);
}
//**************//退出事件实现*************************************/
tu=new JMenuItem("退出");
fil.add(tu);
tu.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
//******************禁止用户编辑事件*****************************************/
jz=new JMenuItem("禁止编辑");
fil.add(jz);
jz.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
tex.setVisible(false);
}
});
//**************//关于事件实现*************************************/
gy.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JMenuItem m=(JMenuItem)e.getSource();
if(m==gy)
JOptionPane.showMessageDialog(hp, "请查看帮助文档","帮助",JOptionPane.WARNING_MESSAGE);
}
});
//**************//注册事件*************************************/
b1.addActionListener(new anniu());
b2.addActionListener(new operation());
b3.addActionListener(new operation());
b4.addActionListener(new operation());
b5.addActionListener(new operation());
b6.addActionListener(new operation());
b7.addActionListener(new pingfang());
b8.addActionListener(new operation());
b9.addActionListener(new pingfang());
a1.addActionListener(new anniu());
a2.addActionListener(new anniu());
b12.addActionListener(new anniu());
n1.addActionListener(new anniu());
n2.addActionListener(new anniu()); n3.addActionListener(new anniu());
n4.addActionListener(new anniu()); n5.addActionListener(new anniu());
n6.addActionListener(new anniu()); n7.addActionListener(new anniu());
n8.addActionListener(new anniu()); n9.addActionListener(new anniu());
n0.addActionListener(new anniu());
}
//**************//“关于”平方实现事件*************************************/
class pingfang implements ActionListener {
public void actionPerformed(ActionEvent e) {
String get= e.getActionCommand();
if(get.equals("sqrt")) {
num=Double.parseDouble(tex.getText());
if(num>=0) tex.setText(""+Math.sqrt(num));
else { tex.setText("输入函数无效"); }
}
if(get.equals("1/x")) {
num=Double.parseDouble(tex.getText());
if(num!=0) tex.setText(""+1/num); else {
tex.setText("输入函数无效");
}
}
}
}
//*************定义内部类anniu*************************************/
class anniu implements ActionListener {
public void actionPerformed(ActionEvent e) {
String get = e.getActionCommand();
//得到事件源(即按钮)上的文字
if (start) { tex.setText(""); if (get.equals("+/-"))
//如果按了"-/+"按钮,就将数设成相反数
tex.setText(tex.getText() + "-");
start = false;
} if (!get.equals("+/-")) {
if (get.equals("Back")) {
String str = tex.getText();
if (str.length() > 0)
tex.setText(str.substring(0, str.length() - 1));
} else if ( get.equals("C")) {
tex.setText(""); tex.setText("0");
start = true;
} else tex.setText(tex.getText() + get);
}
}
}
class operation implements ActionListener {
public void actionPerformed(ActionEvent e) {
String get=e.getActionCommand();
if(start) ch=get;
else {
calculate(Double.parseDouble(tex.getText())); ch = get; start = true;
}
}
}
public void calculate(double x) {
if (ch.equals("+")) result =result+ x;
else if(ch.equals("-")) result -= x;
else if (ch.equals("*")) result *= x;
else if (ch.equals("÷")) result /= x;
else if (ch.equals("%")) result %= x;
else if (ch.equals("=")) result = x;
tex.setText("" + result);
}
public static void main(String[] args){
Demo frm=new Demo("计算器");
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frm.setVisible(true);
}
}