java基础学习——Swing图形化用户界面编程

原文链接:https://blog.csdn.net/yiziweiyang/article/details/52317240

链接有详细解释,也有例子,以下是个人参照例子实验的代码。

package gui;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

/**
 * swing实现计算器功能
 * @author 乔成强
 * @version 创建时间:2018年5月11日  下午5:43:35
 */
public class GuiDemo extends JFrame implements ActionListener{
    
    private static final long serialVersionUID = 2499964079704437558L;  
      
    private JTextField result; // 显示运算结果的文本框  
    private JButton[] buttons; // 所有的按钮对象  
    private final String[] characters = { "7", "8", "9", "/", "4", "5", "6",  
            "*", "1", "2", "3", "-", "0", ".", "=", "+" }; // 所有的按钮文本  
    private boolean isFirstDigit = true; // 标记第一次输入数字  
    private String operator = "="; // 运算符  
    private double resultNum = 0.0; // 运算结果  
  
    public GuiDemo(String title) {  //构造器 这里记得修改为自己编写的类
        // 标题栏  
        super(title);  
        // 大小  
        setSize(220, 200);  
        // 居中  
        setLocationRelativeTo(null);  
        // 默认关闭操作  
        setDefaultCloseOperation(EXIT_ON_CLOSE);  
        // 禁止修改大小  
        setResizable(false);  
        // 初始化文本框与按钮  
        generateInterface();  
        // 显示  
        setVisible(true);  
    }  
  
    public static void main(String [] args){
        GuiDemo gd = new GuiDemo("计算器");
    } 
    /** 
     * 初始化文本框与按钮,生成界面 
     */  
    private void generateInterface() {  
        /* 文本框 */  
        result = new JTextField("0");  
        // 右对齐  
        result.setHorizontalAlignment(JTextField.RIGHT);  
        // 不允许编辑  
        result.setEditable(false);  
        // 将文本框添加到窗体北方  
        add(result, BorderLayout.NORTH);  
  
        /* 按钮 */  
        buttons = new JButton[characters.length];  
        JPanel pnl = new JPanel(new GridLayout(4, 4, 5, 5));  
        for (int i = 0; i < buttons.length; i++) {  
            buttons[i] = new JButton(characters[i]);  
            buttons[i].addActionListener(this);  
            buttons[i].setFocusable(false); // 不允许按钮定位焦点  
            pnl.add(buttons[i]);  
        }  
        // 将所有按钮添加到窗体的中间  
        add(pnl, BorderLayout.CENTER);  
  
        // 允许内容面板定位焦点  
        this.getContentPane().setFocusable(true);  
  
        // 注册内容面板事件监听器  
        // 使用适配器实现  
        this.getContentPane().addKeyListener(new KeyAdapter() {  
            @Override  
            public void keyPressed(KeyEvent e) {  
                char ch = e.getKeyChar(); // 获取按钮字符  
                /* 处理数字或运算符 */  
                if ('.' == ch || Character.isDigit(ch)) { // 数字小数点  
                    handleNumber(String.valueOf(ch));  
                } else if ("+-*/=".indexOf(ch) != -1 || e.getKeyCode() == 10) { // 运算符  
                    handleOperator(String.valueOf(ch));  
                } else if (e.getKeyCode() == 8) { // 退格键  
                    String tmp = result.getText();  
                    if (tmp.length() == 1) {  
                        result.setText("0");  
                        isFirstDigit = true;  
                    } else {  
                        result.setText(tmp.substring(0, tmp.length() - 1));  
                    }  
                }  
            }  
        });  
    }  
  
    @Override  
    public void actionPerformed(ActionEvent e) {  
        // 获取点击按钮的文本  
        String text = e.getActionCommand();  
  
        /* 处理数字或运算符 */  
        if (".".equals(text) || Character.isDigit(text.charAt(0))) { // 数字小数点  
            handleNumber(text);  
        } else if ("+-*/=".indexOf(text) != -1) { // 运算符  
            handleOperator(text);  
        }  
    }  
  
    /** 
     * 处理数字与小数点 
     *  
     * @param text 
     */  
    private void handleNumber(String text) {  
        if (isFirstDigit) { // 第一次输入  
            if (".".equals(text)) {  
                this.result.setText("0.");  
            } else {  
                this.result.setText(text);  
            }  
        } else if ("0".equals(text) && "0".equals(this.result.getText())) { // 输入0  
            isFirstDigit = true;  
            return;  
        } else if (".".equals(text) && this.result.getText().indexOf(".") == -1) { // 输入小数点  
            this.result.setText(this.result.getText() + ".");  
        } else if (!".".equals(text)) { // 输入不为小数点  
            this.result.setText(this.result.getText() + text);  
        }  
        // 修改第一次输入标记  
        isFirstDigit = false;  
    }  
  
    /** 
     * 处理运算符 
     *  
     * @param text 
     */  
    private void handleOperator(String text) {  
        /* 进行算术运算判断 */  
        switch (operator) {  
        case "+":  
            resultNum += Double.parseDouble(this.result.getText());  
            break;  
        case "-":  
            resultNum -= Double.parseDouble(this.result.getText());  
            break;  
        case "*":  
            resultNum *= Double.parseDouble(this.result.getText());  
            break;  
        case "/":  
            resultNum /= Double.parseDouble(this.result.getText());  
            break;  
        case "=":  
            resultNum = Double.parseDouble(this.result.getText());  
            break;  
        }  
        // 将运算结果显示到文本框中  
        this.result.setText(String.valueOf(resultNum));  
        // 将参数运算符放入成员变量中  
        this.operator = text;  
        // 下一个数字是第一次输入  
        isFirstDigit = true;  
    }  

}

 

posted @ 2018-05-11 17:46  背着泰山找黄河  阅读(407)  评论(0编辑  收藏  举报