4

通常、setEditable(false)またはを使用するsetEnabled(false)と、JTextField の背景色/前景色が「灰色」になります。ただし、背景色がsetBackground(color)(たとえば) を使用して以前に設定されていた場合、またはwhiteの呼び出しは背景色に影響しなくなります。代わりに、以前に設定された色によって上書きされます。setEnabledsetEditable

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 に答える