JTabbedPane Tab组件的MouseEvents没有渗透

我有一个带有自定义选项卡组件的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; } } 

我不记得在如何使用选项卡式窗格中讨论的TabComponentsDemo看到这样的问题。 您可以将您的代码与该示例进行比较作为参考。

附录:重新分解ButtonTabComponent以包含getLabel()runTest()此版本的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); } 

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

这个问题与我在进行更多挖掘之后发布的问题有关: setToolTipText消耗鼠标事件的解决方法?