java - 我想对图像使用鼠标单击事件,但它不起作用

标签 java swing

我试图使用图像作为一种按钮,但我能想到的唯一方法是向其添加鼠标单击事件。这还不起作用,有什么想法吗?这是我的代码:

import java.awt.* ;
import java.awt.event.MouseEvent;
import java.awt.Point;
import java.awt.image.* ;
import java.io.* ;
import javax.imageio.* ;
import javax.swing.* ;

public class test {

    public static void main(String[]args) {
        new test();
    }

    public test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException |
                    UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new Pane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);

            }
        });

    }

    public class Pane extends JPanel {

        private BufferedImage background;
        private BufferedImage Levels;
        private BufferedImage Exit;
        private BufferedImage PietKiezen;
        private BufferedImage ZwartePiet;
        private BufferedImage Sinterklaas;

        public Pane() {
            try {
                background = ImageIO.read(new
                        File("C:/Users/H/Documents/NetBeansProjects/Spel/src/Spel/Dak.gif"));
                Levels = ImageIO.read(new
                        File("C:/Users/H/Documents/NetBeansProjects/Spel/src/Spel/Levelsk.gif"));
                Exit = ImageIO.read(new
                        File("C:/Users/H/Documents/NetBeansProjects/Spel/src/Spel/Exitk.gif"));
                PietKiezen = ImageIO.read(new
                        File("C:/Users/H/Documents/NetBeansProjects/Spel/src/Spel/PietKiezen.gif"));
                ZwartePiet = ImageIO.read(new
                        File("C:/Users/H/Documents/NetBeansProjects/Spel/src/Spel/ZwartePiet.gif"));
                Sinterklaas = ImageIO.read(new
                        File("C:/Users/H/Documents/NetBeansProjects/Spel/src/Spel/Sinterklaas.gif"));

            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return background == null ? new Dimension(200, 200) : new
            Dimension(background.getWidth(), background.getHeight());
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D)g.create();
            if (background != null) {
                int x = (getWidth() - background.getWidth()) / 2;
                int y = (getHeight() - background.getHeight()) / 2;
                g2d.drawImage(background, x, y, this);

            }
            if (PietKiezen != null) {
                int x = 970;
                int y = 130;
                g2d.drawImage(PietKiezen, x, y, this);
            }
            if (Levels != null) {
                int x = 970;
                int y = 260;
                g2d.drawImage(Levels, x, y, this);
            }
            if (Exit != null) {
                int x = 970;
                int y = 390;
                g2d.drawImage(Exit, x, y, this);
            }
            if (ZwartePiet != null) {
                int x = 600;
                int y = 256;
                g2d.drawImage(ZwartePiet, x, y, this);
            }
            if (Sinterklaas != null) {
                int x = 800;
                int y = 256;
                g2d.drawImage(Sinterklaas, x, y, this);
            }
            g2d.dispose();

        }

        public void mouseClicked(MouseEvent me) {
            Point clicked = me.getPoint();
            Rectangle bounds = new Rectangle(172, 62, Exit.getWidth(), Exit.getHeight());
            if (bounds.contains(clicked)) {

                JOptionPane optionPane = new JOptionPane(
                        "The only way to close is\n"
                         + "by pressing one of the following buttons.",
                        JOptionPane.QUESTION_MESSAGE,
                        JOptionPane.YES_NO_OPTION);

            }
        }

    }

}

我现在尝试做的是,当单击退出图像时,会出现一个弹出屏幕。为什么我没有看到弹出屏幕?还有另一种方法可以将图像变成按钮而不看到按钮本身吗?

最佳答案

它不起作用,因为您需要向面板添加监听器,而不是创建方法(没有人调用)。
将您的方法移动到构造函数中监听器的匿名类实现中,如下所示(未经测试的代码,请谨慎使用):

public Pane() {
    ...
    addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent me) {
            Point clicked = me.getPoint();
            Rectangle bounds = new Rectangle(172, 62, Exit.getWidth(), Exit.getHeight());
            if (bounds.contains(clicked)) {

                JOptionPane optionPane = new JOptionPane(
                        "The only way to close is\n"
                         + "by pressing one of the following buttons.",
                        JOptionPane.QUESTION_MESSAGE,
                        JOptionPane.YES_NO_OPTION);

            }
        }
    });
    ...
}

关于java - 我想对图像使用鼠标单击事件,但它不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26626048/

相关文章:

java - 如何根据以前的单元格值更改 JTable 的单元格背景?

java - 如何设置组件的DataFlavor?

java - 对输入流使用 AWS S3 加密

java - ADT 更新后未生成 R.java

java - Android:如何将变量应用于 toast ?

java - Spring MVC 中的模型是什么

Java,paintComponent中的setForeground融化了CPU

java - 在动态 JPanel 中添加 JScrollPane

java - 具有固定标题的可滚动内容,无需使用 JTable

java - 在另一个变量中插入一个变量