【发布时间】:2016-07-22 20:03:02
【问题描述】:
我对 swing 中的自定义选项卡组件有疑问。
以下代码将添加3个自定义标签组件:
public class TabbedExample extends JPanel {
public static void main(String... args) {
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
createUI();
}
}
}
public static void createUI() {
try {
for(LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if("Nimbus".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch(Exception e) {}
JFrame frame = new JFrame("Tab Test");
frame.setMinimumSize(new Dimension(256,200));
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.getContentPane().add(new TabbedExample());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public TabbedExample() {
super(new BorderLayout());
JTabbedPane pane = new JTabbedPane();
pane.addTab("tmp", new JTextField());
pane.addTab("tmp", new JTextField());
pane.addTab("tmp", new JTextField());
for(int i = 0; i < 3; i++) {
JPanel tabPanel = new JPanel();
tabPanel.setBackground(new Color(0,0,0,0));
tabPanel.setLayout(new BoxLayout(tabPanel, BoxLayout.X_AXIS));
JTextField textField = new JTextField("Tab " + i);
textField.setOpaque(false);
textField.setBackground(new Color(0,0,0,0));
textField.setBorder(new EmptyBorder(0,0,0,0));
tabPanel.add(label);
tabPanel.add(new JButton(Integer.toString(i)));
pane.setTabComponentAt(i, tabPanel);
}
add(pane, BorderLayout.CENTER);
}
}
现在的问题是默认选项卡行为停止工作。通常,当您将鼠标移到选项卡上时,它会通过更改背景颜色自动突出显示。但是一旦JTextField 被击中,选项卡很可能会注册一个mouseExited Event 并停止突出显示选项卡。因此,当您将鼠标移到选项卡上时,选项卡会闪烁。
我现在的问题是: 有没有办法(不实现新的突出显示机制)突出显示自定义 tabComponent 所在的选项卡?
【问题讨论】:
-
突出显示是指获得焦点?
-
@TamasRev :不。它可能特定于 Nimbus LAF。我不确定其他 LAF 在这个问题上的表现如何。选项卡可以处于不同的状态(至少这看起来像是简单的用户)。标签区域外的鼠标聚焦(颜色 1),标签区域内的鼠标聚焦(颜色 2),标签区域外的未聚焦鼠标(颜色 3),标签区域内的未聚焦鼠标(颜色 4)。高亮显示的是当用户将光标移动到更改选项卡颜色的选项卡上时。使用自定义 tabComponent 将鼠标移到组件上时会有一些闪烁。
标签: java swing tabs jtextfield jtabbedpane