2009-11-26 45 views
4

我試圖重現Firefox或Safari的搜索字段或本頁面右上角的搜索字段stackoverflow.com的行爲。在空的空間添加水印JCombobox

我的意思是,當可編輯JComboBox上沒有文字時,會顯示說明文字,如"Type here"或其他。當JComboBox聚焦時,文本被刪除。如果在沒有輸入文字的情況下焦點丟失,說明文字會回來。

回答

5

這裏有一些簡單的我扔在一起。我相信你可以整理它。由於代碼在JTextField上工作,您需要獲取組合框的編輯器。我沒有關於如何實施Glazed列表,所以我只是猜測它會爲你工作。

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.border.*; 
import javax.swing.event.*; 
import javax.swing.text.*; 

public class TextPrompt extends JLabel 
    implements FocusListener, DocumentListener 
{ 
    private JTextComponent component; 
    private Document document; 

    public TextPrompt(String text, JTextComponent component) 
    { 
     this.component = component; 
     document = component.getDocument(); 

     setText(text); 
     setFont(component.getFont()); 
     setBorder(new EmptyBorder(component.getInsets())); 

     component.addFocusListener(this); 
     document.addDocumentListener(this); 

     component.add(this); 
    } 

    public void checkForPrompt() 
    { 
     if (document.getLength() == 0) 
      setSize(component.getSize()); 
     else 
      setSize(0, 0); 
    } 

// Implement FocusListener 

    public void focusGained(FocusEvent e) 
    { 
     checkForPrompt(); 
    } 

    public void focusLost(FocusEvent e) 
    { 
     setSize(0, 0); 
    } 

// Implement DocumentListener 

    public void insertUpdate(DocumentEvent e) 
    { 
     checkForPrompt(); 
    } 

    public void removeUpdate(DocumentEvent e) 
    { 
     checkForPrompt(); 
    } 

    public void changedUpdate(DocumentEvent e) {} 

    public static void main(String[] args) 
    { 
     JPanel panel = new JPanel(); 
     JTextField tf1 = new JTextField(10); 
     panel.add(tf1); 
     JTextField tf2 = new JTextField(10); 
     panel.add(tf2); 

     new TextPrompt("First Name", tf1); 
     new TextPrompt("Last Name", tf2); 

     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(panel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 
+0

幾乎適合我的使用情況已知的術語。我只做了三個改變:1)當關注時,必須沒有文本,所以我在checkForPrompt上添加了「&&!component.hasFocus」。 2)在focusLost上我調用checkForPrompt而不是setSize。 3)啓動時必須有一個checkForPrompt調用,用於初始可見性狀態。此調用必須在佈局大小計算後進行,否則component.getSize()將爲0. 謝謝! – tuler 2009-11-27 00:34:50

+1

此課程已更新爲更多功能。請參閱:[文本提示](http://tips4java.wordpress.com/2009/11/29/text-prompt/) – camickr 2013-02-17 01:17:52

0

它被稱爲waterMark。 jQuery有一個。我從不厭倦將水印應用於jComboBox。
祝你好運

+0

感謝,我一直在尋找這個 – tuler 2009-11-26 21:10:02