2014-11-08 4 views
0

У меня есть простой фреймворк с JTextField и JPasswordField. Когда мой кадр загружает текст JTextField, это «Укажите свой логин». Я хочу удалить этот текст, когда JTextField получает фокус. Это первый элемент в моем фрейме, поэтому он уже имеет фокус при загрузке фрейма, но я хочу, чтобы он очищался всякий раз, когда я нажимаю на него или начинаю вводить его. Я попробовал MouseListener, который отлично работает, но теперь я хочу очистить JTextField с момента ввода текста. Это код, включая мою проблему:Текст JTextField должен очищаться, когда я начинаю вводить его

import java.awt.FlowLayout; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import javax.swing.JFrame; 
import javax.swing.JPasswordField; 
import javax.swing.JTextField; 

public class TextFields extends JFrame { 

    private static final long serialVersionUID = 1L; 

    private JTextField login; 
    private JPasswordField password; 

    public TextFields() { 
     super("Event handling"); 
     setLayout(new FlowLayout()); 

     login = new JTextField("Type your login", 20); 
     password = new JPasswordField(20); 
     add(login); 
     add(password); 

     LoginHandler handler = new LoginHandler(); 
     login.addMouseListener(handler); 
    } 

    private class LoginHandler implements ActionListener, MouseListener {  

     public void mouseClicked(MouseEvent e) { 
      login.setText(""); 
     } 

     @Override 
     public void mouseEntered(MouseEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void mouseExited(MouseEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void mousePressed(MouseEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void mouseReleased(MouseEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void focusLost(FocusEvent arg0) { 
      // TODO Auto-generated method stub 

     } 
    } 

    public static void main(String[] args) { 
     TextFields test = new TextFields(); 
     test.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     test.setSize(250, 100); 
     test.setVisible(true); 

    } 

} 

ответ

5

Я не знаю, канонический ответ, но я использовал FocusListener для этого вопроса, путем вызова selectAll() в методе focusGained. Не используйте MouseListener, так как это не удастся, если пользователь введет вкладку в поле.

например,

private class MyFocusListener extends FocusAdapter { 
    @Override 
    public void focusGained(FocusEvent fEvt) { 
     JTextComponent component = (JTextComponent) fEvt.getSource(); 
     component.selectAll(); 
    } 
} 

и

login.addFocusListener(new MyFocusListener()); 
+0

+1 Да, создать вспомогательный класс для управления именно эта вещь – MadProgrammer

5

Концептуально, что вы действительно хотите, чтобы установить «заполнитель» или «приглашение» для вашего текстового поля, а не изменять фактический текст поле. Такая абстракция также даст вам такие функции, как возможность стилизовать подсказку светло-серого цвета.

A нормальный JTextField не поддерживает это, но вы можете написать свой собственный подкласс или использовать библиотеку. This answer объясняет, как использовать библиотеку SwingX для этого. В принципе, просто import org.jdesktop.swingx.prompt.PromptSupport; и добавьте следующую строку:

PromptSupport.setPrompt("Type your login", login); 
+0

+1 за SwingX предложение. Возможно, стоит взглянуть на [JXLoginPane] (http://stackoverflow.com/questions/tagged/jxloginpane), приведенный в качестве примера [здесь] (http://stackoverflow.com/a/25047554/1795530) и [здесь] (http://stackoverflow.com/a/26147250/1795530), чтобы избежать повторного создания колеса, используя существующие API для приложений на основе Swing для входа. – dic19

+1

+1 для быстрой поддержки, потрясающее дополнение к API – MadProgrammer

+0

+1 для обучения чему-то новому. –