首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JTabbedPane的MouseEvent

JTabbedPane的MouseEvent
EN

Stack Overflow用户
提问于 2011-11-10 21:45:57
回答 4查看 4.3K关注 0票数 2

我想要显示一个小的弹出式菜单,当你右击一个标签,现在这是工作正常,但当你右击它也选择了该标签是不需要的。

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

代码语言:javascript
复制
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());
        }
    }
});  
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-11-10 22:45:31

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

基本思想是抓取ui安装的侦听器,将其移除,包装成一个自定义侦听器,该侦听器将除按下的右键外的所有内容委托给原始侦听器,并将其添加到窗格中:

代码语言:javascript
复制
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);
    }

}
票数 4
EN

Stack Overflow用户

发布于 2011-11-10 21:52:54

然后,您必须将JPopupMenu (或MouseHoverOver上的JToolTip )添加到JTabbedPane

票数 1
EN

Stack Overflow用户

发布于 2011-11-11 02:07:36

一种可能的解决方法是为每个选项卡设置自定义选项卡组件-请参见JTabbedPane#setTabComponentAt(...)。向您的自定义选项卡组件添加一个鼠标处理程序,并将鼠标左键单击事件重新分派到tabbedPane,如http://www.jyloo.com/news/?pubId=1315817317000所述。

自定义选项卡组件可以是一个简单的JLabel (用于选项卡标题)或多个组件的容器。根据您的需求,您可以添加一个箭头按钮,该按钮将通过左键单击相关按钮来打开弹出菜单。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8080438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档