2011-02-18 54 views
7

我正在尋找一種將示例文本放入JTextField的方法,並將其變爲灰色。示例文本應該在任何東西輸入到該文本字段後立即消失。一些類似於當用戶使用標題字段發佈問題時的計算器功能。JTextField中的示例文本

如果它已經是JTextField的擴展實現,那麼我可以放入它作爲一個簡單的替換,我想它。任何來自swingx的東西都可以工作。我猜如果沒有一個簡單的方法來做到這一點,我的選擇可能會重寫JTextField的paint方法做這樣的事情。

感謝

回答

7

Text Prompt類提供所需的功能,而無需使用一個自定義的JTextField。

2

而不是覆蓋,把一個價值在該領域,並添加KeyListener當擊鍵被註冊,將刪除該值。也許它也改變了前景。

你可以將它包裝到你自己定製的JTextField類中,該類將採用構造函數中的默認文本。

+0

您不能使用密鑰偵聽器,因爲可以通過其他方法(如複製和粘貼)輸入數據。 – 2011-02-18 18:01:05

+0

我實際上不會在值字段中添加此示例文本,因爲存在使用getText()檢索示例文本的風險 – dm76 2011-02-18 18:01:17

+0

@Hover,我首先想到了焦點偵聽器,但在SO標題示例中作爲一個例子,OP提到,文本不會在焦點上消失,而是在開始輸入時消失。如果你確實允許粘貼添加一個DocumentListener可能是一個更好的解決方案。 – jzd 2011-02-18 19:24:16

1

你不能用純文本字段來做到這一點,但是你可以在JTextField的頂部放置一個禁用的JLabel,並在文本字段獲得焦點時將其隱藏。

5

如果您可以使用外部庫,Jide software的Swing組件具有您正在查找的內容;它被稱爲LabeledTextField(javadoc),它是JIDE公共層(開源項目)的一部分 - 這是免費的。它正在做什麼mklhmnn建議。

3

如何使用默認文本初始化文本字段併爲其指定焦點偵聽器,以便在獲得焦點時,如果文本.equals默認文本,則調用JTextField上的selectAll()。

1

做這樣的:

  1. 定義你喜歡的初始文本字符串,並設置您的文本字段:

    String initialText = "Enter your initial text here"; 
    jTextField1.setText(initialText); 
    
  2. 添加焦點監聽你的文本字段,其中選擇TextField的全部內容(如果它仍然具有初始值)。您可以鍵入的任何內容都會替換整個內容,因爲它已被選中。

    jTextField1.addFocusListener(new java.awt.event.FocusAdapter() { 
        public void focusGained(java.awt.event.FocusEvent evt) { 
         if (jTextField1.getText().equals(initialText)) { 
          jTextField1.selectAll(); 
         } 
        } 
    }); 
    
2
private JLabel l; 

JPromptTextField(String prompt) { 
    l = new JLabel(prompt, SwingConstants.CENTER); 
    l.setForeground(Color.GRAY); 
} 

@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 

    if (this.getText().length() == 0) { 
     // Reshape the label if needed, then paint 

     final Rectangle mine = this.getBounds(); 
     final Rectangle its = l.getBounds(); 
     boolean resized = (mine.width != its.width) || (mine.height != its.height); 
     boolean moved = (mine.x != its.x) || (mine.y != its.y); 
     if (resized || moved) 
      l.setBounds(mine); 

     l.paint(g); 
    } 
}