GUI简易计算器(JFrame)带粘贴复制剪切退出,带快捷键

本文介绍了一个使用Java Swing构建的简易计算器应用程序。该应用采用中介者模式实现了文本框输入、下拉列表选择运算符、按钮计算结果等功能,并集成了复制、粘贴、剪切等文本操作。此外,还详细说明了代码组织及实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        在展示代码之前先写一下我的思路吧,尤其是粘贴复制这块,网上其他的博客都是右键弹出的菜单,或者是别的,千篇一律都是复制别人的 ,全都一个样 。我的粘贴复制部分用的是中介者模式,相对比较清楚一点,不像网上其他的代码零零散散,不容易理解,也不容易弄到自己的工程里运行参考。


下面是我的思路,代码在后面。

1. 创建JFrame名为WindowOperation;

1.1使用JTextField类创建文本框inputNumberOneinputNumberTwo;

   使用JComboBox类创建下拉列表ChoiceFuhao;

   使用JTextArea类创建文本区textShow

   使用JButton类创建按钮button

   使用JMenuBar类创建菜单条menubar

   使用JMenu类创建菜单menu

   使用JMenuItem创建菜单项copyItem,cutItem,pasteItem,quitItem;

   创建监视器OperatorListener对象operator

   创建监视器ComputerListener对象computer

1.2 WindowOperation的构造方法,调用方法init(),并设置窗口可见,设置用户关闭按钮时程序的操作;

1.3创建void的方法init(),使用Layout布局;对各个容器进行定义,使用中介者类ConcreteMediator中的方法实现复制,剪切,粘贴,退出,并使用setAccelerator(Krystroke.getKeyStroke()),来设置快捷键;

1.4使用add(),将各个组件进行添加;

2. 创建类OperatorListener,来注册监视器operator,利用用户下拉列表来触发ItemEvent事件,ItemEvent事件的监视器operator()获取运算符,并传递给ActionEvent事件的监视器computer

3. 创建类Computer,注册监视器computer,用户通过单击按钮触发ActionEvent事件,监视器computer()给出运算结果;

3.1定义方法setJTextFieldOne(),setJTextFieldTwo(),setJTextArea(),

setFuhao(),来设置文本框1,文本框2,文本域,符号;

3.2定义方法actionPerformed(),使用inputNumberOne.getText()inputNumberOne.getText()来获取文本框输入的值,使用fuhao.equals()通过比较得到所输入的符号,通过数学计算来得到结果result,最后将result显示在textshow中;

3.3如果文本框为空或符号没有选择则各自触发异常,弹出警告;

4.创建中介者类ConcreteMediator();

4.1定义public void类型的方法openMenu(),定义String类型变量str,通过text.getSelectedText(),来获得所选的内容,如果为空则调用方法copyItem.setEnabled(flase),pasteItem.setEnabled(false),来禁用此选项,否则为true

4.2定义public void类型方法patse(),copy(),cut(),来实现粘贴复制剪切操作;

5.创建类Computer;

5.1创建main()方法;

5.2使用WindowOperation类来创建对象win;

通过win调用方法setBounds()设置JFrame的窗口大小;

调用方法setTitle()设置标题;



下面是我的代码:

要参考的话直接建几个class,粘贴复制我的代码到相应的class即可,绝对完美运行。

Computer.java

package cn.hanfeng.computer;


public class Computer {
     public static void main(String args[]){
    WindowOperation win=new WindowOperation();
    win.setBounds(100,100,390,360);
    win.setTitle("计算器");
     }
}


WindowOperation.java


package cn.hanfeng.computer;


import java.awt.BorderLayout;
import java.awt.EventQueue;


import javax.swing.border.EmptyBorder;


import java.awt.FlowLayout;


import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
public class WindowOperation extends JFrame {
    JTextField inputNumberOne,inputNumberTwo;
    JComboBox<String>choiceFuhao;
    JTextArea textShow;
    JButton button;
    JMenuBar menubar;
    JMenu menu;
    JMenuItem copyItem,cutItem,pasteItem,quitItem;
    OperatorListener operator;
    ComputerListener computer;
    private JTextField textField;
    public WindowOperation(){
    init();
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    
    void init(){
    getContentPane().setLayout(new FlowLayout());
    inputNumberOne =new JTextField(5);
    inputNumberTwo =new JTextField(5);
    choiceFuhao =new JComboBox<String>();
    button = new JButton("计算");
    choiceFuhao.addItem("选择运算符号");
    String []a={"+","-","*","/","%","幂运算","对数运算"};
    for(int i=0; i<a.length;i++){
    choiceFuhao.addItem(a[i]);
    }
    textShow =new JTextArea(9,30);
    operator =new OperatorListener();
    computer =new ComputerListener();
    ConcreteMediator mediator=new ConcreteMediator();
    menubar=new JMenuBar();
    menu=new JMenu("编辑");
    menu.addMenuListener(new MenuListener(){
    public void menuSelected(MenuEvent e){mediator.openMenu();}
    public void menuDeselected(MenuEvent e){}
    public void menuCanceled(MenuEvent e){}
   
    });
    copyItem=new JMenuItem("复制");
    copyItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_MASK));
    copyItem.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e){mediator.copy();
    }
    });
    cutItem=new JMenuItem("剪切");
    cutItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,InputEvent.CTRL_MASK));
    cutItem.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e){mediator.cut();
    }
    });
    pasteItem=new JMenuItem("粘贴");
    pasteItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,InputEvent.CTRL_MASK));
    pasteItem.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e){mediator.paste();
    }
    });
