import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Calculator extends JFrame implements ActionListener
{
    private boolean dotExist, operated, equaled; // 帮助运算的布尔变量
    private double storedNumber; // 目前的结果
    private char lastOperator; // 表示上一运算符
    private JTextField operation; // 结果栏
    private JButton dot, plus, minus, multi, div, sqrt, equal, changePN, clear; // 运算符
    private JButton[] numbers; // 数字
    // 构造者
    public Calculator()
    {
        setTitle("Calculator");
        // 初始化变量
        dotExist = false; // 表示当前的数是否有小数点
        operated = false; // 表示任意运算符是否被按下
        equaled = false; // 表示等号是否被按下
        storedNumber = 0;
        lastOperator = '?';
        // 初始化窗口变量
        operation = new JTextField("0");
        operation.setEditable(false);
        numbers = new JButton[10];
        for (int i = 0; i < 10; i++)
          numbers[i] = new JButton("" + i);
        dot = new JButton(".");
        plus = new JButton("+");
        minus = new JButton("-");
        multi = new JButton("*");
        div = new JButton("/");
        sqrt = new JButton("√");
        equal = new JButton("=");
        changePN = new JButton("±");
        clear = new JButton("AC");
        // 将窗口物体放入窗口
        GridBagLayout layout = new GridBagLayout();
        getContentPane().setLayout(layout);
        addComponent(layout, operation, 0, 0, 4, 1);
        addComponent(layout, numbers[1], 1, 0, 1, 1);
        addComponent(layout, numbers[2], 1, 1, 1, 1);
        addComponent(layout, numbers[3], 1, 2, 1, 1);
        addComponent(layout, numbers[4], 2, 0, 1, 1);
        addComponent(layout, numbers[5], 2, 1, 1, 1);
        addComponent(layout, numbers[6], 2, 2, 1, 1);
        addComponent(layout, numbers[7], 3, 0, 1, 1);
        addComponent(layout, numbers[8], 3, 1, 1, 1);
        addComponent(layout, numbers[9], 3, 2, 1, 1);
        addComponent(layout, dot, 4, 0, 1, 1);
        addComponent(layout, numbers[0], 4, 1, 1, 1);
        addComponent(layout, sqrt, 4, 2, 1, 1);
        addComponent(layout, plus, 1, 3, 1, 1);
        addComponent(layout, minus, 2, 3, 1, 1);
        addComponent(layout, multi, 3, 3, 1, 1);
        addComponent(layout, div, 4, 3, 1, 1);
        addComponent(layout, equal, 5, 0, 2, 1);
        addComponent(layout, changePN, 5, 2, 1, 1);
        addComponent(layout, clear, 5, 3, 1, 1);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    // 对按钮进行反应的方法
    public void actionPerformed(ActionEvent e)
    {
        JButton btn = (JButton)e.getSource();
        if (btn == clear)
        {
            operation.setText("0");
            dotExist = false;
            storedNumber = 0;
            lastOperator = '?';
        }
        else if (btn == equal)
        {
            operate('=');
            equaled = true;
        }
        else if (btn == plus)
        {
            operate('+');
            equaled = false;
        }
        else if (btn == minus)
        {
            operate('-');
            equaled = false;
        }
        else if (btn == multi)
        {
            operate('*');
            equaled = false;
        }
        else if (btn == div)
        {
            operate('/');
            equaled = false;
        }
        else if (btn == changePN)
        {
            operate('p');
            operate('=');
            equaled = true;
        }
        else if (btn == sqrt)
        {
            operate('s');
            operate('=');
            equaled = true;
        }
        else
        {
            if (equaled)
              storedNumber = 0;
            for (int i = 0; i < 10; i++)
              if (btn == numbers[i])
              {
                  if (operation.getText().equals("0"))
                    operation.setText("" + i);
                  else if(! operated)
                    operation.setText(operation.getText() + i);
                  else
                  {
                      operation.setText("" + i);
                      operated = false;
                  }
              }
            if (btn == dot && ! dotExist)
            {
                operation.setText(operation.getText() + ".");
                dotExist = true;
            }
        }
    }
    // 进行运算的方法
    private void operate(char operator)
    {
        double currentNumber = Double.valueOf(operation.getText()).doubleValue();
        if (lastOperator == '?')
          storedNumber = currentNumber;
        else if (lastOperator == '+')
          storedNumber += currentNumber;
        else if (lastOperator == '-')
          storedNumber -= currentNumber;
        else if (lastOperator == '*')
          storedNumber *= currentNumber;
        else if (lastOperator == '/')
          storedNumber /= currentNumber;
        else if (lastOperator == 'p')
          storedNumber *= -1;
        else if (lastOperator == 's')
          storedNumber = Math.sqrt(currentNumber);
        else if (lastOperator == '=' && equaled)
          storedNumber = currentNumber;
        operation.setText("" + storedNumber);
        operated = true;
        lastOperator = operator;
    }
    // 快捷使用GridBagLayout的方法
    private void addComponent(GridBagLayout layout, Component component, int row, int col, int width, int height)
    {
        GridBagConstraints constraints = new GridBagConstraints();
        constraints.fill = GridBagConstraints.BOTH;
        constraints.insets = new Insets(10, 2, 10, 2);
        constraints.weightx = 100;
        constraints.weighty = 100;
        constraints.gridx = col;
        constraints.gridy = row;
        constraints.gridwidth = width;
        constraints.gridheight = height;
        layout.setConstraints(component, constraints);
        if (component instanceof JButton)
          ((JButton)component).addActionListener(this);
        getContentPane().add(component);
    }
    // 主方法初始化并显示窗口
    public static void main(String[] args)
    {
        Calculator calc = new Calculator();
        calc.setSize(290, 400);
        calc.setVisible(true);
    }
}
我用myeclipse把上面的程序打成jar包后,可以执行,但是执行后进程中一直有javaw.exe,这样我就不能对jar包挪动位置修改名字等操作,我在网上查到了相关的解决办法,在构造方法中加入setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);但是还是不行,请各位帮忙看一下,谢谢!
学习中~~~

解决方案 »

  1.   

    说明一下
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    中的 和我是想突出一下颜色,并不是代码中的,但是没显示出来红色字,呵呵。
      

  2.   

     color=#FF0000   /color
      

  3.   

    这个javaw.exe应该是你的eclipse进程吧
      

  4.   

    eclipse关掉了,把所有javaw.exe关掉后,可以对jar包进行位置移动,也就没有提示说jar包现在被使用,但是双击后,还是在进程中有javaw.exe。所以这个jar包正在被使用,就不能被移动了
      

  5.   

    加一个windowsClose的Listener
    方法加上
    System.exit(0);
      

  6.   

    在JFrame的构造函数里加上
    this.addWindowListener(
           new WindowAdapter() {
      public void windowClosing(WindowEvent we){
      System.exit(0);
        }
     }
      );