2012-05-22 45 views
4

您好有一个要求,在某些情况下,我必须熄灭摆动组件(文本字段),保留其字符串值。即组件不应该显示它持有的字符串值。如何遮挡Swing组件?

+1

你的尝试是什么? –

+0

尚未找到,试图使其不可见,但我希望该字段存在,但不应显示数据。 – GuruKulki

回答

3

为了让整个文本黑色通话

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

,以防止他们选择文本呼叫

textfield.setFocusable(false) 
+1

虽然这是一个很好的建议,但为什么不使用这个'textField.setForeground(textField.getBackground());',这样做会没有任何问题:-) –

+0

文本可见。我不想显示文字。 – GuruKulki

+0

@GuruKulki和Garrett:当做这件事时,也考虑将文本字段的可聚焦属性设置为'false'。否则,文本将显示该字段何时具有焦点并且文本被选中。 1+为您的良好答案投票。 –

2

您应该隐藏使用.setVisible(false)文本字段,并且由不同的组分,它是取代它黑色(例如黑色背景的JLabel)。这可以通过将两个组件(标签和文本字段)放在专用的JPanel中,将它们堆叠在彼此之上来完成。你可以选择只是简单地隐藏文本字段,如果你不需要在那里有一个黑色的区域。

还有其他的方法只涉及文本字段,但它们都不是傻瓜式的,因为不同的操作系统会以不同的方式呈现Swing组件(特别是Mac OS X),因此覆盖文本字段的方法paint()方法或者改变文字颜色(如@GarrettHall所描述的)并不总是有效的。

4

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

如果这还不够好,你可以将数据内容,并将其存储在外部,空白或涂抹或任何领域,setEnabled(false)就可以了。当您再次启用该字段时,请将内容放回。如果在此期间需要使用getText(),则必须覆盖该内容,以便在适当时替换存储的内容。

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一keyadapter添加到文本框,让你知道当用户在同一时刻按下这两个键复制文本。当然,在其他系统上还有很多其他组合,但这不是问题。

+0

你还可以CTRL-C的文字:) – Durandal

+0

当然你可以,它的一个JTextField。并且用户没有指定你不需要。它不显示价值。 –

+1

Ahha,这真是太神奇了,我几乎忘了设置'SelectionColours',同时评论+1,这个不错的加法:-),尽管@Durandal声明了只给出一个选项'JPasswordField' :-) –

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(); 
     } 
    } 
} 

你的想法。