【问题标题】:while disabling the tabs in Jtabbedpane, there is no change in the look and feel of that tab在禁用 Jtabbedpane 中的选项卡时,该选项卡的外观没有变化
【发布时间】:2012-07-31 12:20:16
【问题描述】:
我正在使用 JTabbedPane。在这个我必须禁用一些标签。我使用 setEnabledAt(index,false) 方法禁用选项卡。该选项卡实际上已被禁用,但我没有得到外观和感觉[禁用的选项卡文本的颜色变为浅色]。我该如何纠正它?
首先我使用 java 的默认外观...现在我将外观更改为 nimbus...我发现颜色发生了变化,但禁用的选项卡看起来不像禁用的复选框或单选按钮或其他组件。
【问题讨论】:
标签:
java
swing
jtabbedpane
【解决方案1】:
我想您真正想要的是禁用已禁用选项卡上的所有组件?
Swing 的工作方式不像父组件的 setEnabled() 对子组件有任何影响 - 您需要自己对每个子组件调用 setEnabled(false)(毕竟您可以 想要启用其中的一些,因此 Swing 不做任何假设,完全由您来完成)。
【解决方案2】:
也许你有一个自己的选项卡组件?
然后你必须将 Enable-State 委托给这个组件。
import java.awt.Component;
import java.awt.Dimension;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
public class Display extends JFrame {
public Display() {
super("Enable");
this.setDefaultCloseOperation( EXIT_ON_CLOSE );
this.setSize( new Dimension(300,300) );
this.setLocationRelativeTo( null );
JTabbedPane tabs = new JTabbedPane() {
// delegating to tabComponent
@Override
public void setEnabledAt( int index, boolean enabled ) {
super.setEnabledAt( index, enabled );
Component tabComponent = getTabComponentAt( index );
if(tabComponent != null) {
getTabComponentAt( index ).setEnabled( enabled );
}
}
};
JComponent component = new JLabel("Lorem");
tabs.addTab( "", component );
JLabel custom = new JLabel("disabled");
tabs.setTabComponentAt( tabs.indexOfComponent( component ), custom );
tabs.addTab( "enabled", new JLabel("Ipsum") );
tabs.addTab( "disabled", new JLabel("Dolor") );
tabs.addTab( "enabled", new JLabel("Sit") );
tabs.addTab( "enabled", new JLabel("Amet") );
tabs.setEnabledAt( 0, false );
tabs.setEnabledAt( 2, false );
tabs.setSelectedIndex( 1 );
this.getContentPane().add( tabs );
}
public static void main( String[] args ) throws Exception {
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if ("Windows".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
SwingUtilities.invokeLater( new Runnable() {
@Override
public void run() {
new Display().setVisible( true );
}
} );
}
}
【解决方案3】:
JTabbedPane 的大部分方法在 API 中受到保护,无法从 Swing methods 访问
必须寻找Custom XxxTabbedPaneUI,覆盖这些方法,并且可以从外部访问
正确的方法是实现Custom Look & Feel only,其中一部分也用protected methods覆盖JTabbedPane
Custom XxxTabbedPaneUI 的示例
您可以很容易地将Foreground 更改为禁用的选项卡,但只有使用 HTML 语法才能正常工作
代码
tabbedPane.setTitleAt(2, "<html><font color="
+ (tabbedPane.isEnabledAt(int tab) ? "black" : "red") + ">"
+ tabbedPane.getTitleAt(int tab) + "</font></html>");
- 我建议使用自定义
Look and Feel 或使用HTML 简单地更改Foreground