2

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


首先我使用java的默认外观...现在我将外观更改为nimbus ..我发现颜色发生了变化,但禁用的选项卡看起来不像禁用的复选框或单选按钮或其他组件。

4

4 回答 4

2

我想你真正想要的是禁用禁用选项卡上的所有组件?

Swing 的工作方式不像父组件的 setEnabled() 对子组件有任何影响 - 您需要自己在每个组件上调用 setEnabled(false) (毕竟您可能希望启用其中的一些,所以 Swing 不做任何假设,完全交给你)。

于 2012-08-02T15:45:39.690 回答
1
  • e 的大部分方法JTabbedPan都在 API 中受到保护,并且无法从Swing methods

  • 必须寻找Custom XxxTabbedPaneUI,覆盖这些方法,并且可以从外部访问

  • 正确的方法是仅实现自定义外观,其中一部分也JTabbedPane覆盖protected methods

  • 自定义 XxxTabbedPaneUI的示例

  • 您可以很容易地更改Foreground禁用选项卡,但只有使用 HTML 语法才能正常工作

代码

tabbedPane.setTitleAt(2, "<html><font color="
    + (tabbedPane.isEnabledAt(int tab) ? "black" : "red") + ">"
    + tabbedPane.getTitleAt(int tab) + "</font></html>");
  • 我建议使用自定义Look and Feel或简单更改Foreground使用HTML
于 2012-08-02T14:27:32.783 回答
1

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

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

于 2012-08-02T14:03:07.460 回答
1

也许您有自己的选项卡组件?

然后你必须将 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 );
            }
        } );
    }

}
于 2012-08-02T14:33:48.077 回答