при отключении вкладок в Jtabbedpane внешний вид этой вкладки не меняется

Я использую JTabbedPane. В этом я должен отключить некоторые вкладки. я отключаю вкладку, используя метод setEnabledAt (index, false). вкладка была фактически отключена, но я не вижу и не чувствую [цвет текста отключенной вкладки становится светлым]. как мне это исправить?


Сначала я использую внешний вид java по умолчанию ... теперь я меняю внешний вид на нимб ... я обнаружил изменения цвета, но отключенная вкладка не выглядела как отключенный флажок, переключатель или другой компонент.


person Siddhu    schedule 02.08.2012    source источник


Ответы (4)


Я предполагаю, что вы на самом деле хотите отключить все компоненты на отключенной вкладке?

Swing не работает так, как setEnabled() родительского компонента оказывает какое-либо влияние на дочерние компоненты — вам нужно вызывать setEnabled(false) для каждого из них самостоятельно (в конце концов, вы могли хотите, чтобы некоторые из них были включены, поэтому Swing не делает никаких предположений и полностью оставляет это на ваше усмотрение).

person Durandal    schedule 02.08.2012

Я не знал, что должно было произойти изменение LookAndFeel, но с помощью UIManager.put вы можете изменить LookAndFeel очень конкретных частей, и я уверен, вручную изменив внешний вид отключенного tab, возможно, вы сможете получить то, что вам нужно.

Вы можете посмотреть на этой странице небольшую справку и ссылку на все параметры внешнего вида и поведения http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/color.html

person user1570073    schedule 02.08.2012

  • большая часть метода для JTabbedPane защищена в API и недоступна из Swing methods

  • должны искать Custom XxxTabbedPaneUI, переопределять эти методы и могут быть доступны извне

  • правильным способом было бы реализовать Custom Look & Feel only, часть они переопределяют JTabbedPane с protected 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 или просто изменить Foreground с помощью HTML
person mKorbel    schedule 02.08.2012

Возможно, у вас есть собственный Tab-Component?

Затем вы должны делегировать 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 );
            }
        } );
    }

}
person oliholz    schedule 02.08.2012