JTextField的背景颜色在先前已更改后禁用时不会变为“灰色”。

4
通常情况下,当您使用setEditable(false)setEnabled(false)时,JTextField的背景/前景颜色会变成“灰色”。然而,如果之前通过setBackground(color)(例如为white)设置了背景颜色,则对setEnabledsetEditable的调用将不再影响背景颜色。而是被先前设置的颜色覆盖。
在WinForms(.NET)中,这个问题可以通过将背景颜色“重置”为非覆盖默认值,即Color.Empty来解决。这将导致文本框恢复标准行为。然而,在JTextField中我没有找到类似的“默认值”。那么,如何将JTextField恢复为使用默认颜色,并在禁用或只读时自动切换颜色呢?前景颜色也存在类似的问题。
2个回答

8

您需要将该字段的背景色重置为其默认值。

默认UI委托会寻找UIResource,以确定要使用哪些正确的遮罩(基于已安装的外观和感觉)。

您可以使用以下方式重置背景颜色:

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

或者,您可以为自定义背景构建自定义UIResource

请参阅ColorUIResource了解更多详细信息。


请使用JTextField.setDisabled....(而不是任何神秘的方法)来禁用JSpinner、JFormattedTextField和可编辑的JComboBox。 - mKorbel
@mKorbel 我只看过JTextComponent,但据我所知,它只允许您设置禁用文本颜色,此外,为什么要让事情变得容易呢 ;) - MadProgrammer
这段代码只有在按照以下顺序调用时才能正常工作:textField.setBackground(UIManager.getColor(...)); textField.setEditable(false);,但是如果你先调用 setEditable(false),背景色仍然是白色。不过无论如何,它还是能够正常工作的。 - dialer
当您调用setEditable时,UI代理会检查背景颜色并根据结果的对象类型做出决策。但是当设置背景颜色时,它只是重新打印组件,因此您需要先设置背景颜色。 - MadProgrammer
@TiStrga 或者创建一个自定义的UI委托 - MadProgrammer
显示剩余4条评论

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();
            }
        });
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接