quitItem = new JMenuItem("退出");
quitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E,InputEvent.CTRL_MASK));
quitItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
    
    operator.setJComboBox(choiceFuhao);
    operator.setWorkTogether(computer);
    computer.setJTextFieldOne(inputNumberOne);
    computer.setJTextFieldTwo(inputNumberTwo);
    computer.setJTextArea(textShow);
    choiceFuhao.addItemListener(operator);
    button.addActionListener(computer);
    
    menubar.add(menu);
    menu.add(cutItem);
    menu.add(copyItem);
    menu.add(pasteItem);
    menu.add(quitItem);
    setJMenuBar(menubar);
    add(textShow,BorderLayout.CENTER);


    mediator.registerMenu(menu);
mediator.registerCopyItem(copyItem);
mediator.registerCutItem(cutItem);
mediator.registerPasteItem(pasteItem);
mediator.registerText(textShow);
    
    getContentPane().add(inputNumberOne);
    getContentPane().add(choiceFuhao);
    getContentPane().add(inputNumberTwo);
    getContentPane().add(button);
    getContentPane().add(new JScrollPane(textShow));
    JLabel biaoqian=new JLabel("韩锋 ");
    getContentPane().add(biaoqian);




    }
}



OperatorListener.java


package cn.hanfeng.computer;


import java.awt.event.*;
import  javax.swing.*;
public class OperatorListener implements ItemListener {
      JComboBox <String>choice;
      ComputerListener workTogether;
      public void setJComboBox(JComboBox<String> box){
     choice=box;
      }
      public void setWorkTogether(ComputerListener computer){
     workTogether =computer;
     
      }
      public void itemStateChanged(ItemEvent e){
     String fuhao =choice.getSelectedItem().toString();
     workTogether.setFuhao(fuhao);
      }
}



ComputerListener.java


package cn.hanfeng.computer;
import java.awt.event.*;
import  javax.swing.*;
import java.awt.*;
public  class ComputerListener implements ActionListener {
       JTextField  inputNumberOne,inputNumberTwo;
       JTextArea textShow;
       String fuhao=" ";


       public void setJTextFieldOne(JTextField t){
      inputNumberOne =t;
       }
       public void setJTextFieldTwo(JTextField t){
      inputNumberTwo =t;
       }
       public void setJTextArea(JTextArea area){
      textShow =area;
       }
       public void setFuhao(String s){
      fuhao=s;
       }
       static public double log(double value, double base) {
      double a=0;
      a=Math.log(value)/Math.log(base);    
      return a;
      }
       public void actionPerformed(ActionEvent e){
        try{
          double number1;
          double number2;
      double result=0;
      number1=Double.parseDouble(inputNumberOne.getText());
      number2=Double.parseDouble(inputNumberTwo.getText());
      if(fuhao.equals("+")){
      result=number1+number2;
      }
      else if(fuhao.equals("-")){
      result=number1-number2;  
      }
      else if(fuhao.equals("*")){
      result=number1*number2;  
      }
      else if(fuhao.equals("/")){
      result=number1/number2;  
      }
      else if(fuhao.equals("%")){
      result=number1%number2;  
      }
      else if(fuhao.equals("幂运算")){
      result=Math.pow(number1, number2);
      }
      else if(fuhao.equals("对数运算")){
      result=log(number1,number2);
      }
               
                if(fuhao.equals(" ")){
              JOptionPane.showMessageDialog(null,"请输入运算符号","警告对话框",JOptionPane.WARNING_MESSAGE);
               }
               else{
      textShow.append(number1+" "+fuhao+" "+number2+"="+result+"\n");
               }
        }
        catch(Exception exp){
        JOptionPane.showMessageDialog(null,"请输入数字","警告对话框",JOptionPane.WARNING_MESSAGE);
        }
       }
}


ConcreteMediator.java


package cn.hanfeng.computer;


import javax.swing.*;
import java.awt.datatransfer.*;




public class ConcreteMediator {
     JMenu menu;
     JMenuItem copyItem,cutItem,pasteItem;
     JTextArea text;
     public void openMenu(){
    Clipboard clipboard =text.getToolkit().getSystemClipboard();
    String str =text.getSelectedText();
    if(str==null){
    copyItem.setEnabled(false);
    cutItem.setEnabled(false);
    }
    else{
    copyItem.setEnabled(true);
    cutItem.setEnabled(true);
    }
    boolean boo =clipboard.isDataFlavorAvailable(DataFlavor.stringFlavor);
    if(boo){
    pasteItem.setEnabled(true);
    }
     }
     public void paste(){
    text.paste();
     }
     public void copy(){
    text.copy();
     }
     public void cut(){
    text.cut();
     }
     public void registerMenu(JMenu menu){
    this.menu=menu;
     }
     public void registerPasteItem(JMenuItem item){
    pasteItem=item;
     }
     public void registerCopyItem(JMenuItem item){
    copyItem=item;
    copyItem.setEnabled(false);
     }
     public void registerCutItem(JMenuItem item){
    cutItem =item;
    cutItem.setEnabled(false);
     }
     public void registerText(JTextArea text){
    this.text=text;
     }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值