Пример текста в JTextField - PullRequest
       5

Пример текста в JTextField

7 голосов
/ 18 февраля 2011

Я ищу способ поместить пример текста в свинг JTextField и сделать его серым. Текст примера должен исчезнуть, как только в это текстовое поле будет введена какая-либо вещь. Что-то похожее на то, что делает stackoverflow, когда пользователь отправляет вопрос с полем заголовка.

Мне бы хотелось, чтобы это была уже расширенная реализация JTextField, чтобы я мог просто вставить ее в качестве простой замены. Все из swingx будет работать. Я думаю, если нет простого способа сделать это, мой вариант, вероятно, будет переопределить метод рисования JTextField сделать что-то таким образом, возможно.

Спасибо

Ответы [ 7 ]

7 голосов
/ 18 февраля 2011

Класс Text Prompt обеспечивает необходимую функциональность без использования пользовательского JTextField.

5 голосов
/ 18 февраля 2011

Если вы можете использовать внешние библиотеки, компоненты Swing из программного обеспечения Jide имеют то, что вы ищете;он называется LabeledTextField ( javadoc ) и является частью общего уровня JIDE (Open Source Project) - который является бесплатным.Он делает то, что предложил mklhmnn.

3 голосов
/ 18 февраля 2011

Как насчет инициализации текстового поля с текстом по умолчанию и предоставления ему слушателя фокуса таким образом, чтобы при получении фокуса, если текст., Эквивалентный тексту по умолчанию, вызывал selectAll () для JTextField.

2 голосов
/ 03 ноября 2012
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);
    }
}
2 голосов
/ 18 февраля 2011

Вместо переопределения поместите значение в поле и добавьте KeyListener, который удалял бы значение при регистрации нажатия клавиши. Может быть, это также изменит передний план.

Вы можете заключить это в свой собственный JTextField класс, который будет принимать текст по умолчанию в конструкторе.

1 голос
/ 18 февраля 2011

Сделайте это так:

  1. Определите строку с исходным текстом, который вам нравится, и настройте TextField:

    String initialText = "Enter your initial text here";
    jTextField1.setText(initialText);
    
  2. Добавьте слушателя фокуса к вашему TextField, который выбирает все содержимое TextField, если оно все еще имеет начальное значение.Все, что вы можете ввести, заменит все содержимое, поскольку оно выбрано.

    jTextField1.addFocusListener(new java.awt.event.FocusAdapter() {
        public void focusGained(java.awt.event.FocusEvent evt) {
           if (jTextField1.getText().equals(initialText)) {
              jTextField1.selectAll();
           }
        }
    });
    
1 голос
/ 18 февраля 2011

Вы не можете сделать это с помощью простого текстового поля, но вы можете поместить отключенный JLabel поверх JTextField и скрыть его, если текстовое поле получает фокус.

...