當在

2013-03-28 18 views
2

之前更改背景顏色後禁用時,JTextField的背景顏色不會變爲「變灰」。通常當您使用setEditable(false)setEnabled(false)時,JTextField的背景/前景顏色變爲「變灰」。但是,如果之前使用setBackground(color)(例如到white)設置了背景顏色,則對setEnabledsetEditable的調用不會再影響背景顏色。相反,它被以前設置的顏色覆蓋。當在

在WinForms(.NET)中,這是通過將背景顏色「重置」爲非覆蓋默認值來解決的,即Color.Empty。這會導致文本框重新獲得標準行爲。但是,我還沒有爲JTextField找到類似的「默認值」。如何恢復JTextField以使用默認顏色並在禁用或設置爲只讀時自動切換顏色?前景色也有類似的問題。

回答

7

您需要到外地的背景顏色重置爲默認值。

默認UI代理正在查找UIResource以確定用於給定字段的正確陰影(基於安裝的外觀)。

可以使用重置背景色:

JTextField#setBackground(UIManager.getColor("TextField.background"))

或者,你可以構建您的自定義背景自定義UIResource

查看ColorUIResource瞭解更多詳情。

+0

+1,我從來沒有想過要玩ColorUIResource。 – camickr

+0

或使用JTextField.setDisabled ....(JSpinner,JFormattedTextField,可編輯的JComboBox)而不是任何木偶 – mKorbel

+0

@mKorbel我只看了一個JTextComponent,但據我所知,它只允許你設置禁用的文本顏色,此外,爲什麼讓事情變得容易;) – MadProgrammer

5

如何恢復JTextField中使用默認顏色

textField.setBackground(null); 

當它被禁用或者設置爲只讀自動切換顏色?

使用一個PropertyChangeListener:

import java.awt.*; 
import java.awt.event.*; 
import java.beans.*; 
import javax.swing.*; 
import javax.swing.border.*; 
import javax.swing.text.*; 

public class SSCCE extends JPanel implements PropertyChangeListener 
{ 
    public SSCCE() 
    { 
     JTextField textField = new JTextField("Some Text"); 
     // Uncomment and run again to see the difference 
     //textField.addPropertyChangeListener(this); 
     textField.setBackground(Color.RED); 
     textField.setEditable(false); 
     add(textField); 
    } 

    public void propertyChange(PropertyChangeEvent e) 
    { 
     System.out.println(e.getPropertyName()); 
     JTextField textField = (JTextField)e.getSource(); 

     if ("editable".equals(e.getPropertyName())) 
      textField.setBackground(null); 
    } 

    private static void createAndShowUI() 
    { 
     JFrame frame = new JFrame("SSCCE"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new SSCCE()); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowUI(); 
      } 
     }); 
    } 
}