学过前端的就很清楚什么是事件,例如:鼠标点击事件,键盘输入事件,下拉事件,失去焦点事件等等。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.


擅长前端的Java程序员