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

JTabbedPane选项卡组件的鼠标事件没有溢出

  •  3
  • Sandro  · 技术社区  · 14 年前

    我有一个 JTabbedPane JLabel (显示选项卡标题)和 JButton (关闭按钮)。当我改变文本的时候 这个 标签类 停止接收鼠标事件,当我直接单击标签时,我无法再选择该选项卡,而如果我在标签周围单击,则可以选择该选项卡。有什么想法吗?

    代码片段:

    class ShellPanelTabComponent extends JPanel implements ActionListener{
    
        private ShellPanel panel;
        private JLabel label;
    
        public ShellPanelTabComponent(final ShellPanel panel){
          super(new FlowLayout(FlowLayout.LEFT, 0, 0));
          this.panel = panel;
          setOpaque(false);
    
          label = new JLabel(panel.getTitle());
          label.setFocusable(false);
          add(label);
          label.setBorder(BorderFactory.createEmptyBorder(2,0,0,5));
    
          //now the button
          CloseButton closeButton = new CloseButton(panel);
          add(closeButton);
          closeButton.addActionListener(this);
        }
    
        public void actionPerformed(ActionEvent ae) {
          panel.getShell().removeShellPanel(panel);
        }
    
        /**
         * @return the label
         */
        public JLabel getLabel() {
          return label;
        }
      }
    
    3 回复  |  直到 14 年前
        1
  •  2
  •   trashgod    14 年前

    我不记得在学校里见过这样的问题 TabComponentsDemo How to Use Tabbed Panes

    附录:重新保理 ButtonTabComponent 包括 getLabel() ,此版本的 runTest() 在里面 TabComponentsDemo

    更新:修改正确的选项卡组件 pane.remove() .

    public void runTest() {
        pane.removeAll();
        for (int i = 0; i < tabNumber; i++) {
            final int titleIndex = i;
            String title = "Tab " + titleIndex;
            final JButton button = new JButton("Relabel tab");
            button.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    int index = pane.indexOfComponent(button);
                    ButtonTabComponent btc = (ButtonTabComponent)
                        pane.getTabComponentAt(index);
                    JLabel label = btc.getLabel();
                    pane.setTitleAt(index, label.getText() + titleIndex);
                    label.invalidate();
                    pane.repaint();
                }
            });
            pane.add(title, button);
            initTabComponent(i);
        }
        tabComponentsItem.setSelected(true);
        pane.setTabLayoutPolicy(JTabbedPane.WRAP_TAB_LAYOUT);
        scrollLayoutItem.setSelected(false);
        this.setPreferredSize(new Dimension(500, 200));
        this.pack();
        this.setLocationRelativeTo(null);
        this.setVisible(true);
    }
    
        2
  •  2
  •   BenMorel Manish Pradhan    11 年前

    我最近好像还记得一个问题,虽然我找不到帖子。我认为问题在于“自定义组件”接收鼠标事件,因此它不会传递到选项卡式窗格。建议的解决方案是使用dispatchEvent(…)方法将鼠标事件重新分配到适当的选项卡。

        3
  •  0
  •   Community CDub    8 年前

    这个问题与我在做了更多的挖掘之后在这里发布的问题有关: Workaround for setToolTipText consuming mouse events?