2012-05-22 47 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(); 
     } 
    } 
} 

你的想法。