4

こんにちは、ある条件で、文字列値を保持してスイング コンポーネント (テキスト フィールド) を黒く塗りつぶさなければならないという要件があります。つまり、コンポーネントは保持している文字列値を表示すべきではありません。

4

6 に答える 6

4

実際のコンテンツの代わりに* * (またはその他のエコー文字)JPasswordFieldを表示するように切り替えることができるテキスト フィールドである があります。それがおそらく最も簡単な方法です。

それが十分でない場合は、コンテンツをプルして、空白またはブロットなどのフィールドを外部に保存し、そのsetEnabled(false)上に保存することができます。フィールドを再度有効にするときは、コンテンツを元に戻します。その間に使用する必要がある場合は、必要に応じgetText()て保存されたコンテンツを置き換えることができるように、それをオーバーライドする必要があります。

于 2012-05-22T13:47:43.530 に答える
3

テキスト全体をブラックコールするには

textfield.setForeground(new Color(0,0,0,0))
textfield.setBackground(Color.BLACK)
textfield.setOpaque(true)

彼らがテキストコールを選択するのを防ぐため

textfield.setFocusable(false)
于 2012-05-22T13:46:50.420 に答える
3

JLayer コンポーネントを使用できます。

JPanel前のグラデーションの例

于 2012-05-22T13:49:20.307 に答える
2

を使用してテキストフィールドを非表示にし.setVisible(false)、黒の別のコンポーネント(たとえば、JLabel背景が黒のa)に置き換える必要があります。これは、両方のコンポーネント(ラベルとテキストフィールド)を専用JPanelに配置し、それらを互いに積み重ねることによって実行できます。代わりに黒い領域を設ける必要がない場合は、オプションでテキストフィールドを非表示にすることができます。

テキストフィールドのみを含むこれを行う他の方法がありますが、オペレーティングシステムが異なるとSwingコンポーネントのレンダリングが異なるため(特にMac OS X)、テキストフィールドのpaint()メソッドをオーバーライドするか、テキストの色を変更するため、絶対に確実な方法はありません。 (@GarrettHallで説明されているように)たとえば、常に機能するとは限りません。

于 2012-05-22T13:47:23.000 に答える
2

これを行う最も簡単な方法は、コンテナからコンポーネントを削除し、同じタイプのダミー コンポーネントに置き換えることです。これは、コンポーネント (スケルトン) の交換をカプセル化する独自のコンポーネントを作成することでうまくカプセル化できます。

public class BlackOutTextField extends JPanel {

    private final JTextField realField = new JTextField();
    private final JTextField dummyField = new JTextField();
    private boolean isBlackedOut;

    {
        dummyField.setEditable(false);
        setLayout(new BorderLayout());
        add(realField, BorderLayout.CENTER);
    }

    public String getText() {
        return isBlackedOut ? "" : realField.getText();
    }

    public void setText(final String text) {
        if (!isBlackedOut)
            realField.setText(text);
    }

    public void setBlackedOut(final boolean blackedOut) {
         if (this.isBlackedOut != blackedOut) {
             this.isBlackedOut = blackedOut;
             removeAll();
             add(this.isBlackedOut ? dummyField : realField, BorderLayout.CENTER);
             revalidate();
         }
    }
}

あなたはアイデアを得る。

于 2012-05-22T13:58:12.570 に答える
1

質問どおり、JTextFieldのみを使用して、文字とテキストボックスも黒にする小さな例を作成しました。

import java.awt.Color;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class RunnableTest{    
    public static void main(String args[]){

        JFrame frame = new JFrame("frame");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel();
        JTextField textfield = new JTextField();
        textfield.setPreferredSize(new Dimension(400,30));
        textfield.setForeground(Color.black);
        textfield.setBackground(Color.black);
        textfield.setSelectedTextColor(Color.black);
        textfield.setSelectionColor(Color.black);

        frame.getContentPane().add(panel);
        panel.add(textfield);
        frame.pack();

         frame.setVisible(true);    
    } 
}

このメソッドtextfield.setForeground(Color.black);はフォントを黒に設定し、textfield.setBackground(Color.black);この他のメソッドは背景を黒に設定します。と

textfield.setSelectedTextColor(Color.black);
textfield.setSelectionColor(Color.black);

選択内容が見えないように、選択範囲を黒に設定します。

もちろん、JTextFieldを使用したくない場合は、代わりにパスワードフィールドを使用して、ユーザーがテキストをコピーできないようにすることができます。

編集:ユーザーがCTRL + Cを使用してテキストをコピーしたくない場合は、ユーザーが両方のキーを同時に押したときにわかるように、テキストフィールドにキーアダプターを追加します。もちろん、他のシステムには他にも多くの組み合わせがありますが、それは問題ではありません。

于 2012-05-22T13:54:34.710 に答える