一、什么是GUI
GUI 全称 Graphical User Interface 图形用户界面,指采用图形方式显示的计算机操作用户界面。 软件以图形界面形式运行时,用户可借助于菜单、按钮、标签等组件和通过鼠标、键盘等的操作共同完成对软件的应用。
当程序运行后,出现的图形窗口,称为程序的界面。界面上可能有输入框、输入区、 菜单项、按钮等各种图形组件。
当用户通过键盘往输入区域输入内容后回车 或 用鼠标点击了一些可以被点击的组件以后,程序可以产生我们预期的合理响应或结果,称为事件处理。
二、Java如何设计编写GUI
1.导入相应包
(1)java.awt
顶层容器 | Frame、Dialog、Applet 等 |
中间层容器 | Panel 等 |
普通组件 | Button、TextField、TextArea、Label、List 等 |
(2)javax.swing
顶层容器 | JFrame、JApplet、JDialog 等 |
中间层容器 | JPanel、JScrollPane、JSplitPane、JToolBar 等 |
普通组件 | JButton、JList、JTextField 等 |
2.界面设计
一个GUI界面上可能有输入框、输入区、菜单项或者按钮等各种图形组件。界面设计即对展示给用户的这些部件的格式,位置,大小进行设计。
界面是需要有载体的。而“容器”是所有组件或容器的载体,是图形用户界面设计的基础。图形用户界面上所有的元素都要装载在容器中。
(1)容器 (Container)
容器是 Java 图形界面开发包中的系统类,它们只是一类比较特殊的图形组件。它们在数量上基本上就只有几个。设计界面时,先要定义“容器”对象作为载体,然后定义按钮、输入框之类的普通图形界面组件对象,把这些组件对象添加(调用容器对象的 add 方法)到容器上,才能构成界面。
(2)布局
把这些组件放到容器上去之后,按什么样的格局、什么样的顺序摆放,属于容器的“布局”问题。 “布局”是对容器而言的,是对放置到容器内的组件的一种位置约束。给任何一种容器对象设置布局的方法都是调用该容器对象的 setLayout 方法,该方法需要带相应的布局类对象作为参数。
Container.setLayout(布局类对象)
常用布局类对象:
布局 | 说明 |
FlowLayout ( 顺序布局\流式布局 ) |
容器上的元素会按容器显示时的大小,按照从左到右、从上到下的一行一行摆放下去。
|
BorderLayout ( 边界布局 ) |
把容器分为东西南北中 5 个方位,可以指定某个组件在哪个方位。
[注意]并非一定要有 5 个组件摆上去,不足 5 个也可指定位置摆放
|
GridLayout( 网格布局 ) | 可以指定容器上的元素按几行几列的位置顺序摆放。 |
CardLayout( 卡片布局 ) |
使用该布局的容器可放置多个组件,但同一时刻只能显示其中一个,就像一叠叠整齐的纸牌中每次只能最上面一张一样。可以指定哪个组件被显示。
|
null( 空布局 ) |
空布局并非没有布局,而是容器被设置为这种布局以后,放到它上面的每个组件就可以通过 setBounds(int a,int b,int width,int height)来设置具体的位置。
|
(3)顶层容器
顶层容器顾名思义,就是最大的用来容纳其他组件的组件。只有顶层容器可以独立的显示出来,其他容器需要放在顶层容器中才能显示出来。
- JFrame (框架) - 构造一个初始不可见的新窗口
部分方法:
setTitle(String title) | 设置窗口标题 |
setLayout(new 布局管理器类型) | 创建布局管理器 |
add(组件名称) | 添加组件 |
setBounds(int x , int y , int width , int height) | 设置窗口显示:x , y 显示的位置,width , height 窗体的大小 |
setVisable(Boolean b) | 设置窗口是否显示 |
setDefaultCloseOperation(int operation) | 设置窗口退出方案 JFrame.DO_NOTHING_ON_CLOSE:不执行任何操作 JFrame.HIDE_ON_CLOSE:隐藏该窗体。此时没有关闭程序,只是将程序界面隐藏 JFrame.DISPOSE_ON_CLOSE:隐藏并释放该窗体。继续运行应用程序,释放窗体中占用的资源 JFrame.EXIT_ON_CLOSE: 使用 System exit 方法退出应用程序 |
例:
import javax.swing.*;
/**
* @name 鷾
*/
public class FrameCase {
public static void main(String[] args){
JFrame frame = new JFrame();
// 窗口是否可见
frame.setVisible(true);
// 设置窗体大小
frame.setSize(400,450);
// 设置关闭操作
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 设置窗体在屏幕上的位置
frame.setLocationRelativeTo(null);
// 设置窗口标题
frame.setTitle("框架标题");
}
}
效果:
- JDialog (对话框) - 对话框也是一个窗体,但没有最大化、最小化按钮
JDialog() | 创建一个没有标题并且没有指定 Frame 所有者的无模式对话框 |
JDialog(Dialog owner) | 创建一个没有标题但将指定的 Dialog 作为其所有者的无模式对话框 |
JDialog(Dialog owner, boolean modal) | 创建一个具有指定所有者 Dialog 和模式的对话框 |
JDialog(Dialog owner, String title) | 创建一个具有指定标题和指定所有者对话框的无模式对话框 |
JDialog(Dialog owner, String title, boolean modal) | 创建一个具有指定标题、模式和指定所有者 Dialog 的对话框 |
JDialog(Dialog owner, String title, boolean modal, GraphicsConfiguration gc) | 创建一个具有指定标题、所有者Dialog、模式和 GraphicsConfiguration 的对话框。 |
JDialog(Frame owner) | 创建一个没有标题但将指定的 Frame 作为其所有者的无模式对话框 |
JDialog(Frame owner, boolean modal) | 创建一个具有指定所有者 Frame、模式和空标题的对话框 |
JDialog(Frame owner, String title) | 创建一个具有指定标题和指定所有者窗体的无模式对话框 |
JDialog(Frame owner, String title, boolean modal) | 创建一个具有指定标题、所有者 Frame 和模式的对话框 |
JDialog(Frame owner, String title, boolean modal, GraphicsConfiguration gc) | 创建一个具有指定标题、所有者 Frame、模式和 GraphicsConfiguration 的对话框 |
JDialog(Window owner) | 创建一个具有指定所有者 Window 和空标题的无模式对话框 |
JDialog(Window owner, Dialog.ModalityType modalityType) | 创建一个具有指定所有者 Window、模式和空标题的对话框 |
JDialog(Window owner, String title) | 创建一个具有指定标题和所有者 Window 的无模式对话框 |
JDialog(Window owner, String title, Dialog.ModalityType modalityType) | 创建一个具有指定标题、所有者 Window 和模式的对话框 |
JDialog(Window owner, String title, Dialog.ModalityType modalityType, GraphicsConfiguration gc) | 创建一个具有指定标题、所有者 Window、模式和 GraphicsConfiguration 的对话框 |
setTitle(String title) | 设置对话框标题 |
setLocation(int x , int y , int width , int height) | 设置窗口显示:x , y 显示的位置,width , height 窗体的大小 |
setVisable(Boolean b) | 设置窗口是否显示 |
setDefaultCloseOperation(int operation) | 设置窗口退出方案 JFrame.DO_NOTHING_ON_CLOSE:不执行任何操作 JFrame.HIDE_ON_CLOSE:隐藏该窗体。此时没有关闭程序,只是将程序界面隐藏 JFrame.DISPOSE_ON_CLOSE:隐藏并释放该窗体。继续运行应用程序,释放窗体中占用的资源 JFrame.EXIT_ON_CLOSE: 使用 System exit 方法退出应用程序 |
import javax.swing.JDialog;
import java.awt.*;
/**
* @name 鷾
*/
public class DialogCase {
public static void main(String[] args){
JDialog dialog = new JDialog((Frame) null, "对话框名称");
// 设置窗体大小
dialog.setSize(300, 150);
// 设置默认关闭操作为:关闭时退出
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
// 设置窗体在屏幕上的位置
dialog.setLocation(100, 100);
// 设置窗体是否显示
dialog.setVisible(true);
}
}
(4)中间容器
中间层容器是一种可以放到顶层容器上的组件,它可以把顶层容器进行进一步的区域划分以设计所需格局的界面。中间层容器也必须添加到顶层容器中才会启作用,否则显示不出来。
JPanel (面板) | 作为最普通的面板,向面板中添加组件。 |
JTabbedPane(拆分面板) | 把面板分为两部分,可以按左右分割,也可以按上下分割。 |
JSplitPane (可切换选项卡面板) | 向面板中添加组件时,会为这个组件添加选项卡,通过选项卡可切换不同组件. |
JSrollPane(滚动面板) | 只可添加一个组件。和JTextArea配合,作为文本输入栏的滚动条。 |
JSplitPane(拆分面板) | 把面板分为两部分,可以按左右分割,也可以按上下分割。 |
JLayeredPane(分层面板) | 用于组件重叠的处理,JavaSwing中定义5层,从低到高,依次为 DEFAULT_LAYER、PALETTE_LAYER、MODAL_LAYER、POPUP_LAYER、DRAG_LAYER。对于同一位置,高层覆盖底层。对于同层,后来覆盖新来。 |
(5)普通组件
普通组件包括按钮、输入框、标签等。普通组件在定义之后,需要 container.add() 的方法添加到容器中,这样在GUI界面中才会显示。
Container.add(普通组件名);
JLabel | 标签 |
JButton | 按钮 |
JRadioButton | 单选按钮 |
JCheckBox | 复选框 |
JToggleButton | 开关按钮 |
JPasswordField | 密码框 |
JTextField | 单行文本输入 |
JTextArea | 多行文本输入 |
JComboBox | 下拉列表框 |
JList | 列表 |
JProgressBar | 进度条 |
JSlider | 滑块 |
例:
package TestCode;
/**
* @name 鷾
*/
import javax.swing.*;
import java.awt.*;
public class Calculator extends JFrame {
private final Container container = getContentPane();
public Calculator(){
container.setLayout(null);
setContent();
setWindow();
}
private void setWindow(){
this.setVisible(true); //窗口可见
this.setSize(400,450); //窗口大小
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //窗口可关闭
this.setLocationRelativeTo(null); //窗口居中
this.setTitle("简易计算器"); //窗口标题
}
private void setContent(){
/* 标签 */
JLabel jLabel1 = new JLabel("计算器");
jLabel1.setBounds(140,30,100,50);
jLabel1.setFont(new Font("楷体",Font.PLAIN,20));
JLabel jLabel2 = new JLabel("运算数一");
jLabel2.setBounds(60,70,100,50);
jLabel2.setFont(new Font("楷体",Font.PLAIN,20));
JLabel jLabel3 = new JLabel("运算数二");
jLabel3.setBounds(60,110,100,50);
jLabel3.setFont(new Font("楷体",Font.PLAIN,20));
JLabel jLabel4 = new JLabel("运算结果");
jLabel4.setBounds(60,150,100,50);
jLabel4.setFont(new Font("楷体",Font.PLAIN,20));
/* 文本域 */
JTextField jTextField1 = new JTextField(20);
jTextField1.setBounds(170,80,150,30);
JTextField jTextField2 = new JTextField(20);
jTextField2.setBounds(170,120,150,30);
JTextField jTextField3 = new JTextField(20);
jTextField3.setBounds(170,160,150,30);
/* 按钮 */
JButton jButton1 = new JButton("相加");
jButton1.setBounds(80,220,80,40);
jButton1.setFont(new Font("楷体",Font.PLAIN,20));
JButton jButton2 = new JButton("相减");
jButton2.setBounds(220,220,80,40);
jButton2.setFont(new Font("楷体",Font.PLAIN,20));
JButton jButton3 = new JButton("清零");
jButton3.setBounds(120,300,140,40);
jButton3.setFont(new Font("楷体",Font.PLAIN,20));
container.add(jLabel1);
container.add(jLabel2);
container.add(jLabel3);
container.add(jLabel4);
container.add(jTextField1);
container.add(jTextField2);
container.add(jTextField3);
container.add(jButton1);
container.add(jButton2);
container.add(jButton3);
}
public static void main(String[] args){
new Calculator();
}
}
效果:
(6)界面设计步骤
- 定义顶层容器对象
- 调用容器对象的 setLayout 方法给容器设置一种布局
- 定义普通图形组件
- 调用容器对象 add 方法将普通图形组件添加到容器上
2.事件处理
(1)事件处理
上面的界面设计后,鼠标点击按钮或者是在文本框中输入内容,界面是没有任何反应的。这是因为我们仅仅完成了界面的外表,还有界面的内核即事件处理需要我们编写。
(2)Java 事件处理机制
监听器实际上是接口,在接口中定义了事件发生时可调用的、必须要实现的方法。 每一种事件类,对应要实现的接口。 每个接口,又有一个或多个方法必须要被实现(即接口被implements 时的语法要求)。这些方法中的代码,就是对应的事件的具体的处理代码。
组件通过addActionListener的方法添加需要的监听器。
组件名.addActionListener(监听器对象);
如:jButton.addActionListener(new Event());
事件类
| 可关联的组件 | 要实现的接口 | 接口中必须实现的方法 |
ActionEvent
|
Button,List, MenuItem,TextField
|
ActionListener
|
ActionPerformed(Actionevente)
|
ItemEvent
|
Checkbox,Choice,List,MenuItem
|
ItemListener
|
ItemStateChanged(ItemEvent e)
|
ContainerEvent
|
Container,Dialog,Frame,Panel,
ScrollPane,Window
|
ContainerListener
|
componentAdded(ContainerEvent
e)
componentRemoved(…)
|
MouseMotionEvent
|
Button,Canvas,Checkbox,choice,
Component
Container,Dialog,Frame,
Label,List,Panel,Scrollbar,ScrollPane,
TextArea,TextField,Window
|
MouseMotionListener
|
mouseGragged(MouseEvent e)
mouseMoved(MouseEvent e)
|
MouseEvent
|
同
MouseMontionEvent
|
MouseListener
|
mousePressed(MouseEvent e)
mouseReleased(…)
mouseEntered(…)
mouseExited(…)
mouseClicked(…)
|
KeyEvent
|
同
MouseMontionEvent
|
KeyEvent
|
keyPressed(KeyEvent e)
keyReleased(…)
keyTyped()
|
FocusEvent
|
同
MouseMontionEvent
|
FocusListener
|
focusGained(FocusEvent e)
focusLost(FocusEvent e)
|
AdjustmentEvent
|
Scrollbar
|
AdjustmentListener
|
adjustmentValueChanged(AdjustmentEvent e)
|
ComponentEvent
|
同
MouseMontionEvent
|
ComponentListener
|
ComponentMoved(ComponentEvent e)
ComponentHidden(…)
ComponentResized(…)
ComponentShown(…)
|
TextEvent |
TextField,TextArea
|
TextListener
|
textValueChanged(TextEvent e)
|
WindowEvent
|
Dialog,Frame,Window
|
WindowListener
|
WindowClosing(WindowEvent e)
WindowOpened(…)
WindowIconified(…)
WindowClosed(…)
WindowDeiconfied(…)
WindowActivated(…)
WindowDeactivated(…)
|
ComponentAdapter | 组件适配器 |
ContainerAdapter | 容器适配器 |
FocusAdapter | 焦点适配器 |
KeyAdapter | 键盘适配器 |
MouseAdapter | 鼠标适配器 |
MouseMotionAdapter | 鼠标移动适配器 |
WindowAdapter | 窗口适配器 |
(3)事务处理步骤
- 注册监听器接口,让可能产生事件的组件对事件进行监听
- 实现接口中所有的方法(这些方法就是具体进行事件处理的代码)
(4)事务处理案例
import java.awt.event.*;
import javax.swing.*;
public class Case_1 {
JFrame jFrame = new JFrame("按钮事件处理");
JButton jButton = new JButton("测试按钮");
public Case_1() {
// addActionListener,对其可能发生的点击事件(EventListener类型对象表示)进行监听
// 调用其监听方法
jButton.addActionListener(new EventListener());
// 添加组件
jFrame.add(jButton);
// 容器jFrame设置为可见
jFrame.setVisible(true);
// 设置窗体大小
jFrame.setSize(400, 450);
// 设置窗体在屏幕上的位置
jFrame.setLocationRelativeTo(null);
//窗口可关闭
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String args[]) {
new Case_1();
}
}
class EventListener implements ActionListener {
/* 实现ActionListener接口的actionPerformed(ActionEvent e)方法,由参数e接收事件信息,然后对传入的事件信息进行处理。*/
public void actionPerformed(ActionEvent e) {
System.out.println("按钮事件处理的测试"); // 点击一次按钮后,操作台输出 “按钮事件处理的测试” 的信息
}
}
import java.awt.event.*;
import javax.swing.*;
public class Case_2 {
//在定义类的同时,就implements监听器接口
JFrame jFrame = new JFrame("按钮事件处理");
JButton jButton = new JButton("测试按钮");
public Case_2() {
// addActionListener,对其可能发生的点击事件(EventListener类型对象表示)进行监听
//对按钮myButton,调用其监听方法
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("按钮事件处理的测试"); // 点击一次按钮后,操作台输出 “按钮事件处理的测试” 的信息
}
});
// 添加组件
jFrame.add(jButton);
// 容器jFrame设置为可见
jFrame.setVisible(true);
// 设置窗体大小
jFrame.setSize(400, 450);
// 设置窗体在屏幕上的位置
jFrame.setLocationRelativeTo(null);
//窗口可关闭
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String args[]) {
new Case_2();
}
}
Case_3:
案例3和案例1功能上是一样的,但是采用匿名new ActionListener()的方法。
import java.awt.event.*;
import javax.swing.*;
public class Case_3 {
JFrame jFrame = new JFrame("按钮事件处理");
JButton jButton = new JButton("测试按钮");
public Case_3() {
// addActionListener,对其可能发生的点击事件(EventListener类型对象表示)进行监听
// 采用匿名new ActionListener()的方法
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("按钮事件处理的测试"); // 点击一次按钮后,操作台输出 “按钮事件处理的测试” 的信息
}
});
// 添加组件
jFrame.add(jButton);
// 容器jFrame设置为可见
jFrame.setVisible(true);
// 设置窗体大小
jFrame.setSize(400, 450);
// 设置窗体在屏幕上的位置
jFrame.setLocationRelativeTo(null);
//窗口可关闭
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new Case_3();
}
}
Case_4:
产生GUI界面后,每点击一次按钮后,文本框类显示“你点击了这个按钮·-·”的字样。
import java.awt.FlowLayout;
import java.awt.event.*;
import javax.swing.*;
public class Case_4 {
JFrame jFrame = new JFrame("一个按钮事件处理的例子");
JButton jButton = new JButton("请点击我");
JTextField jTextField = new JTextField(10);
public Case_4() {
//对按钮myButton,调用其监听方法
jButton.addActionListener(new MyEvent(jTextField));
jFrame.setLayout(new FlowLayout());
// 添加组件
jFrame.add(jButton);
jFrame.add(jTextField);
// 容器jFrame设置为可见
jFrame.setVisible(true);
//让容器jFrame上的组件在程序运行之后就直接全部显示出来
jFrame.pack();
// 设置窗体在屏幕上的位置
jFrame.setLocationRelativeTo(null);
//窗口可关闭
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new Case_4(); //产生一个匿名对象,让程序运行起来。
}
}
class MyEvent implements ActionListener {
JTextField jTextField;
public MyEvent(JTextField jTextField) {
this.jTextField = jTextField;
}
public void actionPerformed(ActionEvent e) {
jTextField.setText("你点击了这个按钮·-·");
}
}
import java.awt.FlowLayout;
import java.awt.event.*;
import javax.swing.*;
public class Case_5 implements ActionListener{
JFrame jFrame;
JTextField jTextField1, jTextField2;
public Case_5() {
jTextField1 = new JTextField(20);
jTextField2 = new JTextField(20);
// 将jTextField2对象设置为不可编辑
jTextField2.setEditable(false);
// 调用其监听方法
jTextField1.addActionListener(this);
jFrame = new JFrame();
// 添加组件
jFrame.add(jTextField1);
jFrame.add(jTextField2);
// 设置布局
jFrame.setLayout(new FlowLayout());
// 设置为可见
jFrame.setVisible(true);
// 设置窗体大小
jFrame.setSize(400, 100);
// 设置窗体在屏幕上的位置
jFrame.setLocationRelativeTo(null);
// 设置窗口标题
jFrame.setTitle("学生姓名查询");
//窗口可关闭
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
// 实现接口中的方法,进行具体的事件处理
public void actionPerformed(ActionEvent evt) {
/* 当用户往 jTextField1 中输入 black 并且按回车*/
if ((evt.getSource() == jTextField1) && (jTextField1.getText().equals("001"))) {
jTextField1.setText(""); // 把第一个输入框清空
jTextField2.setText("Tom"); // 第二个输入框显示black的电话号码
}
/* 当用户往 jTextField1 中输入 smith 并且按回车*/
else if ((evt.getSource() == jTextField1) && (jTextField1.getText().equals("002"))) {
jTextField1.setText("");
jTextField2.setText("Tony");
}
else if ((evt.getSource() == jTextField1) && (jTextField1.getText().equals("003"))) {
jTextField1.setText("");
jTextField2.setText("Janny");
}
/* 当输入的不是其中任何一个人时 */
else {
jTextField1.setText("");
jTextField2.setText("Can’t find his(her)");
}
}
public static void main(String[] args) {
new Case_5();
}
}
三、综合案例
案例1.简易计算器
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Calculator extends JFrame {
private final Container container = getContentPane();
public Calculator(){
container.setLayout(null);
setContent();
setWindow();
}
private void setWindow(){
this.setVisible(true); //窗口可见
this.setSize(400,450); //窗口大小
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //窗口可关闭
this.setLocationRelativeTo(null); //窗口居中
this.setTitle("简易计算器"); //窗口标题
}
private void setContent(){
/* 标签 */
JLabel jLabel1 = new JLabel("计算器");
jLabel1.setBounds(140,30,100,50);
jLabel1.setFont(new Font("楷体",Font.PLAIN,20));
JLabel jLabel2 = new JLabel("运算数一");
jLabel2.setBounds(60,70,100,50);
jLabel2.setFont(new Font("楷体",Font.PLAIN,20));
JLabel jLabel3 = new JLabel("运算数二");
jLabel3.setBounds(60,110,100,50);
jLabel3.setFont(new Font("楷体",Font.PLAIN,20));
JLabel jLabel4 = new JLabel("运算结果");
jLabel4.setBounds(60,150,100,50);
jLabel4.setFont(new Font("楷体",Font.PLAIN,20));
/* 文本域 */
JTextField jTextField1 = new JTextField(20);
jTextField1.setBounds(170,80,150,30);
JTextField jTextField2 = new JTextField(20);
jTextField2.setBounds(170,120,150,30);
JTextField jTextField3 = new JTextField(20);
jTextField3.setBounds(170,160,150,30);
/* 按钮 */
JButton jButton1 = new JButton("相加");
jButton1.setBounds(80,220,80,40);
jButton1.setFont(new Font("楷体",Font.PLAIN,20));
JButton jButton2 = new JButton("相减");
jButton2.setBounds(220,220,80,40);
jButton2.setFont(new Font("楷体",Font.PLAIN,20));
JButton jButton3 = new JButton("清零");
jButton3.setBounds(120,300,140,40);
jButton3.setFont(new Font("楷体",Font.PLAIN,20));
/* 相加 按钮的监听事件 */
jButton1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
String text1 = jTextField1.getText();
if (text1.equals("")){
new ErrorPrompt();
return;
}
int num1 = Integer.parseInt(text1);
String text2 = jTextField2.getText();
if (text2.equals("")){
new ErrorPrompt();
return;
}
int num2 = Integer.parseInt(text2);
jTextField3.setText("" + (num1+num2));
}catch (NumberFormatException a){
new ErrorPrompt();
}
}
});
/* 相减 按钮的监听事件 */
jButton2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
String text1 = jTextField1.getText();
if (text1.equals("")){
new ErrorPrompt();
return;
}
int num1 = Integer.parseInt(text1);
String text2 = jTextField2.getText();
if (text2.equals("")){
new ErrorPrompt();
return;
}
int num2 = Integer.parseInt(text2);
jTextField3.setText("" + (num1-num2));
}catch (NumberFormatException a){
new ErrorPrompt();
}
}
});
/* 全部清零 按钮的监听事件 */
jButton3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
jTextField1.setText(""); //文本域全部清零
jTextField2.setText("");
jTextField3.setText("");
}
});
container.add(jLabel1);
container.add(jLabel2);
container.add(jLabel3);
container.add(jLabel4);
container.add(jTextField1);
container.add(jTextField2);
container.add(jTextField3);
container.add(jButton1);
container.add(jButton2);
container.add(jButton3);
}
}
class ErrorPrompt extends JFrame {
Container container = getContentPane();
public ErrorPrompt(){
container.setLayout(null);
setWindow();
setContent();
}
private void setWindow(){
this.setVisible(true);
this.setSize(300,200);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); //关闭当前窗口
this.setTitle("错误提示");
}
private void setContent(){
JLabel jLabel = new JLabel("请输入正整数!");
jLabel.setBounds(70,30,140,80);
jLabel.setFont(new Font("楷体",Font.PLAIN,20));
jLabel.setForeground(Color.red); //设置字体为红色
container.add(jLabel);
}
}
Main.java
public class Main {
public static void main(String[] args) {
new Calculator();
}
}
UML图