Java计算器布局较好

package com.duan;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Calculator extends JFrame implements ActionListener{
private static final long serialVersionUID = 1L;
private JButton[] btn;
private String[] labels = {"MC","MR","MS","M+","M-",
"←","CE","C","±","√",
"7","8","9","/","%",
"4","5","6","*","1/x",
"1","2","3","-","=",
"0",".","+"};
private double d1 = 0.0, d2 = 0.0;
private String opt = "操作符";
private JTextArea result = new JTextArea("0",3,20);

public Calculator(String title)
{
super(title);
this.setVisible(true);
this.setBounds(400, 300, 200, 350);
result.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
addMenu();

btn = new JButton[28];
for(int i=0;i<btn.length;i++)
{
btn[i] = new JButton(labels[i]);
}

this.add(result, BorderLayout.NORTH);
Panel p = new Panel();
p.setLayout(new GridLayout(3,1));

Panel p1 = new Panel();
p1.setLayout(new GridLayout(2,5,2,2));
for(int i=0;i<10;i++)
{
p1.add(btn[i]);
}
Panel p2 = new Panel();
p2.setLayout(new GridLayout(2,5,2,2));
for(int i=10;i<20;i++)
{
p2.add(btn[i]);
}
Panel p3 = new Panel();
GridBagLayout gridbag = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
p3.setLayout(gridbag);
c.fill = GridBagConstraints.BOTH;
c.insets = new Insets(1,1,0,0);

c.weightx = 1.0;
addButton(p3,btn[20],gridbag,c);
addButton(p3,btn[21],gridbag,c);
addButton(p3,btn[22],gridbag,c);
addButton(p3,btn[23],gridbag,c);

c.gridwidth =GridBagConstraints.REMAINDER;
c.gridheight=2;
addButton(p3,btn[24],gridbag,c);

//0
c.gridx = 0;
c.gridwidth=2;
c.gridheight=1;
addButton(p3,btn[25],gridbag,c);

c.gridx=2;
c.gridwidth=1;
c.gridheight=1;
addButton(p3,btn[26],gridbag,c);
//+
c.gridx=3;
c.gridwidth=1;
c.gridheight=1;
addButton(p3,btn[27],gridbag,c);


p.add(p1);
p.add(p2);
p.add(p3);
this.add(p,BorderLayout.CENTER);

this.pack();
this.setResizable(false);

//for(int i=0;i<28;i++)
// System.out.println("btn["+i+"]: "+btn[i].getActionCommand());
for(int i=0;i<28;i++)
btn[i].addActionListener(this);

//关闭窗口
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
}

public void addMenu()
{

JMenuBar mb = new JMenuBar();
//查看
JMenu viewMenu = new JMenu("查看(V)");
viewMenu.setMnemonic('V');
JMenuItem stardardItem = new JMenuItem("标准型");
JMenuItem scienceItem = new JMenuItem("科学型");
JMenuItem digitalItem = new JMenuItem("数字统计");
JMenuItem basicItem = new JMenuItem("基本");

//编辑
JMenu editMenu = new JMenu("编辑(E)");
editMenu.setMnemonic('E');
final JMenuItem copyItem = new JMenuItem("复制(C)");
copyItem.setAccelerator(KeyStroke.getKeyStroke('C',InputEvent.CTRL_MASK));
copyItem.setMnemonic('C');
copyItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
result.selectAll();
result.copy();
}
});
final JMenuItem pasteItem = new JMenuItem("粘贴(V)");
pasteItem.setAccelerator(KeyStroke.getKeyStroke('V',InputEvent.CTRL_MASK));
pasteItem.setMnemonic('V');
pasteItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
result.paste();
}
});

final JMenuItem cutItem = new JMenuItem("剪切(X)");
cutItem.setAccelerator(KeyStroke.getKeyStroke('X',InputEvent.CTRL_MASK));
cutItem.setMnemonic('X');
cutItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
result.selectAll();
result.cut();
}
});

//帮助
JMenu helpMenu = new JMenu("帮助(H)");
helpMenu.setMnemonic('H');
JMenuItem viewHelpItem = new JMenuItem("查看帮助");
JMenuItem aboutItem = new JMenuItem("关于计算器");

//添加菜单项
viewMenu.add(stardardItem);
viewMenu.add(scienceItem);
viewMenu.addSeparator();
viewMenu.add(digitalItem);
viewMenu.addSeparator();
viewMenu.add(basicItem);

