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谢谢,但还有一个例外:defaultTabbedPane
mouseListener仍在工作和存在,所以我的解决方案是扩展DefaultTabbedPaneUI
并用逻辑覆盖createMouseListener
方法,接近您的逻辑。