如何遮蔽Swing组件?

时间:2012-05-22 13:40:35

标签: java swing

你有一个要求,在某些条件下,我必须将摇摆组件(文本字段)遮挡,保留其字符串值。即组件不应显示它所持有的字符串值。

6 个答案:

答案 0 :(得分:4)

JPasswordField,这是一个文本字段,可以切换显示 * *(或其他一些回音字符)而不是实际内容。这可能是最简单的方法。

如果这还不够好,你可以拉出内容并将其存储在外部,空白或污点或任何字段,并在其上setEnabled(false)。再次启用该字段时,将内容放回原处。如果在此期间需要使用getText(),则必须覆盖它,以便在适当时替换存储的内容。

答案 1 :(得分:3)

使整个文字黑色调用

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

阻止他们选择文字电话

textfield.setFocusable(false)

答案 2 :(得分:3)

您可以使用JLayer Component

An example of gradient in front of JPanel

答案 3 :(得分:2)

您应该使用.setVisible(false)隐藏文本字段,并将其替换为黑色的其他组件(例如带有黑色背景的JLabel)。这可以通过将两个组件(标签和文本字段)放在专用的JPanel中,将它们堆叠在一起来完成。如果你不需要在那里设置黑色区域,你可以选择只隐藏文本字段。

还有其他方法只涉及文本字段,但它们都不是万无一失的,因为不同的操作系统会以不同的方式呈现Swing组件(尤其是Mac OS X),因此覆盖文本字段{{1例如,方法或更改文本颜色(如@GarrettHall所描述)并不总是有效。

答案 4 :(得分: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();
         }
    }
}

你明白了。

答案 5 :(得分:1)

我做了一个小例子,只是使用 Only 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复制文本,请在文本字段中添加keyadapter,以便您知道用户何时同时按下两个键。当然,在其他系统上还有许多其他组合,但这不是问题。