2012-08-02 59 views
2

我正在使用JTabbedPane。在这我必须禁用一些标签。我使用setEnabledAt(index,false)方法禁用选项卡。该选项卡实际上已被禁用,但我没有感觉[禁用选项卡文本的颜色变成浅色]。我如何纠正它?禁用Jtabbedpane中的选项卡时,该选项卡的外观没有变化


首先我使用默认的外观和感觉的java的...现在我改变它的外表和感觉灵气..我发现颜色变化,但残疾人选项卡并没有像禁用复选框或单选按钮或其他零件 。

+1

你使用哪种LaF? – oliholz 2012-08-02 14:00:20

回答

1
  • JTabbedPanË大多数方法是受保护的API中,而不是入店从Swing methods

  • 必须寻找Custom XxxTabbedPaneUI,覆盖这些方法,并且可以入店从外面

  • 正确的方法是实行Custom Look & Feel only,其中一部分覆盖JTabbedPaneprotected methods

  • 例如为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
1

也许你有一个自己的制表组件来改变Foreground

然后,您必须将启用状态委托给此组件。

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); 
      } 
     }); 
    } 

} 
+0

好主意 – mKorbel 2012-08-02 14:45:24

2

我相信你真的是禁用禁用选项卡上的所有成分是什么?

摇摆不工作的setEnabled那个)父组件的方式(对孩子组件的任何影响 - 你需要他们自己的每一个调用的setEnabled(假)(毕竟你可能希望启用其中的一些,所以Swing不做任何假设,并将其完全交给你)。

相关问题