图形用户界面
相关知识点
先前的博客已经对Swing进行过细致的描述,现在只是重新对知识点进行一个整理以及复习
Java Swing图形用户界面(20.4.25)
Java Swing窗口(20.4.26)
Java常用组件/容器与布局/计算机系统基础知识(20.4.27)
Java处理事件/ActionEvent事件/ASCII码/校验码/逻辑代数及逻辑运算/机器数的运算(20.4.28)
Java ItemEvent事件/总线的基本概念/中央处理单元(20.4.29)
Java DocumentEvent事件(20.4.30)
等等…
通过图形用户界面(Graphics User Interface,GUl)
,用户和程序之间可以方便地进行交互。Java包含了许多用来支持GUI设计的类,如按钮、菜单、列表、文本框等组件类,同时还包含窗口、面板等容器类。学习组件除了了解组件的属性和功能外,一个更重要的方面是学习怎样处理组件上发生的界面事件。在学习处理事件时,必须很好地掌握事件源
、监视器
、处理事件
的接口这3个概念。
- 事件源
能够产生事件的对象都可以称为事件源,如文本框、按钮、下拉式列表
等。也就是说,事件源必须是一个对象,而且这个对象必须是Java认为能够发生事件的对象。 - 监视器
我们需要一个对象对事件源进行监视,以便对发生的事件做出处理。事件源通过调用相应的方法将某个对象作为自己的监视器。 - 处理事件的接口
监视器负责处理事件源发生的事件。Java语言使用了接口回调技术设计了它的处理事件模式。事件源增加监视的方法:
addXXXListener(XXXListener listener)
//
其中的参数是一个接口,listener可以引用任何实现了该接口的类所创建的对象(监视器),当事件源发生事件时,接口listener立刻回调被类实现的接口中的某个方法。
算术测试的例子
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class myWindow extends JFrame {
Teacher teacher;
JButton jButtonGet;
JButton jButtonAnswer;
JTextField jTextField;
JTextField jTextField2;
JTextField jTextField3;
JMenuBar jMenuBar;
JMenu jMenu;
JMenuItem jMenuItem;
JMenuItem jMenuItem2;
JLabel jLabel;
JLabel jLabel2;
public myWindow() {
teacher = new Teacher();
jTextField = new JTextField(5);
jTextField2 = new JTextField(5);
jTextField.setEditable(false);
jTextField2.setEditable(false);
jTextField3 = new JTextField(5);
jLabel = new JLabel();
jLabel2 = new JLabel();
teacher.setMyWindow(this);
setLayout(new FlowLayout());
setBounds(400, 400, 500, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("算术测试");
jMenuBar = new JMenuBar();
jMenu = new JMenu("选择级别");
jMenuItem = new JMenuItem("幼儿级别");
jMenuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
JMenuItem source = (JMenuItem) actionEvent.getSource();
teacher.setMax(source);
}
});
jMenuItem2 = new JMenuItem("儿童级别");
jMenuItem2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
JMenuItem source = (JMenuItem) actionEvent.getSource();
teacher.setMax(source);
}
});
jMenu.add(jMenuItem);
jMenu.add(jMenuItem2);
jMenuBar.add(jMenu);
setJMenuBar(jMenuBar);
jButtonGet = new JButton("获取题目");
jButtonGet.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
teacher.getRandom();
}
});
jButtonAnswer = new JButton("确认答案");
jButtonAnswer.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
teacher.getAnswer();
}
});
add(jButtonGet);
add(jTextField);
add(jLabel);
add(jTextField2);
add(new JLabel("="));
add(jTextField3);
add(jButtonAnswer);
add(jLabel2);
setVisible(true);
validate();
}
}
import javax.swing.*;
import java.util.Random;
public class Teacher {
Random random;
myWindow myWindow;
int numberOne, numberTwo;
int Max = 10;
public void setMyWindow(Experiment_10.myWindow myWindow) {
this.myWindow = myWindow;
}
public Teacher() {
}
public void setMax(JMenuItem jMenuItem) {
if (jMenuItem == myWindow.jMenuItem) {
Max = 10;
} else if (jMenuItem == myWindow.jMenuItem2) {
Max = 50;
}
}
public void getRandom() {
random = new Random();
numberOne = random.nextInt(Max) + 1;
numberTwo = random.nextInt(Max) + 1;
double random = Math.random();
if (random > 0.5) {
myWindow.jLabel.setText("+");
} else {
myWindow.jLabel.setText("-");
}
myWindow.jTextField.setText(numberOne + "");
myWindow.jTextField2.setText(numberTwo + "");
}
public void getAnswer() {
String text = myWindow.jTextField3.getText();
int answer = Integer.parseInt(text);
if (answer == numberOne + numberTwo || answer == numberOne - numberTwo) {
myWindow.jLabel2.setText("回答正确!");
} else {
myWindow.jLabel2.setText("回答错误!");
}
}
}
public class Example_1 {
public static void main(String[] args) {
myWindow myWindow = new myWindow();
}
}
运行效果
相关知识点2
当把组件添加到容器中时,希望控制组件在容器中的位置,这就需要学习布局设计的知识。常用的布局类有java.awt包中的FlowLayout
,BorderLayout
、CardLayout
、GridLayout
和java.swing.border包中的BoxLayout
。
BorderLayout是一种简单的布局策略,如果一个容器使用这种布局,那么容器空间被省单地划分为东、西、南、北、中5个区域
,中间的区域最大。每加入一个组件都应该指明把这个组件添加在哪个区域中,区域由BorderLayout中的静态常量CENTER、NORTH、SOUTH、WEST、EAST表示。
GridLayout是使用较多的布局编辑器,其基本布局策略是:把容器划分成若干行乘若干列的网格区域,组件就位于这些划分出来的小格中。GridLayout比较灵活
,划分多少网格由程序自由控制,而且组件定位也比较精确
。
相关知识点3
用KeyEvent 类的public int getKeyCode()
方法可以判断哪个键被按下、敲击或释放,getKeyCode方法返回一个键码值。用KeyEvent 类的public char getKeyChar()方法可以判断哪个键被按下、敲击或释放,getKeyChar()
方法返回键上的字符。
CET4P215
- nasty
- fable
- ethnic
- deprive
- enlighten
- comply
- fable
- infrastructure
- administration
- whisky
- broker
- frost
- emphasize