editMenu.add(copyItem);
editMenu.add(pasteItem);
editMenu.add(cutItem);

helpMenu.add(viewHelpItem);
helpMenu.addSeparator();
helpMenu.add(aboutItem);

//添加菜单
mb.add(viewMenu);
mb.add(editMenu);
mb.add(helpMenu);

final JPopupMenu pm = new JPopupMenu();
pm.add(copyItem);
pm.add(pasteItem);
pm.add(cutItem);
result.addMouseListener(new MouseAdapter()
{
public void mouseReleased(MouseEvent e)
{
if(e.isPopupTrigger())
pm.show(result,e.getX(),e.getY());
}
});
result.add(pm);
this.setJMenuBar(mb);
}


public void addButton(Panel p,JButton btn,GridBagLayout g, GridBagConstraints c)
{
g.setConstraints(btn, c);
p.add(btn);
}

public static void main(String[] args) {
new Calculator("Java 计算器");
}

@Override
public void actionPerformed(ActionEvent e) {
Object t = e.getSource();
try{
//0-9的数字按钮
for(int i=25;i<26;i++)
if(t.equals(btn[i]))
result.setText(result.getText()+(i-25));//0
for(int i=20;i<23;i++)
if(t.equals(btn[i]))
result.setText(result.getText()+(i-19));//1 2 3
for(int i=15;i<18;i++)
if(t.equals(btn[i]))
result.setText(result.getText()+(i-11));//4 5 6
for(int i=10;i<13;i++)
if(t.equals(btn[i]))
result.setText(result.getText()+(i-3));// 7 8 9
//加法+
if(t.equals(btn[27]))
{
d1 = Double.parseDouble(result.getText());
System.out.println(d1);
result.setText("");
opt = "+";
}

//减法-
if(t.equals(btn[23]))
{
d1 = Double.parseDouble(result.getText());
System.out.println(d1);
result.setText("");
opt = "-";
}

//乘法*
if(t.equals(btn[18]))
{
d1 = Double.parseDouble(result.getText());
System.out.println(d1);
result.setText("");
opt = "*";
}

//除法/
if(t.equals(btn[13]))
{
d1 = Double.parseDouble(result.getText());
System.out.println(d1);
result.setText("");
opt = "/";
}
//取模
if(t.equals(btn[14]))
{
d1 = Double.parseDouble(result.getText());
System.out.println(d1);
result.setText("");
opt = "%";
}
//四则运算、取模结果
if(t.equals(btn[24]))
{
d2 = Double.parseDouble(result.getText());
System.out.println(d2);
//result.setText("");
if(opt.equals("+"))
result.setText(""+(d1+d2));
else if(opt.equals("-"))
result.setText(""+(d1-d2));
else if(opt.equals("*"))
result.setText(""+(d1*d2));
else if(opt.equals("/"))
{
if(d2 == 0)
result.setText("除数不能为0");
else
result.setText(""+(d1/d2));
}
else if(opt.equals("%"))
result.setText(""+(d1%d2));
}
//求导
if(t.equals(btn[19]))
{
d1 = Double.parseDouble(result.getText());
System.out.println(d1);
opt = "1/x";
if(opt.equals("1/x"))
result.setText(""+(1/d1));
}
//开方
if(t.equals(btn[9]))
{
d1 = Double.parseDouble(result.getText());
System.out.println(d1);
opt = "√";
if(opt.equals("√"))
{
if(d1 > 0)
result.setText(""+Math.sqrt(d1));
else
result.setText("负数没有平方根");
}
}
//CE or C
if(t.equals(btn[6]) || t.equals(btn[7]))
{
result.setText("");
}
//←
if(t.equals(btn[5]))
{
String s = result.getText();
result.setText(s.substring(0,s.length()-1));
}
//±
if(t.equals(btn[8]))
{
d1 = Double.parseDouble(result.getText());
result.setText(""+(-d1));
}
//.
if(t.equals(btn[26]))
{
if(result.getText().trim().indexOf(".") != -1) //判断字符串中是否已经包含了小数点
{
}
else //如果没有小数点
{
if(result.getText().trim().equals("0"))//如果开始为0
{
result.setText(("0"+e.getActionCommand()).toString());
}
else if(result.getText().trim().equals(""))//如果初时显示为空
{
}
else
{
result.setText((result.getText()+e.getActionCommand()).toString());
}
}
}
}catch(Exception ee){}

}
}

原文地址:https://www.cnblogs.com/duanqibo/p/11103106.html