2014-10-08 4 views
1

Я хочу изменить неотправляемый передний план (во избежание непонятности JTextComponent.setEditable(false)) для всех текстовых полей в моем приложении, но не смог найти подходящий ключ свойства для UIManager, чтобы сделать это. Можно ли изменить не редактируемый план на глобальном уровне?Как изменить нередактируемый передний план для JTextField

+1

Какой выглядеть и чувствовать? – MadProgrammer

+0

Основная цель - Synthetica, но интересно узнать, возможно ли это вообще. –

+0

@MadProgrammer У меня есть ответ от Jyloo: Synthetica поддержит его в следующем выпуске. –

ответ

2

Под «нормальным» смотреть и чувствует, вы можете с помощью ключа "TextField.inactiveBackground", для текста, можно использовать "TextField.inactiveForeground"

, например

UIManager.put("TextField.inactiveBackground", new ColorUIResource(Color.RED)); 

Посмотрите и чувствует, как Nimbus может потребоваться некоторые «дополнительные "работа ...

NonEditableTextFied

import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import javax.swing.JFrame; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.plaf.ColorUIResource; 

public class NonEdtiableField { 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException ex) { 
       } catch (InstantiationException ex) { 
       } catch (IllegalAccessException ex) { 
       } catch (UnsupportedLookAndFeelException ex) { 
       } 

       UIManager.put("TextField.inactiveBackground", new ColorUIResource(Color.RED)); 

       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new GridBagLayout()); 
       GridBagConstraints gbc = new GridBagConstraints(); 
       gbc.gridwidth = GridBagConstraints.REMAINDER; 
       JTextField editable = new JTextField(10); 
       JTextField nonEditable = new JTextField(10); 
       nonEditable.setEditable(false); 
       frame.add(editable); 
       frame.add(nonEditable); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

} 
+0

есть два состояния, редактируемые и разрешенные, я не уверен, какой из них OP означает – mKorbel

+2

Значение setDisabledTextColor – mKorbel

+0

Я принял * «редактируемый нестандартный план» * для обозначения редактируемого состояния, но упоминаемое свойство disabledTextColor также является хорошей идеей – MadProgrammer

2

Решение найдено:

import java.awt.Color; 
import java.beans.PropertyChangeEvent; 
import java.beans.PropertyChangeListener; 

import javax.swing.JComponent; 
import javax.swing.UIManager; 
import javax.swing.plaf.ColorUIResource; 
import javax.swing.plaf.ComponentUI; 
import javax.swing.plaf.synth.SynthTextFieldUI; 

/** 
* <code>ExtSynthTextFieldUI</code>. 
* 
* @author SMedvynskyy 
*/ 
public class ExtSynthTextFieldUI extends SynthTextFieldUI { 

    /** Handler to change foreground when editable status changed. */ 
    private final PropertyChangeListener listener = new PropertyChangeListener() { 

     /** Save the old color here. */ 
     private Color standardColor = UIManager.getColor(getPropertyPrefix() + ".foreground"); 

     @Override 
     public void propertyChange(PropertyChangeEvent evt) { 
      if ("editable".equals(evt.getPropertyName())) { 
       if (Boolean.TRUE.equals(evt.getNewValue())) { 
        getComponent().setForeground(standardColor); 
       } else { 
        standardColor = getComponent().getForeground(); 
        // set the "inactive foreground" 
        getComponent().setForeground(new ColorUIResource(0xA0A0A0)); 
       } 
      } 
     } 
    }; 

    /** 
    * Creates a new UI object for the given component. 
    * 
    * @param table component to create UI object for 
    * @return the UI object 
    */ 
    public static ComponentUI createUI(JComponent table) { 
     return new ExtSynthTextFieldUI(); 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    @Override 
    protected void installListeners() { 
     super.installListeners(); 
     getComponent().addPropertyChangeListener("editable", listener); 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    @Override 
    protected void uninstallListeners() { 
     getComponent().removePropertyChangeListener("editable", listener); 
     super.uninstallListeners(); 
    } 
} 

После установки из L & F Я просто необходимо сбросить пользовательский интерфейс по умолчанию:

UIManager.put("TextFieldUI", ExtSynthTextFieldUI.class.getName()); 
+0

не требуется PropertyChangeListener, совершенно бесполезный, только в случае что вы хотите обернуть, украсить Swing внутри Html и с чем-то особенным, thats build at rumtime, volatile, cached – mKorbel

+0

@mKorbel UI должен установить прослушиватель, чтобы получать уведомление, когда свойство обернутого объекта изменено. В противном случае мне нужно заменить все объекты JTextField в нашем приложении моим классом расширения. –

+0

:-) .............. – mKorbel