JButtons MouseEvents - PullRequest
       16

JButtons MouseEvents

0 голосов
/ 14 апреля 2020

Я хочу, чтобы мои кнопки меняли цвет, когда на них (при наведении курсора мыши), когда они нажаты (активны), и оставайтесь в этом положении, пока пользователь не выберет другие параметры. Так что один из них будет всегда выбран.

У меня есть три кнопки - с криклом, квадратом и треугольником. Мой код:

private static MouseListener ButtonMouseListener = new MouseAdapter () {

        public void mouseEntered(MouseEvent evt) {
            Component source = evt.getComponent(); 
            source.setBackground(new Color(91, 90, 90));
        }    

        public void mouseExited(MouseEvent evt) {
            Component source = evt.getComponent();
            source.setBackground(new Color(64, 64, 64));
        }

        public void mousePressed(MouseEvent evt) {
            Component source = evt.getComponent();
            source.setBackground(new Color(46, 46, 46));
        }
    };

Поэтому я хочу, чтобы кнопки меняли цвет при наведении на них (mouseEntered) и снова меняли цвет на стандартный, когда кто-то перестает зависать (вот почему у меня mouseExited). Следующее, что я хочу, чтобы они меняли цвет, когда они выбраны, поэтому mousePressed. Проблема в том, что когда я перемещаю курсор за пределы кнопки, он меняется на другой цвет из-за mouseExited, и я этого не хочу. Он должен оставаться в нажатом цвете, пока пользователь не выберет другую из трех кнопок. Я понятия не имею, как этого добиться, я пробовал разные варианты, но ничего не получается так, как я хочу.

Ответы [ 2 ]

1 голос
/ 14 апреля 2020
  1. Для изменения цвета ввода вам нужно реализовать Event-> Mouse -> mouseEntered. Убедитесь, что вы реализуете его на mouseExited
  2. При изменении цвета при нажатии мыши вам нужно реализовать Event-> Action. Внутри actionPerformed вы можете установить цвет кнопки. Например:

    jButton7.setBackground(new Color(11, 118, 219));
    jButton1.setBackground(new Color(15,44,123));
    jButton8.setBackground(new Color(15,44,123));
    jButton9.setBackground(new Color(15,44,123));
    
0 голосов
/ 14 апреля 2020

Вы можете использовать JToggleButton вместо JButton, поскольку они имеют свое собственное свойство пользовательского интерфейса для выделения (нажатой) фона. Вы можете переопределить это так:

UIManager.put("ToggleButton.select", Color.GREEN);

SSCCE того, что я бы сделал:

public class ToggleButtonsExample extends JFrame {
    private static final Color PRESSED_COLOR = Color.BLUE;
    private static final Color HOVER_COLOR = Color.RED;

    public ToggleButtonsExample() {
        super("Example");
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        setLayout(new FlowLayout());

        JToggleButton button1 = new JToggleButton("button1");
        JToggleButton button2 = new JToggleButton("button2");
        JToggleButton button3 = new JToggleButton("button3");
        final Color defaultBackgroundColor = button1.getBackground();

        MouseListener hoverColorMouseListener = new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent e) {
                Component component = e.getComponent();
                component.setBackground(HOVER_COLOR);
            }

            @Override
            public void mouseExited(MouseEvent e) {
                Component component = e.getComponent();
                component.setBackground(defaultBackgroundColor);
            }
        };

        List<AbstractButton> buttons = Arrays.asList(button1, button2, button3);
        buttons.forEach(this::add);
        buttons.forEach(b -> b.addMouseListener(hoverColorMouseListener));

        setLocationByPlatform(true);
        pack();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            UIManager.put("ToggleButton.select", PRESSED_COLOR);
            new ToggleButtonsExample().setVisible(true);
        });
    }
}

и изображение для предварительного просмотра:

preview

...