【问题标题】:Multiple image change on mouse hover over an image鼠标悬停在图像上时的多个图像变化
【发布时间】:2014-02-18 05:55:59
【问题描述】:

我想获得 Java 程序的解决方案。一旦鼠标光标悬停在矩形框上,我想更改矩形框中的图像。框中的图像必须不断变化(至少 5 个不同的图像),直到鼠标位于图像上并随着光标移出框而停止变化。我只想使用 g.drawImage() 设置图像,其中g 是一个 Graphics2D 对象。

请帮我解决这个问题,因为我被卡住了。

【问题讨论】:

  • 1) 为了尽快获得更好的帮助,请发布MCTaRE(最小完整测试和可读示例)。 2) 例如,获取图像的一种方法是热链接到 this answer 中看到的图像,尽管为此在运行时在代码中生成不同大小的图像可能更简单。

标签: java image swing hover mouse


【解决方案1】:

How to Write a Mouse-Motion Listener 开头。您需要确定鼠标何时进入您的指定区域,您可以使用java.awt.Rectangle 来帮助解决这个问题,因为它有一个contains(Point) 方法。

然后,看一下How to Use Swing Timers,你可以用它来触发图片的变化。

基本上,当鼠标移入您的Rectangle 时,您将启动Swing Timer,这将触发一个动作事件,您将在其中更新要显示的图片并调用repaint。当鼠标移出Rectangle 时,您只需停止计时器即可。

【讨论】:

    【解决方案2】:

    使用ImageIcon数组添加设置ImageIcon中的所有路径当鼠标进入标签时,图像在1秒后改变。

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    class myImage extends JFrame implements  MouseMotionListener
    {
        ImageIcon[] m=new ImageIcon[2]; 
        JLabel l;
        int i,l1;
        public myImage()
        {
            setLayout(null);
            setSize(1000,1000);
            setVisible(true);
            m[0]=new ImageIcon("m.jpg");
            m[1]=new ImageIcon("m1.jpg");
            l=new JLabel();
            l.setBounds(400,0,getWidth(),getHeight());
            add(l);
            l.addMouseMotionListener(this);
        }
    
        public void mouseMoved(MouseEvent e) 
        {
            if(i<2)
            {
                l.setIcon(m[i]);
                i++;
                try{
                    Thread.sleep(1000);
                }
                catch(Exception e1)
                {
                }
            }
            else
            {
                i=0;
            }
        }
    
        public void mouseDragged(MouseEvent e) 
        {
            System.out.print("Mouse bye");
        }
    
        public static void main(String args[])
        {
            myImage i1=new myImage();
        }
    }
    

    【讨论】:

    • 对代码块使用一致且符合逻辑的缩进。代码的缩进是为了帮助大家理解程序流程!
    • 当 OP 明确表示他们想要 drawImage 时,您正在阻止 EDT,使用 null 布局
    【解决方案3】:

    此代码可能会对您有所帮助!

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import javax.imageio.ImageIO;
    import javax.swing.BorderFactory;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.Timer;
    
    public class answer {
    
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
    
        public answer(){
            JFrame frame=new JFrame();
            frame.getContentPane().add(new rectangle());
            frame.pack();
            frame.setVisible(true);
    
        }
        public static void main(String args[]){
            new answer();
        }
    
        public class rectangle extends JPanel{
            /**
             * 
             */
            private static final long serialVersionUID = 1L;
    
            Image img;
            Timer timer;
            int count=0;
            public rectangle() {
    
                setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, Color.black));
                setPreferredSize(new Dimension(100,100));
                timer=new Timer(800, new ActionListener() {
    
                    @Override
                    public void actionPerformed(ActionEvent arg0) {
                        loadPic(count%5);
                        count++;
                        revalidate();
                        repaint();
                    }
                });
    
                addMouseListener(new MouseAdapter() {
    
                    @Override
                    public void mouseEntered(MouseEvent arg0) {
                        count=0;
                        timer.start();
                    }
    
                    @Override
                    public void mouseExited(MouseEvent arg0) {
                        timer.stop();
                    }
                });
            }
            @Override
            protected void paintComponent(Graphics g){
                super.paintComponent(g);
                g.drawImage(img, 0, 0, 120, 100,this);
            }
    
            public void loadPic(int number){
    
                String address="";
    
                switch(number){
                case 0: address="img1.jpg";
                break;
                case 1: address="img2.jpg";
                break;
                case 2: address="img3.jpg";
                break;
                case 3: address="img4.jpg";
                break;
                default: address="img5.jpg";
                break;
                }
    
                try  
                {  
                    img = ImageIO.read(getClass().getResourceAsStream(address));
    
                }  
                catch(Exception e){
                    System.out.println("error in loading image");
                }
    
            }
        }
    
    }
    

    【讨论】:

    • “此代码可能对您有所帮助!” 代码扩展 JFrame 而无需这样做(只需保留一个标准 JFrame 的实例)。它无法在 EDT 上启动 GUI。它在设置框架可见后打包,可能会改变可视大小。只要有变化,它就会尝试加载每个图像,而不是简单地保留对所有 5 个图像的引用。 .. 或者换句话说,它不是其他代码应该基于的代码。
    • 指导对工作实践的改变和edits 的答案进行了很好的投资。 ;)
    • 顺便说一句 - 获取图像的一种方法是热链接到 this answer 中看到的图像。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多