2017-06-18 56 views
0

我们遇到了一些流行的网站登录屏幕,在用户名文本框中写了一个淡灰色的用户名。我不知道可以在java swing中实现吗?jTextField中的Fantom文本。怎么样?

我有理论,通过mouseEvents实现。无法弄清楚如何去。

+0

避开鼠标事件,因为文本组件可以通过多种方式访问​​,包括Tab键。也许FocusListener是你想要的。 –

回答

2

退房Text Prompt

它允许您显示文本和/或图标作为使用文本字段的提示。一旦任何字符输入到文本字段中,提示将被删除。

显示的提示时,您还可以控制:

  1. ALWAYS - 显示的提示文本字段是否具有焦点与否。
  2. FOCUS_GAINED - 当文本字段获得焦点显示的提示(和丢失焦点时是隐藏的)
  3. FOCUS_LOST - 显示的提示当文本字段失去焦点(并在获得焦点时是隐藏的)
2

方式一:

  • 创建一个类,让在JTextField的幻象文本启动
  • 设置文本的前景,以浅色
  • 使用的FocusListener,一个将选择所有幻影文本,并将前景更改为默认颜色(设置为空)。

例如:

import java.awt.Color; 
import java.awt.GridLayout; 
import java.awt.event.FocusAdapter; 
import java.awt.event.FocusEvent; 

import javax.swing.*; 

@SuppressWarnings("serial") 
public class FantomTextFieldTest extends JPanel { 
    FantomTextField fantomTextField = new FantomTextField("Fantom Text"); 

    public FantomTextFieldTest() { 
     setLayout(new GridLayout(1, 0, 5, 0)); 
     add(new JTextField(20)); 
     add(fantomTextField.getTextField()); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 

    private static void createAndShowGui() { 
     FantomTextFieldTest mainPanel = new FantomTextFieldTest(); 
     JFrame frame = new JFrame("FantomTextFieldTest"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 
} 

class FantomTextField { 
    private static final Color FANTOM_FG = new Color(150, 150, 150, 150); 
    private JTextField textField; 
    private String fantomText; 
    private boolean showFantomText = true; 

    public FantomTextField(String fantomText) { 
     this.fantomText = fantomText; 
     textField = new JTextField(); 
     textField.setText(fantomText); 
     textField.setForeground(FANTOM_FG); 
     textField.addFocusListener(new FtfFocusListener()); 
    } 

    public FantomTextField(String fantomText, int columns) { 
     this(fantomText); 
     textField.setColumns(columns); 
    } 

    public JTextField getTextField() { 
     return textField; 
    } 

    public String getFantomText() { 
     return fantomText; 
    } 

    public void setFantomText(String fantomText) { 
     this.fantomText = fantomText; 
     textField.setText(fantomText); 
     textField.setForeground(FANTOM_FG); 
     showFantomText = true; 
    } 

    private class FtfFocusListener extends FocusAdapter { 
     @Override 
     public void focusGained(FocusEvent e) { 
      if (showFantomText) { 
       textField.selectAll(); 
       textField.setForeground(null); 
       showFantomText = false; 
      } 
     } 
    }  
}