嗨,有一个要求,在某些情况下,我必须将摆动组件(文本字段)涂黑,以保留其字符串值。即组件不应该显示它持有的字符串值。
6 回答
有JPasswordField
, 这是一个文本字段,可以切换以显示* * (或其他一些回显字符)而不是实际内容。这可能是最简单的方法。
如果这还不够好,您可以拉出内容并将其存储在外部,空白或印迹或任何字段,并setEnabled(false)
在其上。当您再次启用该字段时,将内容放回原处。如果有必要同时使用getText()
,您必须覆盖它,以便在适当的时候替换存储的内容。
You could use the JLayer Component:
使整个文本黑色调用
textfield.setForeground(new Color(0,0,0,0))
textfield.setBackground(Color.BLACK)
textfield.setOpaque(true)
以防止他们选择文本呼叫
textfield.setFocusable(false)
可能最简单的方法是从其容器中删除组件并用相同类型的虚拟组件替换它。这可以通过创建您自己的组件来很好地封装,该组件封装交换组件(骨架):
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();
}
}
}
你明白了。
您应该使用 隐藏文本字段.setVisible(false)
,并将其替换为黑色的不同组件(例如JLabel
带有黑色背景的 a)。这可以通过将两个组件(标签和文本字段)放在一个专用的JPanel
中,并将它们相互堆叠来完成。如果您不需要在那里有黑色区域,您可以选择只是简单地隐藏文本字段。
还有其他仅涉及文本字段的方法,但它们都不是万无一失的,因为不同的操作系统会以不同的方式呈现 Swing 组件(尤其是 Mac OS X),因此覆盖文本字段的paint()
方法或更改文本颜色例如(如@GarrettHall 所述)并不总是有效。
我做了一个小例子,只使用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 复制文本,请在文本字段中添加一个键适配器,以便您知道用户何时同时按下两个键。当然,在其他系统上还有很多其他的组合,但这不是问题。