2014-10-08 39 views
1

我想为我的应用程序中的所有文本字段更改不可编辑的前景(以避免不可理解JTextComponent.setEditable(false)),但未找到UIManager的相应属性键来执行此操作。是否有可能在全球范围内更改不可编辑的前景?如何更改JTextField的不可编辑前景

+1

看起来和感觉:

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 I只需要重置默认UI安装完成后? – MadProgrammer 2014-10-08 11:20:42

+0

主要目标是合成(Synthetica),但知道它是否可能完全是有意义的。 – 2014-10-08 11:22:55

+0

@MadProgrammer我从Jyloo得到了答案:Synthetica将在下一个版本中支持它。 – 2014-10-08 11:35:40

回答

2

在“正常”的外观和感觉,你可以使用"TextField.inactiveBackground"键,文本,你可以使用"TextField.inactiveForeground"

例如

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

的外观和感觉像雨云可能需要一些“额外的“工作...

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 2014-10-08 11:28:49

+2

含义setDisabledTextColor – mKorbel 2014-10-08 11:29:14

+0

我把*“不可编辑的前景”*表示为可编辑的状态,但提到'disabledTextColor'属性也是一个好主意 – MadProgrammer 2014-10-08 11:31:06

2

发现的解决方案:

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

不需要PropertyChangeListener,相当无用,只有在这种情况下你想要打包,在Html里面装饰Swing,并且使用一些特殊的东西,这些东西在rumtime,volatile,cached中构建 – mKorbel 2014-10-08 12:12:22

+0

@mKorbel UI必须安装侦听器,以便在包装对象的属性发生更改时收到通知。否则,我需要用我的扩展类替换应用程序中的所有JTextField对象。 – 2014-10-08 12:20:24

+0

:-) .............. – mKorbel 2014-10-08 12:35:17

相关问题