【问题标题】: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

        【讨论】:

          【解决方案4】:

          我不知道应该更改 LookAndFeel,但使用 UIManager.put,您可以更改非常特定部分的 LookAndFeel,我敢打赌通过手动更改外观/感觉禁用选项卡,您也许可以得到您想要的。

          您可以查看此页面以获得一些帮助,以及指向所有外观/感觉选项的链接 http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/color.html

          【讨论】:

            猜你喜欢
            • 2011-12-13
            • 1970-01-01
            • 1970-01-01
            • 2012-08-30
            • 1970-01-01
            • 1970-01-01
            • 2017-03-09
            • 2010-10-30
            • 1970-01-01
            相关资源
            最近更新 更多