4

通常,当您使用setEditable(false)or时setEnabled(false),JTextField 的背景/前景色变为“灰色”。但是,如果以前使用setBackground(color)(例如 to white)设置了背景颜色,则调用setEnabledorsetEditable将不再影响背景颜色。相反,它会被先前设置的颜色覆盖。

在 WinForms (.NET) 中,这是通过将背景颜色“重置”为非覆盖默认值来解决的,即Color.Empty. 这将导致文本框重新获得标准行为。但是,我还没有为 JTextField 找到类似的“默认值”。如何恢复 JTextField 以使用默认颜色并在禁用或设置为只读时自动切换颜色?前景色也有类似的问题。

4

2 回答 2

8

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

默认 UI 委托正在寻找一个UIResource,以确定用于给定字段的正确阴影(基于已安装的外观)。

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

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

UIResource或者,您可以为您的自定义背景构建一个自定义。

看看ColorUIResource更多细节。

于 2013-03-29T00:37:17.610 回答
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();
            }
        });
    }
}
于 2013-03-29T00:36:22.197 回答