Java在鼠标悬停时重新绘制组件.

Ben*_*der 3 java user-interface swing jmenu mouselistener

我正在尝试制作我的第一个正确定制的GUI,但是我很难更改为组件绘制的图像.基本上,对于我的exitButton(一个JMenu),我覆盖了paint方法,然后添加了一个Mouse监听器,但我不确定如何在鼠标输入方法中重新绘制mouseListener接口中的图像,并再次在鼠标退出方法中重新绘制.基本上我正在寻找一种重新绘制图像的方法,但我迷失了我能做什么.任何帮助将不胜感激.

以下是相关的代码段:

exitBtn = new JMenu(){
       @Override
       protected void paintComponent(Graphics g) {
        super.paintComponent(g);
           ImageIcon exitBtnImg = new ImageIcon("src/images/userInterface/exitBtn.gif");
           g.drawImage(exitBtnImg.getImage(), 0, 5, null);
      }
  };
  exitBtn.setOpaque(false);
  exitBtn.setEnabled(false);
  exitBtn.setPreferredSize(new Dimension(43, 18));
  exitBtn.addMouseListener(new MouseListener() {
        @Override
        public void mousePressed(MouseEvent me) {
        }
        @Override
        public void mouseClicked(MouseEvent me) {
            System.exit(0);
        }
        @Override
        public void mouseEntered(MouseEvent me) {
            //ImageIcon exitBtnImg = new ImageIcon("src/images/exitBtn_hover.gif"); //The ImageIcon for the Image I want to use
            System.out.println("mouse entered");

        }
        @Override
        public void mouseExited(MouseEvent me) {
            // ImageIcon exitBtnImg = new ImageIcon("src/images/exitBtn.gif"); 
Run Code Online (Sandbox Code Playgroud)

System.out.println("鼠标退出"); //原始图像的imageicon} @Override public void mouseReleased(MouseEvent me){}});

cam*_*ckr 6

我正在尝试制作我的第一个正确定制的GUI

您应该首先阅读Swing教程.我不确定你要做什么,但你的方法肯定是错的.

您可以从如何使用菜单开始,该菜单显示如何使用ActionListener来处理鼠标单击.鼠标点击通常在菜单项上处理,而不是菜单.您通常会有类似"文件"菜单的内容,其中包含"退出"菜单项.

然后我还会看一下JMenu API的各种方法,这些方法允许您在鼠标悬停或选择菜单时更改图标.也许setRolloverEnabled(),setRolloverIcon()就是你要找的.

如果您仍有问题,请发布一个证明问题的SSCCE.

更新:

如Hovercraft所述,翻转支持不适用于菜单或菜单项.有两个问题.首先,这些组件使用不同的MouseListener.监听器不监听mouseEntered和mouseExited事件.第二个问题是两个组件的UI已经自定义,自定义图标绘制代码没有考虑按钮的翻转状态.

添加MouseListener很容易.自定义UI(这是正确的解决方案)以更好地支持翻转更为复杂.

对于一个似乎有效的简单hack,我只是更新MouseListener中的Icon,而不是让UI确定要绘制哪个Icon.我建议你忘记这个要求并使用普通的UI,它不会改变菜单和菜单项的图标.使用以下风险需要您自担风险:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ButtonRollover extends JFrame
{
    Icon normal;
    Icon rollover;
    Icon selected;

    public ButtonRollover()
    {
        MouseListener ml = new RolloverButtonListener();

        normal = new ColorIcon(Color.GREEN, 10, 10);
        rollover = new ColorIcon(Color.RED, 10, 10);
        selected = new ColorIcon(Color.BLUE, 10, 10);

        setLayout( new FlowLayout() );

        JMenuBar menuBar = new JMenuBar();
        setJMenuBar( menuBar );

        JMenu menu = (JMenu)createButton(new JMenu(), "Menu");
        menu.addMouseListener( ml );
        menuBar.add( menu );

        JMenuItem menuItem = (JMenuItem)createButton(new JMenuItem(), "MenuItem");
        menuItem.addMouseListener( ml );
        menu.add( menuItem );

        JButton button = (JButton)createButton(new JButton(), "Button");
        add( button );

        JCheckBox checkBox = (JCheckBox)createButton(new JCheckBox(), "CheckBox");
        add( checkBox );

        JRadioButton radioButton = (JRadioButton)createButton(new JRadioButton(), "RadioButton");
        add( radioButton );
    }


    public AbstractButton createButton(AbstractButton button, String text)
    {
        button.setText( text );
        button.setIcon( normal );
        button.setSelectedIcon( selected );
        button.setRolloverIcon( rollover );
        button.setRolloverSelectedIcon( rollover );

        System.out.println( text );
        MouseListener[] mls = button.getMouseListeners();

        for (MouseListener ml: mls)
        {
            System.out.println( "\t" + ml);
        }

        return button;
    }

    class RolloverButtonListener extends MouseAdapter
    {
        private Icon normal;

        public void mouseEntered(MouseEvent e)
        {
            AbstractButton b = (AbstractButton) e.getSource();
            ButtonModel model = b.getModel();

            if (b.isRolloverEnabled() && !SwingUtilities.isLeftMouseButton(e))
            {
                normal = b.getIcon();
                b.setIcon(b.getRolloverIcon());
                model.setRollover(true);
            }
        }

        public void mouseExited(MouseEvent e)
        {
            AbstractButton b = (AbstractButton) e.getSource();
            ButtonModel model = b.getModel();

            if(b.isRolloverEnabled())
            {
                b.setIcon( normal );
                model.setRollover(false);
            }
        };

    }

    public class ColorIcon implements Icon
    {
        private Color color;
        private int width;
        private int height;

        public ColorIcon(Color color, int width, int height)
        {
            this.color = color;
            this.width = width;
            this.height = height;
        }

        public int getIconWidth()
        {
            return width;
        }

        public int getIconHeight()
        {
            return height;
        }

        public void paintIcon(Component c, Graphics g, int x, int y)
        {
            g.setColor(color);
            g.fillRect(x, y, width, height);
        }
    }

    public static void main(String[] args)
    {
        try
        {
//          UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }
        catch (Exception e) { }

        ButtonRollover frame = new ButtonRollover();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.setSize(400, 200);
        frame.setLocationRelativeTo( null );
        frame.setVisible(true);
    }
}
Run Code Online (Sandbox Code Playgroud)