效果如下:
代码主要写成三个类了:
类1:
import java.awt.Color;
import java.awt.Font;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
public class CalculatorMain {
public static void main(String[] args) {
JFrame windows = new JFrame("计算器");
JTextField text = new JTextField();
Font f = new Font("楷体", Font.PLAIN, 25);
MyMenu myMenu = new MyMenu(windows, text);
windows.setLayout(null);
windows.setBounds(0, 0, 345, 326);//278
windows.setBackground(new Color(173,216,230));
windows.setResizable(false);//不能放大
windows.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
text.setBounds(10, 10, 322, 52);//244
text.setText("0");//初始化文本内容
text.setBackground(new Color(239,243,252));
text.setFont(f);
//text.setEditable(false);//使控件不可编辑
text.setFocusable(false);//使控件无法获取焦点
// text.setEnabled(false);//使控件不可用
// UIManager.put("TextField.inactiveForeground", new Color(255, 0, 0));
text.setBorder(BorderFactory.createLineBorder(new Color(143,158,176)));//边框颜色
text.setHorizontalAlignment(SwingConstants.RIGHT);
//声明按钮
MyButton Button1 = new MyButton("←", 62, 30, 10, 75, text);//17
MyButton Button2 = new MyButton("CE", 62, 30, 75, 75, text);//68
MyButton Button3 = new MyButton("C", 62, 30, 140, 75, text);//117
MyButton Button4 = new MyButton("±", 62, 30, 205, 75, text);//167
MyButton Button5 = new MyButton("√", 62, 30, 270, 75, text);//216
MyButton Button6 = new MyButton("7", 62, 30, 10, 111, text);
MyButton Button7 = new MyButton("8", 62, 30, 75, 111, text);
MyButton Button8 = new MyButton("9", 62, 30, 140, 111, text);
MyButton Button9 = new MyButton("/", 62, 30, 205, 111, text, 5);
MyButton Button10 = new MyButton("%", 62, 30, 270, 111, text, 4);
MyButton Button11 = new MyButton("4", 62, 30, 10, 147, text);
MyButton Button12 = new MyButton("5", 62, 30, 75, 147, text);
MyButton Button13 = new MyButton("6", 62, 30, 140, 147, text);
MyButton Button14 = new MyButton("*", 62, 30, 205, 147, text, 3);
MyButton Button15 = new MyButton("1/x", 62, 30, 270, 147, text);
MyButton Button16 = new MyButton("1", 62, 30, 10, 183, text);
MyButton Button17 = new MyButton("2", 62, 30, 75, 183, text);
MyButton Button18 = new MyButton("3", 62, 30, 140, 183, text);
MyButton Button19 = new MyButton("-", 62, 30, 205, 183, text, 2);
MyButton Button20 = new MyButton("=", 62, 66, 270, 183, text);
MyButton Button21 = new MyButton("0", 127, 30, 10, 219, text);
MyButton Button22 = new MyButton(".", 62, 30, 140, 219, text);//117
MyButton Button23 = new MyButton("+", 62, 30, 205, 219, text, 1);//167
windows.add(text);
windows.add(Button1);
windows.add(Button2);
windows.add(Button3);
windows.add(Button4);
windows.add(Button5);
windows.add(Button6);
windows.add(Button7);
windows.add(Button8);
windows.add(Button9);
windows.add(Button10);
windows.add(Button11);
windows.add(Button12);
windows.add(Button13);
windows.add(Button14);
windows.add(Button15);
windows.add(Button16);
windows.add(Button17);
windows.add(Button18);
windows.add(Button19);
windows.add(Button20);
windows.add(Button21);
windows.add(Button22);
windows.add(Button23);
windows.setVisible(true);//使窗口可显
}
}
类2:
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JTextField;
public class MyButton extends JButton{
private JTextField textField;
private int s;
static int judge = 0, state;
static double a, b;
MyButton button = this;
MyButton(String name, int width, int height, int x, int y, Object... text) {
Font f = new Font("楷体", Font.PLAIN, 17);
//实现可变参数
if (text.length != 0) {
for (Object t : text) {
if (t instanceof JTextField) {
this.textField = (JTextField)t;
}
if (t instanceof Integer) {
this.s = (Integer)t;
}
}
}
this.setFont(f);
this.setText(name);
this.setLocation(x, y);
this.setSize(width, height);
this.setFocusPainted(false);//去焦点
this.setBackground(new Color(235,238,241));
this.setBorder(BorderFactory.createLineBorder(new Color(143,158,176)));
//this.setBorder(BorderFactory.createLineBorder(new Color(248,220,42)));
//按钮监听事件
this.addMouseListener(new Mouse());
this.addMouseListener(new Mouse2());
this.addMouseListener(new Mouse3());
//this.addMouseListener(new Mouse4());
this.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
Double c = 0.0;
if (getText().equals("+")
|| getText().equals("-")
|| getText().equals("*")
|| getText().equals("/")
|| getText().equals("%")) {
MyButton.state = s;
try {
MyButton.a = Double.parseDouble(textField.getText());
} catch (NumberFormatException e1) {
System.out.println("数据出错!!!");
}
MyButton.judge = 1;
}else if (getText().equals("√")) {
double temp;
temp = Double.parseDouble(textField.getText());
temp = Math.sqrt(temp);
textField.setText(String.valueOf(temp));
MyButton.judge = 1;
}else if (getText().equals("1/x")) {
double temp;
temp = Double.parseDouble(textField.getText());
temp = 1 / temp;
textField.setText(String.valueOf(temp));
MyButton.judge = 1;
}else if (getText().equals("=")) {
try {
MyButton.b = Double.parseDouble(textField.getText());
} catch (NumberFormatException e1) {
System.out.println("数据出错!!!");
}
if (MyButton.state == 1) {
c = MyButton.a + MyButton.b;
}else if (MyButton.state == 2) {
c = MyButton.a - MyButton.b;
}else if (MyButton.state == 3) {
c = MyButton.a * MyButton.b;
}else if (MyButton.state == 5) {
c = MyButton.a / MyButton.b;
}else if (MyButton.state == 4) {
c = MyButton.a % MyButton.b;
}
textField.setText(String.valueOf(c));
MyButton.judge = 1;
}else if (getText().equals("←")) {
String str = textField.getText();
char[] str3 = str.toCharArray();
String str2 = "";
int len = str.length();
if (len != 1) {
for (int i = 0; i < len-1; i++) {
str2 += String.valueOf(str3[i]);
}
textField.setText(str2);
}else {
textField.setText("0");
}
}else if (getText().equals("CE")) {
textField.setText("0");
}else if (getText().equals("C")) {
String str = textField.getText();
char[] str3 = str.toCharArray();
String str2 = "";
int len = str.length();
if (len != 1) {
for (int i = 0; i < len-1; i++) {
str2 += String.valueOf(str3[i]);
}
textField.setText(str2);
}else {
textField.setText("0");
}
}else {
textField.setText(Show());
}
}
});
}
class Mouse extends MouseAdapter {
public void mouseEntered(MouseEvent e) {
// button.setBorder(BorderFactory.createLineBorder(new Color(248,220,42)));
// button.setBackground(new Color(255,212,114));
button.setBorder(BorderFactory.createLineBorder(new Color(143,158,176)));
button.setBackground(new Color(184,207,229));
}
}
class Mouse2 extends MouseAdapter {
public void mouseExited(MouseEvent e) {
button.setBorder(BorderFactory.createLineBorder(new Color(143,158,176)));
button.setBackground(new Color(235,238,241));
}
}
class Mouse3 extends MouseAdapter {
public void mouseClicked(MouseEvent e) {
button.setBackground(new Color(184,220,229));
}
}
public String Show() {
String text = new String();
if (this.judge == 0) {
if (this.textField.getText().equals("0.0") || this.textField.getText().equals("0")) {
if (this.getText().equals("±")) {
text = "-";
}else if (this.getText().equals(".")) {
text = "0";
}else {
text += this.getText();
}
}else {
if (this.getText().equals("±")) {
text = "-";
}else {
text = this.textField.getText();
if (text.indexOf(".") != -1 && this.getText().equals(".")
|| text.equals("-") && this.getText().equals(".")) {
text += "";
}else {
text += this.getText();
}
}
}
}else {
if (this.getText().equals("±")) {
text = "-";
this.judge = 0;
}else if (this.getText().equals(".")) {
text = this.textField.getText();
}else {
text = "";
text += this.getText();
this.judge = 0;
}
}
return text;
}
}
类3:
import java.awt.Color;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JTextField;
public class MyMenu {
private JMenuBar mb = new JMenuBar();
Font f = new Font("楷体", Font.PLAIN, 19);
Font f1 = new Font("楷体", Font.PLAIN, 18);
private JMenu advanced = new JMenu("高级");
private JMenu edit = new JMenu("编辑");
private JMenuItem advanced1 = new JMenuItem("表达式求值");
private JMenuItem copyItem = new JMenuItem("复制");
private JMenuItem pasteItem = new JMenuItem("粘贴");
private JMenu help = new JMenu("帮助");
private JMenuItem InformationItem = new JMenuItem("关于计算器");
MyMenu(JFrame windows, JTextField text) {
advanced1.setFont(f1);
copyItem.setFont(f1);
pasteItem.setFont(f1);
InformationItem.setFont(f1);
advanced.add(advanced1);
edit.add(copyItem);
edit.add(pasteItem);
edit.setFont(f);
advanced.setFont(f);
help.setFont(f);
help.add(InformationItem);
mb.add(advanced);
mb.add(edit);
mb.add(help);
mb.setBackground(new Color(238,238,238));
advanced1.setEnabled(false);
copyItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
StringSelection st = new StringSelection(text.getText());
clipboard.setContents(st, null);
}
});
pasteItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
if (clipboard.isDataFlavorAvailable(DataFlavor.stringFlavor)) {
try {
String content = (String)clipboard.getData(DataFlavor.stringFlavor);
text.setText(content);
} catch (UnsupportedFlavorException | IOException e1) {
System.out.println("剪切板为空!!!");
}
}
}
});
//信息提示框
JTextField text2 = new JTextField();
text2.setFocusable(false);
text2.setBackground(new Color(235,238,241));
text2.setFont(f);
text2.setText("可能有Bug,见谅!!!复制粘贴功能可用,高级中表达式求值功能不可用。");
JDialog d1 = new JDialog(windows, "提示", false);
d1.setBounds(20, 30, 300, 300);
d1.setResizable(false);
d1.add(text2);
d1.pack();
InformationItem.addActionListener(e -> d1.setVisible(true));
// copyItem.setFont(f1);
// pasteItem.setFont(f1);
// InformationItem.setFont(f1);
windows.setJMenuBar(mb);
}
class Mouse extends MouseAdapter {
public void mouseEntered(MouseEvent e) {
}
}
class Mouse2 extends MouseAdapter {
public void mouseExited(MouseEvent e) {
}
}
}
源码下载地址:http://download.youkuaiyun.com/my/uploads