首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >右键单击JPopupMenu on JTabbedPane

右键单击JPopupMenu on JTabbedPane
EN

Stack Overflow用户
提问于 2017-10-20 00:38:28
回答 1查看 1.2K关注 0票数 5

我有一个带有自定义选项卡组件的JTabbedPane。我希望能够右键单击标签上的任何地方,并显示一个JPopupMenu。我遇到的问题是,在每个选项卡上都有死空间,在这些选项卡上,JPopupMenu不出现,只需右键单击。我相信这是因为我将侦听器附加到充当tab组件的JPanel上,但是JPanel并没有“填充”整个选项卡。

是否有方法将鼠标侦听器附加到整个选项卡?

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

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-20 02:08:16

是否有方法将鼠标侦听器附加到整个选项卡?

您可以将MouseListener添加到JTabbedPane中。

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

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

编辑:

BasicTabbedPaneUI有一个tabForCoordinate(...)方法,它消除了迭代逻辑的需要。

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

https://stackoverflow.com/questions/46840814

复制
相关文章

相似问题

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