MouseEvent of JTabbedPane - PullRequest
       2

MouseEvent of JTabbedPane

2 голосов
/ 10 ноября 2011

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

Итак, моя идея состояла в том, чтобы создать новый класс, расширить JTabbedPane и перекодировать эти события мыши.Проблема в том, что я понятия не имею, с чего начать, я просматривал источник , но не могу найти, какая часть управляет mouseEvents.

Tabs.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent me) {
        if(me.getButton()==3){
            int tabNr = ((TabbedPaneUI)Tabs.getUI()).tabForCoordinate(Tabs, me.getX(), me.getY());
            Component clickedTab = EventsConfig.window.MainTabs.getComponentAt(tabNr);
            newMenu(clickedTab, me.getX(), me.getY());
        }
    }
});  

Ответы [ 4 ]

3 голосов
/ 10 ноября 2011

Осторожно: грязный взлом вперед! Единственная причина, по которой я это рекомендую, заключается в том, что я считаю поведение (выберите при нажатии правой кнопки мыши) ошибкой в ​​обработчике BasicTabbedPaneUI.

Основная идея состоит в том, чтобы взять прослушиватель, установленный пользовательским интерфейсом, удалить его, обернуть в пользовательский прослушиватель, который делегирует все, кроме правого нажатия на оригинал, и добавить его на панель:

private void installMouseListenerWrapper(JComponent tabbedPane) {
    MouseListener handler = findUIMouseListener(tabbedPane);
    tabbedPane.removeMouseListener(handler);
    tabbedPane.addMouseListener(new MouseListenerWrapper(handler));
}

private MouseListener findUIMouseListener(JComponent tabbedPane) {
    MouseListener[] listeners = tabbedPane.getMouseListeners();
    for (MouseListener l : listeners) {
        if (l.getClass().getName().contains("$Handler")) {
            return l;
        }
    }
    return null;
}

public static class MouseListenerWrapper implements MouseListener {

    private MouseListener delegate;

    public MouseListenerWrapper(MouseListener delegate) {
        this.delegate = delegate;
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        delegate.mouseClicked(e);
    }

    @Override
    public void mousePressed(MouseEvent e) {
        if (SwingUtilities.isRightMouseButton(e)) return;
        delegate.mousePressed(e);
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        delegate.mouseReleased(e);
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        delegate.mouseEntered(e);
    }

    @Override
    public void mouseExited(MouseEvent e) {
        delegate.mouseExited(e);
    }

}
1 голос
/ 10 ноября 2011

Возможный обходной путь - установить пользовательский компонент вкладки для каждой вкладки - см. JTabbedPane # setTabComponentAt (...).Добавьте обработчик мыши в пользовательский компонент вкладки и повторно отправьте события щелчка левой кнопкой мыши на tabbedPane, как описано в http://www.jyloo.com/news/?pubId=1315817317000.

Пользовательский компонент вкладки может быть простым JLabel (используется для заголовка вкладки) илиКонтейнер для нескольких компонентов.В зависимости от ваших требований вы можете, например, добавить кнопку со стрелкой, которая откроет всплывающее меню, щелкнув левой кнопкой мыши соответствующую кнопку.

1 голос
/ 10 ноября 2011

затем необходимо добавить JPopupMenu (или JToolTip на MouseHoverOver) в JTabbedPane

0 голосов
/ 11 мая 2016

Эта статья будет полезна для удаления нежелательных вкладок при нажатии правой кнопки мыши. Остановить правый клик по событию на JTabbedPane

Мне понравилось добавлять больше об удалении слушателей мыши. Попробуйте переопределить метод, а не удалять его. Это лучше для будущих обновлений кода.

Проблема в том, что у BasicTabbedPaneUI есть внутренний класс, называемый Handler. Этот класс обработчика переопределяет Mouse Listener. Чтобы остановить щелчок правой кнопкой мыши и выбрать всплывающее меню; нам нужно переопределить этот метод в BasicTabbedPaneUI,

protected MouseListener createMouseListener() {
    return getHandler();
}

Чтобы улучшить внешний вид, мы должны переопределить класс SynthTabbedPaneUI. SynthTabbedPaneUI - это расширение BasicTabbedPaneUI.

Итак, наш внутренний класс такой,

private class SynthTabbedPaneUIWrapper extends SynthTabbedPaneUI
{
   private MouseAdapter menuAdapter;

   private MouseAdapter getMenuAdapter()
   {
    if (menuAdapter == null)
    {
      menuAdapter =
         new MouseAdapter()
        {
           @Override
           public void mouseReleased(final MouseEvent e)
           {
              //implement to stop right click tab selection
              //implement to show pop up menu
           }
        };
    }
  }

  @Override
  protected MouseListener createMouseListener()
  {
    return getMenuAdapter();
  }
}

После этого мы можем установить наш объект пользовательского интерфейса в TabbedPane.

 tabbedPane.setUI(new SynthTabbedPaneUIWrapper());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...