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

おそらく、独自のタブコンポーネントをお持ちですか?

次に、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 に答える
1

LookAndFeel の変更が想定されていることは知りませんでしたが、UIManager.put を使用すると、非常に特定の部分の LookAndFeel を変更できます。おそらく、無効化されたオブジェクトのルック アンド フィールを手動で変更することによってタブ、あなたが求めているものを手に入れることができるかもしれません.

ちょっとしたヘルプと、すべてのルック アンド フィール オプションへのリンクについては、このページを参照してください http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/color.html

于 2012-08-02T14:03:07.460 に答える