Java实验八

《Java程序设计》课程第八周实验题目和代码。

实验内容:Swing常用组件和布局和事件处理

1、 设计一个基于 Swing 的菜单条,用于实现文件、编辑、视图和帮助操作。

  1. 本实验要求设计上图的窗口、菜单条、菜单和菜单项(包括子菜单)。
  2. 在创建菜单项时,不考虑使用图标,但是考虑水平分割线。
  3. 编辑、视图和帮助三个菜单,不需要创建菜单项。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
//设计一个基于 Swing 的菜单条,用于实现文件、编辑、视图和帮助操作。
//1) 本实验要求设计上图的窗口、菜单条、菜单和菜单项(包括子菜单)。
//2) 在创建菜单项时,不考虑使用图标,但是考虑水平分割线。
//3) 编辑、视图和帮助三个菜单,不需要创建菜单项。

import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.Dimension;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JRadioButton;
import javax.swing.KeyStroke;


public class TestOne {
public static void main(String args[]) {
Menu menu = new Menu("典型的菜单界面");
menu.setBounds(100, 100, 500, 300);
}

}


class Menu extends JFrame{
JMenuBar menubar; //菜单条
JMenu menuFile; //菜单文件
JMenu menuEdit; //菜单编辑
JMenu menuView; //菜单视图
JMenu menuHelp; //菜单帮助
JMenuItem itemNew, itemOpen,itemClose,itemSave,itemSaveAs,itemExit; //菜单项
JMenu subType; //子菜单文件类型
JMenuItem jm1,jm2,jm3,jm4; //子菜单菜单项
JCheckBox checkBox1,checkBox2; //复选框
JRadioButton radio1,radio2; //可选按钮

public Menu() {}
public Menu(String string) {
init(string);
setVisible(true);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
}

void init(String s) {
setTitle(s);
//变量赋初值
menubar = new JMenuBar();
menuFile = new JMenu("文件");
menuEdit = new JMenu("编辑");
menuView = new JMenu("视图");
menuHelp = new JMenu("帮助");

itemNew = new JMenuItem("新建文件");
itemOpen = new JMenuItem("打开文件");
itemClose = new JMenuItem("关闭文件");
subType = new JMenu("文件格式");
itemSave = new JMenuItem("保存文件");
itemSaveAs = new JMenuItem("文件另存为");
itemExit = new JMenuItem("退出");
jm1=new JMenuItem("Java文件");
jm2=new JMenuItem("Txt文件");
jm3=new JMenuItem("只读");
jm4=new JMenuItem("只写");

checkBox1 = new JCheckBox("Java文件");
checkBox2 = new JCheckBox("Txt文件");
radio1 = new JRadioButton("只读");
radio2 = new JRadioButton("只写");


checkBox1.setSelected(true); //复选框checkBox1默认选中
radio1.setSelected(true); //可选按钮 radio1默认选中
jm1.setPreferredSize(new Dimension(110,30)); //子菜单jm1菜单项设置大小

//设置菜单项的键盘操作方式是Ctrl+O和Ctrl+S键
KeyStroke Ctrl_cutKey =
KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_MASK);
itemNew.setAccelerator(Ctrl_cutKey);
Ctrl_cutKey =
KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK);
itemOpen.setAccelerator(Ctrl_cutKey);
Ctrl_cutKey =
KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK);
itemClose.setAccelerator(Ctrl_cutKey);
Ctrl_cutKey =
KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK);
itemSave.setAccelerator(Ctrl_cutKey);
Ctrl_cutKey =
KeyStroke.getKeyStroke(KeyEvent.VK_E, InputEvent.CTRL_MASK);
itemExit.setAccelerator(Ctrl_cutKey);


//将复选框,可选按钮添加到子菜单菜单项
jm1.add(checkBox1);
jm2.add(checkBox2);
jm3.add(radio1);
jm4.add(radio2);
//将菜单项添加到子菜单
subType.add(jm1);
subType.add(jm2);
subType.addSeparator();
subType.add(jm3);
subType.add(jm4);

//添加菜单项到文件菜单
menuFile.add(itemNew);
menuFile.addSeparator();
menuFile.add(itemOpen);
menuFile.addSeparator();
menuFile.add(itemClose);
menuFile.addSeparator();
menuFile.add(subType);
menuFile.addSeparator();
menuFile.add(itemSave);
menuFile.addSeparator();
menuFile.add(itemSaveAs);
menuFile.addSeparator();
menuFile.add(itemExit);

//将菜单添加到菜单条上
menubar.add(menuFile);
menubar.add(menuEdit);
menubar.add(menuView);
menubar.add(menuHelp);

//将菜单条添加到菜单
setJMenuBar(menubar);

}
}




class CheckboxMenuItem extends JMenuItem{
public CheckboxMenuItem(String s) {

}
}

