こんにちは、ある条件で、文字列値を保持してスイング コンポーネント (テキスト フィールド) を黒く塗りつぶさなければならないという要件があります。つまり、コンポーネントは保持している文字列値を表示すべきではありません。
6 に答える
実際のコンテンツの代わりに* * (またはその他のエコー文字)JPasswordField
を表示するように切り替えることができるテキスト フィールドである があります。それがおそらく最も簡単な方法です。
それが十分でない場合は、コンテンツをプルして、空白またはブロットなどのフィールドを外部に保存し、そのsetEnabled(false)
上に保存することができます。フィールドを再度有効にするときは、コンテンツを元に戻します。その間に使用する必要がある場合は、必要に応じgetText()
て保存されたコンテンツを置き換えることができるように、それをオーバーライドする必要があります。
テキスト全体をブラックコールするには
textfield.setForeground(new Color(0,0,0,0))
textfield.setBackground(Color.BLACK)
textfield.setOpaque(true)
彼らがテキストコールを選択するのを防ぐため
textfield.setFocusable(false)
JLayer コンポーネントを使用できます。
を使用してテキストフィールドを非表示にし.setVisible(false)
、黒の別のコンポーネント(たとえば、JLabel
背景が黒のa)に置き換える必要があります。これは、両方のコンポーネント(ラベルとテキストフィールド)を専用JPanel
に配置し、それらを互いに積み重ねることによって実行できます。代わりに黒い領域を設ける必要がない場合は、オプションでテキストフィールドを非表示にすることができます。
テキストフィールドのみを含むこれを行う他の方法がありますが、オペレーティングシステムが異なるとSwingコンポーネントのレンダリングが異なるため(特にMac OS X)、テキストフィールドのpaint()
メソッドをオーバーライドするか、テキストの色を変更するため、絶対に確実な方法はありません。 (@GarrettHallで説明されているように)たとえば、常に機能するとは限りません。
これを行う最も簡単な方法は、コンテナからコンポーネントを削除し、同じタイプのダミー コンポーネントに置き換えることです。これは、コンポーネント (スケルトン) の交換をカプセル化する独自のコンポーネントを作成することでうまくカプセル化できます。
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();
}
}
}
あなたはアイデアを得る。
質問どおり、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を使用してテキストをコピーしたくない場合は、ユーザーが両方のキーを同時に押したときにわかるように、テキストフィールドにキーアダプターを追加します。もちろん、他のシステムには他にも多くの組み合わせがありますが、それは問題ではありません。