Java - добавление и удаление подчеркнутого текста в JButton на Hover - PullRequest
0 голосов
/ 26 сентября 2018

Я использую следующий код, чтобы успешно иметь эффект наведения подчеркнутого текста, когда пользователь наводит курсор на JButton.Это работает как задумано.

При нажатии JButton просто удаляет текущую JPanel с экрана и добавляет к ней новую.Это также работает.

Проблема в том, что при фактическом щелчке эффект наведения подчеркнутого текста остается постоянно на JButton и не исчезает при перемещении мыши.

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

Фрагмент:

class MyAcctListener implements ActionListener
{
    public void actionPerformed(ActionEvent e) 
    {
        totalGUI.removeAll();
        totalGUI.add(headerPanel, BorderLayout.NORTH);
        totalGUI.add(myAcctPanel, BorderLayout.CENTER);
        repaint();
        revalidate();
    }
}

@SuppressWarnings("unchecked")
class HeaderMouseListener extends MouseAdapter
{
    Font original;

    @Override
    public void mouseEntered(MouseEvent evt) {
        original = evt.getComponent().getFont();
        Map attributes = original. getAttributes();
        attributes.put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON);
        evt.getComponent().setFont(original.deriveFont(attributes));
    }

    @Override
    public void mouseExited(MouseEvent evt){
        evt.getComponent().setFont(original);   
    }

    @Override
    public void mouseClicked(MouseEvent evt) {
        evt.getComponent().setFont(original); 
    }
}


private void createComponents() {
    MouseListener headerMouseListener = new HeaderMouseListener();
    acctButton = new JButton("My Account");
    acctButton.setFont(buttonFont);
    acctButton.setForeground(Color.BLUE);
    acctButton.setBorderPainted(false);
    acctButton.setContentAreaFilled(false);
    acctButton.addMouseListener(headerMouseListener);
    ActionListener myacctListener = new MyAcctListener();
    acctButton.addActionListener(myacctListener);
}

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Я мог бы воспользоваться советами экспертов о том, как сохранить подчеркивающий эффект на месте, удаляя его при добавлении нового JPanel через прослушиватель действий

Зачем удалять его черезActionListener?Кнопка все еще активна.Нет причин, по которым пользователь не мог бы снова нажать на кнопку.

В любом случае исходная логика является разумной, вам просто нужно удалить атрибут подчеркивания в событиях mouseExited и / или mouseClicked.Ключевая часть, которую вы должны были узнать из ответа Hovercraft, заключалась в том, как удалить атрибут underline из шрифта.

Я хотел бы повторно использовать его для нескольких кнопок без повторения кода.

Если вы следуете своему оригинальному решению, вы можете поделиться MouseListener, потому что источником события будет кнопка:

MouseListener ml = new MouseAdapter()
{
    @Override
    public void mouseEntered(MouseEvent evt) {
        Component button = evt.getComponent();
        Font font = button.getFont();
        Map attributes = font.getAttributes();
        attributes.put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON);
        button.setFont(font.deriveFont(attributes));
    }

    @Override
    public void mouseExited(MouseEvent evt){
    System.out.println("Exited");
        Component button = evt.getComponent();
        Font font = button.getFont();
        Map attributes = font.getAttributes();
        attributes.put(TextAttribute.UNDERLINE, null);
        button.setFont(font.deriveFont(attributes));
    }
    /*
    @Override
    public void mouseClicked(MouseEvent evt) {
        Component button = evt.getComponent();
        Font font = button.getFont();
        Map attributes = font.getAttributes();
        attributes.put(TextAttribute.UNDERLINE, null);
        button.setFont(font.deriveFont(attributes));
    }
    */
};

JButton button1 = new JButton("Button 1");
add( button1 );
button1.addMouseListener( ml );

JButton button2 = new JButton("Button 2");
add( button2 );
button2.addMouseListener( ml );
0 голосов
/ 26 сентября 2018

Согласно предложению MadProgrammer, одним из возможных решений является добавление ChangeListener в модель кнопки и проверка на model.isRollover() в этом слушателе и ведение себя соответствующим образом.

Например:

button.getModel().addChangeListener(evt -> {
    ButtonModel model = (ButtonModel) evt.getSource();
    Font btnFont = button.getFont();
    Map attributes = btnFont.getAttributes();

    if (model.isRollover()) {
        attributes.put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON);
    } else {
        attributes.put(TextAttribute.UNDERLINE, null);
    }
    btnFont = btnFont.deriveFont(attributes);
    button.setFont(btnFont);
});

Но это несколько "глупо", так как изменяет состояние кнопки из слушателя модели.

...