2、 设计一个基于 Swing 的简单计算器,用于整数的加减乘除运算。

  1. 上方为文本框,位于所属容器的顶端,下方为数字按钮和运算符按钮,放置在一个 JPanel 中间容器中。
  2. 采用边界布局与网格布局相结合的方式,完成计算器的组件布局。
  3. 按钮 C 用来对文本框中的内容清零。
  4. 在文本框中输入两个数据,按加/减/乘/除按钮进行两个数的相应运算,并将结果输出到文本框中。
  5. 在处理事件过程中,需考虑对于运算过程中异常处理,如除法分母不为0,提供的运算字符串无法运算等情况。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
     //设计一个基于 Swing 的简单计算器,用于整数的加减乘除运算。
    //1) 上方为文本框,位于所属容器的顶端,下方为数字按钮和运算符按钮,放置在一个 JPanel 中间容器中。
    //2) 采用边界布局与网格布局相结合的方式,完成计算器的组件布局
    //3) 按钮 C 用来对文本框中的内容清零。
    //4) 在文本框中输入两个数据,按加/减/乘/除按钮进行两个数的相应运算,并将结果输出到文本框中。
    //5) 在处理事件过程中,需考虑对于运算过程中异常处理,如除法分母不为 0,提供的运算字符串无法运算等情况。


    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;

    import javax.swing.*;


    public class TestTwo {
    public static String res="";

    public static void main(String args[]) {
    Calculator cal = new Calculator("Calculator");
    cal.setBounds(400,150,600,400);

    }
    }

    class Calculator extends JFrame{
    public static JTextField result;//显示输入结果的文本框
    JPanel operator; //使用GRID布局的容器
    GridLayout grid;

    public Calculator() {}
    public Calculator(String string) {
    init(string);
    setVisible(true);
    setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    }

    void init(String s) {
    setTitle(s);
    //设置文本框
    result = new JTextField("");
    add(result,BorderLayout.NORTH);
    result.setPreferredSize(new Dimension(580,50));
    result.setFont(new Font("DialogInput",Font.BOLD,18));

    //设置容器为GRID布局
    operator = new JPanel();
    grid=new GridLayout(4,4);
    operator.setLayout(grid);

    //operator中有4排4列16个按钮
    String str[] = {"0","1","2","3","4","5","6","7","8","9","+","-","*","/","C","="}; //16个按钮的标签内容
    JButton btn[] = new JButton[str.length];

    //给0-9和+-*/注册监听
    Listen ls[]= new Listen[str.length] ;
    for(int i=0;i<15;i++) {
    ls[i] = new Listen();
    }
    for(int i=0;i<str.length;i++) {
    btn[i]=new JButton(str[i]);
    btn[i].setFont(new Font("DialogInput",Font.BOLD,18));
    if(i!=14&&i!=15) {
    btn[i].addActionListener(ls[i]);
    }
    operator.add(btn[i]);
    }
    //给C归零按钮注册监听
    CListen cl = new CListen();
    btn[14].addActionListener(cl);
    //给=计算按钮注册监听
    CalListen calisten = new CalListen();
    btn[15].addActionListener(calisten);

    add(operator,BorderLayout.CENTER);




    }

    }



    //0-9和+-*/的监听:将按钮的标签值添加到string res
    class Listen implements ActionListener {
    public void actionPerformed(ActionEvent e) {
    String str = e.getActionCommand(); //获取封装在事件中的“命令”字符串
    TestTwo.res = TestTwo.res +str;
    Calculator.result.setText(TestTwo.res);
    System.out.println(TestTwo.res);
    }
    }


    //C清零的监听:点击将string res赋空值
    class CListen implements ActionListener {
    public void actionPerformed(ActionEvent e) {
    TestTwo.res = "";
    Calculator.result.setText(TestTwo.res);
    }
    }

    //=计算监听:点击计算两个数据的运算结果
    class CalListen implements ActionListener {
    public void actionPerformed(ActionEvent e) {
    String s,reg,sa,sb,sc;
    char []ss;
    char cal;
    double a,b,c;

    //赋初值
    int index=0;
    cal=' ';
    c=0;
    s=TestTwo.res;
    //判断输入的 string s是否是进行两个数据运算的正则表达式:运算符为+-*时,两个数据可以为0;运算符为/时,后面的数据不能为0
    reg="(^([1-9][0-9]{0,}||0)(\\+||\\-||\\*)([1-9][0-9]{0,}||0)$)||" +
    "(^([1-9][0-9]{0,}||0)\\/[1-9][0-9]{0,}$)";
    Pattern p=Pattern.compile(reg);
    Matcher m=p.matcher(s);
    //对string s的匹配结果进行判断,如果成功,则进行计算,否则提示错误
    if(m.matches()) {
    //找到+-*/的位置
    ss=s.toCharArray();
    for(int i=0;i<s.length();i++) {
    // System.out.println(ss[i]);
    if(ss[i]=='+'||ss[i]=='-'||ss[i]=='*'||ss[i]=='/') {
    index=i;
    cal=ss[i];
    }

    }

    //将运算符前后的内容转换为double型数据
    sa=s.substring(0,index);
    sb=s.substring(index+1, s.length());
    // System.out.println(sa);
    // System.out.println(sb);
    a=Double.parseDouble(sa);
    b=Double.parseDouble(sb);

    //进行计算得到c
    if(cal=='+') {
    c=a+b;
    }
    if(cal=='-') {
    c=a-b;
    }
    if(cal=='*') {
    c=a*b;
    }
    if(cal=='/') {
    c=a/b;
    }
    sc=String.valueOf(c);
    Calculator.result.setText(sc);
    TestTwo.res = "";


    }
    else {
    TestTwo.res = "";
    Calculator.result.setText(TestTwo.res);
    JOptionPane.showMessageDialog(null, "输入错误,请进行两个数据的运算!" );
    }


    }
    }
打赏
  • © 2025 Aoxue
  • Hexo Theme Ayer by shenyu
    • PV:
    • UV:

请我喝杯咖啡吧~

支付宝
微信