Java JTabbedPane。选择鼠标左键上的选项卡仅单击

Java JTabbedPane。选择鼠标左键上的选项卡仅单击,java,swing,jtabbedpane,Java,Swing,Jtabbedpane,我想设置最常见的JTabbedPane鼠标事件行为,但找不到合适的选项来设置: 鼠标左键单击-选择选项卡 右键单击鼠标按钮-打开当前选项卡”下拉菜单 控制盘鼠标按钮单击-关闭选项卡 问题:有什么方法可以实现它们吗 PS:中的任何示例都可能是SSCCE选项卡选择默认情况下使用鼠标左键执行,因此您无需添加该功能。在这个小示例中,您可以找到其他所有内容: public static void main ( String[] args ) { final JFrame frame = new J

我想设置最常见的
JTabbedPane
鼠标事件行为,但找不到合适的选项来设置:

  • 鼠标左键单击-
    选择选项卡

  • 右键单击鼠标按钮-
    打开当前选项卡”下拉菜单

  • 控制盘鼠标按钮单击-
    关闭选项卡

  • 问题:有什么方法可以实现它们吗


    PS:中的任何示例都可能是
    SSCCE

    选项卡选择默认情况下使用鼠标左键执行,因此您无需添加该功能。在这个小示例中,您可以找到其他所有内容:

    public static void main ( String[] args )
    {
        final JFrame frame = new JFrame ();
    
        final JTabbedPane tabbedPane = new JTabbedPane ();
        tabbedPane.addTab ( "tab1", new JLabel ( "" ) );
        tabbedPane.addTab ( "tab2", new JLabel ( "" ) );
        tabbedPane.addTab ( "tab3", new JLabel ( "" ) );
        tabbedPane.addTab ( "tab4", new JLabel ( "" ) );
        frame.add ( tabbedPane );
    
        tabbedPane.setUI ( new MetalTabbedPaneUI ()
        {
            protected MouseListener createMouseListener ()
            {
                return new CustomAdapter ( tabbedPane );
            }
        } );
    
        frame.pack ();
        frame.setLocationRelativeTo ( null );
        frame.setDefaultCloseOperation ( WindowConstants.EXIT_ON_CLOSE );
        frame.setVisible ( true );
    }
    
    private static class CustomAdapter extends MouseAdapter
    {
        private JTabbedPane tabbedPane;
    
        public CustomAdapter ( JTabbedPane tabbedPane )
        {
            super ();
            this.tabbedPane = tabbedPane;
        }
    
        public void mousePressed ( MouseEvent e )
        {
            final int index = tabbedPane.getUI ().tabForCoordinate ( tabbedPane, e.getX (), e.getY () );
            if ( index != -1 )
            {
                if ( SwingUtilities.isLeftMouseButton ( e ) )
                {
                    if ( tabbedPane.getSelectedIndex () != index )
                    {
                        tabbedPane.setSelectedIndex ( index );
                    }
                    else if ( tabbedPane.isRequestFocusEnabled () )
                    {
                        tabbedPane.requestFocusInWindow ();
                    }
                }
                else if ( SwingUtilities.isMiddleMouseButton ( e ) )
                {
                    tabbedPane.removeTabAt ( index );
                }
                else if ( SwingUtilities.isRightMouseButton ( e ) )
                {
                    final JPopupMenu popupMenu = new JPopupMenu ();
    
                    final JMenuItem addNew = new JMenuItem ( "Add new" );
                    addNew.addActionListener ( new ActionListener ()
                    {
                        public void actionPerformed ( ActionEvent e )
                        {
                            tabbedPane.addTab ( "tab", new JLabel ( "" ) );
                        }
                    } );
                    popupMenu.add ( addNew );
    
                    final JMenuItem close = new JMenuItem ( "Close" );
                    close.addActionListener ( new ActionListener ()
                    {
                        public void actionPerformed ( ActionEvent e )
                        {
                            tabbedPane.removeTabAt ( index );
                        }
                    } );
                    popupMenu.add ( close );
    
                    final JMenuItem closeAll = new JMenuItem ( "Close all" );
                    closeAll.addActionListener ( new ActionListener ()
                    {
                        public void actionPerformed ( ActionEvent e )
                        {
                            tabbedPane.removeAll ();
                        }
                    } );
                    popupMenu.add ( closeAll );
    
                    final Rectangle tabBounds = tabbedPane.getBoundsAt ( index );
                    popupMenu.show ( tabbedPane, tabBounds.x, tabBounds.y + tabBounds.height );
                }
            }
        }
    }
    
    当然,您最好将显示的菜单保存在某个位置,这样就不会在用户每次打开菜单时都重新创建它。您还可以将鼠标侦听器移动到单独的类,以便在每次需要菜单和其他功能时使用它


    但我的目标是向您展示如何完成这些事情,而不是制作一个完美的示例,因此我想开始使用选项卡式窗格已经足够了:)

    请选择哪一个,有一些代码示例,可能对潜在的回答者很重要有两个示例。实际上没有关系。打开下拉菜单会是弹出菜单吗?如何设置标签?@kleopatra>如何设置标签?这是另一个问题:)挑剔:tabbedPane的
    ui.tabForCoordinate
    的封面方法是
    索引定位
    :-)@kleopatra yeh,我只是不记得所有的名称,有时会使用UI方法-反正没有区别,因为该方法在TabbedPaneUI界面中,在任何L&F中都可用。我不喜欢这些覆盖方法的地方-似乎它们的名称是随机取的,说真的-为什么不使用与UI中相同的方法名呢?。实际上有一个区别:cover方法防止出现空UI;)不太可能,但可能会发生……这几乎是不可能的情况,除非您尝试做一些真正愚蠢的事情,并在不应该做的地方乱用Swing UI;)@MikleGarin谢谢,但还有一个例外:default
    TabbedPane
    mouseListener仍在工作和存在,所以我的解决方案是扩展
    DefaultTabbedPaneUI
    并用逻辑覆盖
    createMouseListener
    方法,接近您的逻辑。