Java Swing 的悬停效果

问题描述 投票:0回答:1

在我的主窗口中,我有两个面板。他们是

leftPanel
rightPanel
。在
leftPanel
我有两个按钮:
matchButton
simulatorButton
。在我的
rightPanel
中,我在上面画了一个图像。我试图为两个按钮添加悬停效果。当将鼠标悬停在
matchButton
上时,
rightPanel
中包含的图像将更改为新图像。当从
matchButton
上移开鼠标时,
rightPanel
上的图像将恢复为默认图像。
simulatorButton
也一样。为此,我创建了一个单独的类并添加了以下代码:

public class ImgPanelStart extends JPanel {
    private Image backgroundImage;
    private BufferedImage imgBg;

    public ImgPanelStart() {
        try {
            backgroundImage = ImageIO.read(new File("./apsProject/assets/img0.jpg"));
        } catch (IOException ex) {
            System.out.println("Falha ao carregar imagem de fundo");
        }
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (backgroundImage != null) {
            g.drawImage(imgBg, 0, 0, null);
        }
        Dimension dim = this.getSize();
        int dWidth = (int) dim.getWidth();
        int dHeight = (int) dim.getHeight();
        imgBg = new BufferedImage(dWidth, dHeight, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = imgBg.createGraphics();
        g2.drawImage(backgroundImage, 0, 0, dWidth, dHeight, null);
        g2.dispose();
        g.drawImage(imgBg, 0, 0, null);
    }

    private void setImgBackground(Image img) {
        backgroundImage = img;
        if (imgBg == null) {
            imgBg = new BufferedImage(850, 600, BufferedImage.TYPE_INT_RGB);
        }
        Graphics2D g2 = imgBg.createGraphics();
        g2.drawImage(backgroundImage, 0, 0, getWidth(), getHeight(), null);
        g2.dispose();
        repaint();
    }

    public void addHoverEffect(JButton button, JButton button2) {
        button.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent e) {
                try {
                    setImgBackground(ImageIO.read(new File("./apsProject/assets/wall.jpg")));
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }

            @Override
            public void mouseExited(MouseEvent e) {
                try {
                    setImgBackground(ImageIO.read(new File("./apsProject/assets/img0.jpg")));
                } catch (IOException e1) {
                    e1.printStackTrace();
                };
            }
        });

        button2.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent e) {
                try {
                    setImgBackground(ImageIO.read(new File("./apsProject/assets/img2.jpg")));
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }

            @Override
            public void mouseExited(MouseEvent e) {
                try {
                    setImgBackground(ImageIO.read(new File("./apsProject/assets/img0.jpg")));
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
        });
    }
}

我在主类中这样调用我的方法:

ImgPanelStart effects = new ImgPanelStart();
effects.addHoverEffect(matchButton, simulationButton);

但是,当鼠标悬停在面板上时,在面板上绘制的图形不会更新。

就像是,我将鼠标悬停在按钮按钮上,它会将我的

rightPanel
中的图像更改为wall.jpg。我移开鼠标,它会返回图像img0.jpg.

我将鼠标悬停在

button2
按钮上,它会将我的
rightPanel
中的图像更改为img2.jpg。当我移开鼠标时,它会返回图像img0.jpg.

有谁知道可能出了什么问题,或者给我提示我可以做些什么来解决这个问题?

java swing paintcomponent mousehover
1个回答
0
投票

由于您的代码不是完整的可运行示例,我继续创建了以下 GUI。

当您将鼠标悬停在模拟按钮上时,这是相同的 GUI。

Oracle 有一个有用的教程,Creating a GUI With Swing。跳过使用 NetBeans IDE 学习 Swing 部分。

我在构建 GUI 之前阅读了我想使用的图像。这样,我只读了一次图像。

这是完整的可运行代码。我制作了额外的类内部类,这样我就可以将代码作为一个块发布。

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class HoverEffects implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new HoverEffects());
    }

    private final DrawingPanel drawingPanel;

    private final LoadImages loadImages;

    public HoverEffects() {
        this.loadImages = new LoadImages();
        this.drawingPanel = new DrawingPanel(loadImages.getWallpaper());
    }

    @Override
    public void run() {
        JFrame frame = new JFrame("Hover Effects");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.add(createButtonPanel(), BorderLayout.WEST);
        frame.add(drawingPanel, BorderLayout.CENTER);

        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private JPanel createButtonPanel() {
        JPanel outerPanel = new JPanel();

        JPanel panel = new JPanel(new GridLayout(0, 1, 5, 5));
        panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));

        JButton matchButton = new JButton("Match");
        matchButton.addMouseListener(
                new HoverListener(this, loadImages, matchButton));
        panel.add(matchButton);

        JButton simulatorButton = new JButton("Simulation");
        simulatorButton.addMouseListener(
                new HoverListener(this, loadImages, simulatorButton));
        panel.add(simulatorButton);

        outerPanel.add(panel);

        return outerPanel;
    }

    public void setImage(Image image) {
        drawingPanel.setImage(image);
        drawingPanel.repaint();
    }

    public class DrawingPanel extends JPanel {

        private static final long serialVersionUID = 1L;

        private Image image;

        public DrawingPanel(Image image) {
            setImage(image);
            this.setPreferredSize(new Dimension(800, 600));
        }

        public void setImage(Image image) {
            this.image = image;
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(image, 0, 0, this);
        }

    }

    public class HoverListener extends MouseAdapter {

        private final HoverEffects view;

        private final LoadImages model;

        private final JButton button;

        public HoverListener(HoverEffects view, LoadImages model,
                JButton button) {
            this.view = view;
            this.model = model;
            this.button = button;
        }

        @Override
        public void mouseEntered(MouseEvent event) {
            String text = button.getText();
            if (text.equals("Match")) {
                view.setImage(model.getNature1());
            } else {
                view.setImage(model.getNature2());
            }
        }

        @Override
        public void mouseExited(MouseEvent event) {
            view.setImage(model.getWallpaper());
        }

    }

    public class LoadImages {

        private Image nature1, nature2, wallpaper;

        public LoadImages() {
            try {
                URL url = new URL(
                        "http://www.thewowstyle.com/wp-content/uploads/"
                                + "2015/01/nature-wallpaper-27.jpg");
                Image image = ImageIO.read(url);
                wallpaper = image.getScaledInstance(800, 600,
                        Image.SCALE_SMOOTH);
                url = new URL("http://www.thewowstyle.com/wp-content/uploads/"
                        + "2015/01/nature-images..jpg");
                image = ImageIO.read(url);
                nature1 = image.getScaledInstance(800, 600, Image.SCALE_SMOOTH);
                url = new URL("http://www.thewowstyle.com/wp-content/uploads/"
                        + "2015/01/nature-images.jpg");
                image = ImageIO.read(url);
                nature2 = image.getScaledInstance(800, 600, Image.SCALE_SMOOTH);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public Image getNature1() {
            return nature1;
        }

        public Image getNature2() {
            return nature2;
        }

        public Image getWallpaper() {
            return wallpaper;
        }

    }

}
© www.soinside.com 2019 - 2024. All rights reserved.