利用Swing和GUI的相关知识,设计并编程实现一个GUI简易计算器,要求:
(1)至少实现“+”、“-”、“*”、“/”、“%”的运算;
(2)调用Math类的相关方法,至少实现对数运算、幂运算;
(3)利用菜单条、菜单项、菜单至少实现软件的“退出”的功能,并添加对应的快捷键,设置为“Ctrl+E”;
(4)检查数据的合法性,若输入数据不合法,则调用文本框类的相关方法,弹出窗口提示用户进行正确的输入;
(5)体现出是自己的工作量,界面至少显示作者的班级、姓名、学号。
Computer.java
public class Computer {
public static void main(String[] args) {
WindowOperation win=new WindowOperation();
win.setBounds(700,300,500,400); //设置窗口在屏幕上的位置及大小
win.setTitle("GUI简易计算器"); //标题
}
}
ComputerListener.java
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;
}
//调用Math实现对数运算
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);
}
textShow.setText(""); //每次计算前清空之前的信息
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
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;
}
}
OperatorListener.java
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);
}
}
WindowOperation.java
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{
private static final long serialVersionUID = 1L; //定义程序序列化ID,保持不同版本的兼容性
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);
}
@SuppressWarnings("deprecation")
void init(){
getContentPane().setLayout(new FlowLayout());
inputNumberOne =new JTextField(5);
inputNumberTwo =new JTextField(5);
choiceFuhao =new JComboBox<String>();
button = new JButton("计算");
choiceFuhao.addItem("JM选择哪一种运算");
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){}
});
//实现软件的复制功能,快捷键为“Ctrl+C”
copyItem=new JMenuItem("复制");
copyItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_MASK));
copyItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){mediator.copy();
}
});
//实现软件的剪切功能,快捷键为“Ctrl+X”
cutItem=new JMenuItem("剪切");
cutItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,InputEvent.CTRL_MASK));
cutItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){mediator.cut();
}
});
//实现软件的粘贴功能,快捷键为“Ctrl+V”
pasteItem=new JMenuItem("粘贴");
pasteItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,InputEvent.CTRL_MASK));
pasteItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){mediator.paste();
}
});
//(3)利用菜单条、菜单项、菜单至少实现软件的“退出”的功能,
//并添加对应的快捷键,设置为“Ctrl+E”;
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));
//(5)体现出是自己的工作量,界面至少显示作者的班级、姓名、学号。
JLabel biaoqian=new JLabel("软件1111 学号 姓名 ");
getContentPane().add(biaoqian);
}
public JTextField getTextField() {
return textField;
}
public void setTextField(JTextField textField) {
this.textField = textField;
}
}