JTabbedPane Tab组件的MouseEvents没有渗透

时间:2010-07-01 14:25:22

标签: java swing jlabel jtabbedpane

我有JTabbedPane个自定义标签组件。该组件包含JLabel(显示标签标题)和JButton(关闭按钮)。当我更改JLabel JLabel停止接收鼠标事件的文本时,当我直接点击标签时我无法再选择该标签,如果我点击标签,那么我可以选择标签。有什么想法吗?

代码片段:

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 个答案:

答案 0 :(得分:2)

我不记得在TabComponentsDemo中讨论过How to Use Tabbed Panes中出现过这样的问题。您可以将代码与该示例进行比较作为参考。

附录:重新分析ButtonTabComponent以包含getLabel()TabComponentsDemo中此版本的runTest()会添加一个显示所需行为的按钮。特别是,每次按下按钮时,都会重新绘制选项卡以显示放大的标题。

更新:在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);
}

答案 1 :(得分:2)

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

答案 2 :(得分:0)

问题与我在进行更多挖掘后发布的问题有关:Workaround for setToolTipText consuming mouse events?