学过前端的就很清楚什么是事件,例如:鼠标点击事件,键盘输入事件,下拉事件,失去焦点事件等等。Java的图形界面也有类似的事件,如果看不懂这部分内容,建议先去学好js,毕竟Java图形界面很少有人用,想找工作还是把js比较重要。掌握了js的事件部分,再来学本文就没有什么难度了,很多代码都能看见类似的东西。
先展示一个完整代码,跑起来看下效果(图片存放在maven项目的resource目录中):
public class TestGUI2 {
public static void main(String[] args) {
JFrame jFrame = new JFrame("title");
jFrame.setSize(400, 300);
jFrame.setLocation(280, 200);
jFrame.setLayout(null);
final JLabel jLabel = new JLabel();
ImageIcon i = new ImageIcon(Objects.requireNonNull(TestGUI2.class.getClassLoader().getResource("1.png")));
jLabel.setIcon(i);
jLabel.setBounds(50, 50, i.getIconWidth(), i.getIconHeight());
JButton button = new JButton("隐藏");
button.setBounds(150, 200, 100, 30);
// 给按钮 增加 监听
button.addActionListener(new ActionListener() {
boolean flag = false;
String text = "显示";
// 当按钮被点击时,就会触发 ActionEvent事件
// actionPerformed 方法就会被执行
public void actionPerformed(ActionEvent e) {
jLabel.setVisible(flag);
flag = !flag;
button.setText(text);
text = text.equals("显示") ? "隐藏" : "显示";
}
});
jFrame.add(jLabel);
jFrame.add(button);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setVisible(true);
}
}
注意下面部分代码:
button.addActionListener(new ActionListener() {
...
}
});
这部分代码就是给按钮设置监听,意思就是可以捕获对按钮组件的操作,该监听和下面的其他监听不一样,不能随便在其他UI组件中使用。
下面来看看键盘事件,键盘事件就是使用键盘时触发的事件,具体看代码:
public class TestGUI3 {
public static void main(String[] args) {
JFrame jFrame = new JFrame("LoL");
jFrame.setSize(400, 300);
jFrame.setLocation(580, 200);
jFrame.setLayout(null);
final JLabel label = new JLabel();
ImageIcon icon = new ImageIcon(Objects.requireNonNull(TestGUI2.class.getClassLoader().getResource("1.png")));
label.setIcon(icon);
label.setBounds(50, 50, icon.getIconWidth(), icon.getIconHeight());
// 增加键盘监听
jFrame.addKeyListener(new KeyListener() {
// 键被弹起
public void keyReleased(KeyEvent e) {
// 39代表按下了 “右方向键”
if (e.getKeyCode() == 39) {
// 图片向右移动 (y坐标不变,x坐标增加)
label.setLocation(label.getX() + 10, label.getY());
}
}
//键被按下
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
}
// 一个按下弹起的组合动作
public void keyTyped(KeyEvent e) {
}
});
jFrame.add(label);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setVisible(true);
}
}
运行之后,按方向右键,可以发现图片会向右移动。
下面是鼠标事件相关代码:
public class TestGUI4 {
public static void main(String[] args) {
final JFrame jFrame = new JFrame("LoL");
jFrame.setSize(800, 600);
jFrame.setLocationRelativeTo(null);
jFrame.setLayout(null);
final JLabel label = new JLabel();
ImageIcon icon = new ImageIcon(Objects.requireNonNull(TestGUI2.class.getClassLoader().getResource("1.png")));
label.setIcon(icon);
label.setBounds(375, 275, icon.getIconWidth(),icon.getIconHeight());
jFrame.add(label);
label.addMouseListener(new MouseListener() {
// 释放鼠标
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
// 按下鼠标
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
// 鼠标退出
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
// 鼠标进入
public void mouseEntered(MouseEvent e) {
Random r = new Random();
int x = r.nextInt(jFrame.getWidth() - label.getWidth());
int y = r.nextInt(jFrame.getHeight() - label.getHeight());
label.setLocation(x, y);
}
// 按下释放组合动作为点击鼠标
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
});
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setVisible(true);
}
}
运行后的效果是:当我们把鼠标箭头移动到图片上时,图片就会改变位置。
下面来看看MouseAdapter类,该类是一个抽象类,对鼠标相关监听器接口中的方法进行了空的实现。鼠标监听接口有很多个:MouseListener, MouseWheelListener, MouseMotionListener,而上面代码中我们只使用到了MouseListener。通常我们只需要实现其中一两个方法,但是却需要对其他所有的抽象方法进行空实现,因此我们可以使用该抽象类来解决这个问题。使用该抽象类之后,我们只需要对某一个或多个方法进行重写即可。下面看代码:
public class TestGUI5 {
public static void main(String[] args) {
final JFrame jFrame = new JFrame("LoL");
jFrame.setSize(800, 600);
jFrame.setLocationRelativeTo(null);
jFrame.setLayout(null);
final JLabel label = new JLabel("");
ImageIcon icon = new ImageIcon(Objects.requireNonNull(TestGUI2.class.getClassLoader().getResource("1.png")));
label.setIcon(icon);
label.setBounds(375, 275, icon.getIconWidth(), icon.getIconHeight());
jFrame.add(label);
// MouseAdapter 适配器,只需要重写用到的方法,没有用到的就不用写了
label.addMouseListener(new MouseAdapter() {
// 只有mouseEntered用到了
public void mouseEntered(MouseEvent e) {
Random r = new Random();
int x = r.nextInt(jFrame.getWidth() - label.getWidth());
int y = r.nextInt(jFrame.getHeight() - label.getHeight());
label.setLocation(x, y);
}
});
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setVisible(true);
}
}
Q.E.D.