java - JTabbedPane 的 MouseEvent

标签 java swing

我想在您右键单击选项卡时显示一个小的弹出菜单,现在这可以正常工作,但是当您右键单击它时,它也会选择不需要的选项卡。

所以我的想法是创建一个新类,扩展 JTabbedPane 并重新编码这些鼠标事件。问题是我不知道从哪里开始,我正在浏览它的 source但我找不到处理鼠标事件的部分。

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());
        }
    }
});  

最佳答案

当心:肮脏的黑客前进!我推荐它的唯一原因是我认为该行为(右键选择)是 BasicTabbedPaneUI 处理程序中的一个错误。

基本思想是获取由 ui 安装的监听器,将其删除,包装到自定义监听器中,该监听器将除按权利之外的所有内容委托(delegate)给原始监听器,并将其添加到 Pane 中:

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

}

关于java - JTabbedPane 的 MouseEvent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8080438/

相关文章:

java - 在 Java 上找不到符号错误?

Java zipfile/字节数组问题

java - 在列表中组织JPanel的最佳方法是什么?

java - Avro 序列化对象不可序列化问题

java - 同步局部变量

java - 在 Swing 上绘画

java - 在更大的图像上移动视口(viewport); JLabel+JScrollPane

java - 基于每台计算机的 GIF 速度?

java - Swing 组件如何考虑我的默认语言环境?

java - WSO2 ESB 自定义 POJO 命令