Java перерисовывает компонент при наведении курсора мыши. - PullRequest
3 голосов
/ 19 июня 2011

Я пытаюсь создать свой первый правильно настроенный графический интерфейс, но мне трудно изменить изображение, которое было нарисовано для компонента. По сути, для моего exitButton (JMenu) я перезаписываю метод рисования, а затем добавляю прослушиватель Mouse, но я не уверен, как перерисовать изображение в интерфейсе mouseListener в методе Mouse и снова в методе выхода из мыши. По сути, я ищу способ перекрасить изображение, но я теряюсь в том, что я могу сделать. Любая помощь будет принята с благодарностью.

Вот соответствующий фрагмент кода:

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"); 

System.out.println ("мышь вышла"); // Имиджикон для оригинального изображения } @Override public void mouseReleased (MouseEvent me) { } });

Ответы [ 3 ]

6 голосов
/ 19 июня 2011

Я пытаюсь создать свой первый правильно настроенный графический интерфейс

Начните с чтения учебника по Swing.Я не совсем уверен, что вы пытаетесь сделать, но ваш подход кажется неправильным.

Вы можете начать с Как использовать меню , который показывает, как использовать ActionListener для работы с мышьюнажмите кнопку.Щелчки мыши обычно обрабатываются в пункте меню, а не в меню.Как правило, у вас есть что-то вроде меню «Файл», которое будет содержать пункт меню «Выход».

Затем я бы также посмотрел на API JMenu для различных методов, которые позволяют вам изменять значок, когда вы наводите курсор мыши.или выберите меню.Возможно, setRolloverEnabled (), setRolloverIcon () - это то, что вы ищете.

Если у вас все еще есть проблемы, то опубликуйте SSCCE , который демонстрирует проблему.

Обновление:

Как уже упоминалось в Hovercraft, поддержка опрокидывания не работает для меню или пунктов меню.Есть две проблемы.Прежде всего, другой MouseListener используется этими компонентами.Слушатель НЕ слушает события mouseEntered и mouseExited.Вторая проблема заключается в том, что пользовательский интерфейс для этих двух компонентов был настроен, а пользовательский код рисования значков не учитывает состояние нажатия кнопки.

Добавление MouseListener легко.Настройка пользовательского интерфейса (который является правильным решением) для правильной поддержки опрокидывания является более сложной задачей.

Для простого взлома, который, кажется, работает, я просто обновляю Icon в MouseListener вместо того, чтобы пользовательский интерфейс определял, какой Icon рисовать.Я советую вам забыть об этом требовании и использовать обычный пользовательский интерфейс, который не меняет иконки для меню и пунктов меню.Используйте на свой страх и риск следующее:

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);
    }
}
2 голосов
/ 19 июня 2011

RollOver для кнопки работает с обменом значками, но я не могу заставить его работать для JMenu:

import java.awt.*;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;

public class SwapMenuIcons {

   private static final String KENAI_1 = "http://duke.kenai.com/iconSized/duke.gif";
   private static final String KENAI_2 = "http://duke.kenai.com/iconSized/penduke-transparent.gif";

   private static void createAndShowUI() {
      try {
         Image duke1 = ImageIO.read(new URL(KENAI_1));
         Image duke2 = ImageIO.read(new URL(KENAI_2));
         ImageIcon icon1 = new ImageIcon(duke1);
         ImageIcon icon2 = new ImageIcon(duke2);

         JMenu myMenu = new JMenu();
         myMenu.setIcon(icon1);
         myMenu.setRolloverIcon(icon2);
         myMenu.setRolloverEnabled(true);

         JButton myButton = new JButton(icon1);
         myButton.setRolloverIcon(icon2);
         JPanel btnPanel = new JPanel();
         btnPanel.add(myButton);

         JMenuBar menuBar = new JMenuBar();
         menuBar.add(myMenu);

         JFrame frame = new JFrame("SwapMenuIcons");
         frame.setJMenuBar(menuBar);
         frame.add(btnPanel, BorderLayout.CENTER);
         frame.setPreferredSize(new Dimension(400, 300));
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         frame.pack();
         frame.setLocationRelativeTo(null);
         frame.setVisible(true);
      } catch (MalformedURLException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}
1 голос
/ 19 июня 2011

куча разных способов.Самое грязное - иметь глобальное логическое значение isMouseHovering, в котором вы переключаетесь между истиной и ложью с помощью mouseEntered и mouseExited.В обоих этих событиях мыши вызовите repaint ();В вашем методе перерисовки нарисуйте изображение на основе значения этого логического значения.

...