我有一个JTabbedPane
使用自定义选项卡组件。该组件包含一个JLabel
(显示选项卡标题)和JButton
(关闭按钮)。当我更改文本中的文本时JLabel
the 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()
in 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);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)