Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 右键单击JTabbedPane上的JPopupMenu_Java_Swing_Jtabbedpane - Fatal编程技术网

Java 右键单击JTabbedPane上的JPopupMenu

Java 右键单击JTabbedPane上的JPopupMenu,java,swing,jtabbedpane,Java,Swing,Jtabbedpane,我有一个带有自定义选项卡组件的JTabbedPane。我希望能够右键单击选项卡上的任何位置,并显示JPOppMenu。我遇到的问题是,每个选项卡上都有死区,右键单击不会显示JPOppMenu。我相信这是因为我将侦听器附加到一个充当选项卡组件的JPanel,但是JPanel并没有“填充”整个选项卡 有没有办法将鼠标侦听器附加到整个选项卡 这里有一个例子来说明我所看到的。在选项卡的黄色区域,我可以右键单击并获得弹出菜单,但在选项卡的灰色区域,右键单击不会被拦截 公共类选项卡示例{ 公共静态void

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

有没有办法将鼠标侦听器附加到整个选项卡

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

公共类选项卡示例{
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
JFrame=新JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
框架.立根(1001001024768);
JTabbedPane=新的JTabbedPane();
对于(int i=0;i<15;i++){
JPanel面板=新的JPanel();
JLabel标签=新的JLabel(“面板”+i);
面板。添加(标签);
pane.addTab(“,panel”);
最终的JPanel选项卡ComponentPanel=新的JPanel(新的BorderLayout());
最终JLabel选项卡组件标签=新JLabel(“我的选项卡”+i);
最终JLabel选项卡ComponentImageLabel=新JLabel();
ImageIcon=newImageIcon(getImage());
选项卡ComponentImageLabel.setHorizontalAlignment(JLabel.CENTER);
tabComponentImageLabel.setIcon(图标);
tabComponentPanel.add(tabComponentImageLabel,BorderLayout.CENTER);
tabComponentPanel.add(tabComponentLabel,BorderLayout.SOUTH);
tabComponentPanel.setBackground(颜色:黄色);
tabComponentPanel.addMouseListener(新的MouseAdapter(){
@凌驾
公共无效mouseClicked(MouseEvent e){
如果(例如getButton()==MouseEvent.BUTTON1){
窗格。设置所选组件(面板);
}else if(e.getButton()==MouseEvent.BUTTON3){
JPopupMenu JPopupMenu=新的JPopupMenu();
JMenuItem menuItem=新的JMenuItem(“菜单项”);
jpopumenu.add(menuItem);
menuItem.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
System.out.println(“单击”);
}
});
jpopumenu.show(选项卡ComponentPanel,e.getX(),
e、 getY());
}
}
});
pane.setTabComponentAt(pane.indexOfComponent(面板),
选项卡组件(面板);
}
框架。添加(窗格);
frame.setVisible(true);
}
});
}
私有静态缓冲区映像getImage(){
BuffereImage双图像=新的BuffereImage(16,16,
BuffereImage.TYPE_BYTE_INDEXED);
Graphics2D g2d=bimage.createGraphics();
g2d.setColor(Color.red);
g2d.fill(新的椭圆2d.Float(0,0,16,16));
g2d.dispose();
返回双图像;
}
}
有没有办法将鼠标侦听器附加到整个选项卡

您可以将鼠标侦听器添加到JTabbedPane

然后在MouseEvent上,可以使用
getUI()
方法获取
basictabedpaneui
类。此类有一个
gettabounds(…)
方法

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

编辑:


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

Genius!非常感谢。我认为有一种更干净的方法,但这很有效。@mainstringargs
我认为有一种更干净的方法
-你说得对。请参见编辑。
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;
    }
}