代码之家  ›  专栏  ›  技术社区  ›  mainstringargs

右键单击JTabbedPane上的JPopupMenu

  •  5
  • mainstringargs  · 技术社区  · 7 年前

    我有一个JTabbedPane,带有一个自定义选项卡组件。我希望能够右键单击选项卡上的任何位置,并显示jpopmpmenu。我遇到的问题是,每个选项卡上都有死区,在那里,右键单击不会显示JPopupMenu。我认为这是因为我将侦听器附加到一个充当选项卡组件的JPanel,但JPanel并没有“填充”整个选项卡。

    有没有办法将鼠标侦听器连接到整个选项卡?

    这里有一个例子来说明我所看到的。在选项卡的黄色区域,我可以右键单击并获得弹出菜单,但在选项卡的灰色区域,右键单击不会被拦截。

    enter image description here

    public class TabExample {
    
        public static void main(String[] args) {
    
            EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    JFrame frame = new JFrame();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
                    frame.setBounds(100, 100, 1024, 768);
    
                    JTabbedPane pane = new JTabbedPane();
    
                    for (int i = 0; i < 15; i++) {
                        JPanel panel = new JPanel();
                        JLabel label = new JLabel("Panel " + i);
                        panel.add(label);
                        pane.addTab("", panel);
    
                        final JPanel tabComponentPanel = new JPanel(new BorderLayout());
    
                        final JLabel tabComponentLabel = new JLabel("My Tab " + i);
    
                        final JLabel tabComponentImageLabel = new JLabel();
                        ImageIcon icon = new ImageIcon(getImage());
                        tabComponentImageLabel.setHorizontalAlignment(JLabel.CENTER);
                        tabComponentImageLabel.setIcon(icon);
    
                        tabComponentPanel.add(tabComponentImageLabel,BorderLayout.CENTER);
                        tabComponentPanel.add(tabComponentLabel,BorderLayout.SOUTH);
    
                        tabComponentPanel.setBackground(Color.YELLOW);
    
                        tabComponentPanel.addMouseListener(new MouseAdapter() {
    
                            @Override
                            public void mouseClicked(MouseEvent e) {
    
                                if (e.getButton() == MouseEvent.BUTTON1) {
                                    pane.setSelectedComponent(panel);
                                } else if (e.getButton() == MouseEvent.BUTTON3) {
                                    JPopupMenu jPopupMenu = new JPopupMenu();
                                    JMenuItem menuItem = new JMenuItem("Menu Item");
                                    jPopupMenu.add(menuItem);
                                    menuItem.addActionListener(new ActionListener() {
    
                                        @Override
                                        public void actionPerformed(ActionEvent e) {
                                            System.out.println("Clicked ");
    
                                        }
                                    });
    
                                    jPopupMenu.show(tabComponentPanel, e.getX(),
                                            e.getY());
                                }
                            }
    
                        });
    
                        pane.setTabComponentAt(pane.indexOfComponent(panel),
                                tabComponentPanel);
                    }
    
                    frame.add(pane);
    
                    frame.setVisible(true);
    
                }
    
            });
        }
    
        private static BufferedImage getImage() {
            BufferedImage bimage = new BufferedImage(16, 16,
                    BufferedImage.TYPE_BYTE_INDEXED);
    
            Graphics2D g2d = bimage.createGraphics();
    
            g2d.setColor(Color.red);
            g2d.fill(new Ellipse2D.Float(0, 0, 16, 16));
            g2d.dispose();
    
            return bimage;
        }
    }
    
    1 回复  |  直到 3 年前
        1
  •  3
  •   camickr    7 年前

    有没有办法将鼠标侦听器连接到整个选项卡?

    您可以将MouseListener添加到JTabbedPane。

    然后在MouseEvent上,您可以使用 getUI() BasicTabbedPaneUI 班这个班有一个 getTabBounds(...) 方法

    因此,您可以遍历所有选项卡,查看任何选项卡的边界是否与鼠标点匹配。

    编辑:

    有一个 tabForCoordinate(...)