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消耗鼠标事件的解决方法?