Обновление всплывающей подсказки Jtextfield перед тем, как текст будет зафиксирован - PullRequest
2 голосов
/ 04 января 2012

У меня есть такая ситуация, когда я хотел бы отобразить число цифрами. Число будет введено в поле Jtext, и мне бы хотелось, чтобы во всплывающей подсказке отображалась сумма цифрами. Проблема в том, что во всплывающей подсказке отображаются более старые данные.

Я написал код, чтобы показать вам проблему:

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class Test
{
 public static void main(String[] args) {
    final JFrame frame=new JFrame();
    frame.setLayout(new FlowLayout());
    frame.setPreferredSize(new Dimension(400,100));
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    final JTextField tf=new JTextField(30);
    frame.add(tf);
    frame.add(new JTextField(30));

    tf.addFocusListener(new FocusListener() {

        @Override
        public void focusLost(FocusEvent e) {
            tf.setToolTipText(tf.getText());
        }

        @Override
        public void focusGained(FocusEvent e) {
            tf.setToolTipText(tf.getText());
        }
    });

    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            frame.pack();
            frame.setVisible(true);
        }
    });
 }
}

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

Теперь, как мне показать всплывающую подсказку для текста, который все еще не зафиксирован в текстовом поле?

Ответы [ 4 ]

4 голосов
/ 04 января 2012

вы не можете перехватить это событие из Focus, потому что они вызываются из focusLost / focusGained, просто удалите эти два метода и добавьте MouseListener, если вы хотите динамически изменить текст JToolTip

1) определить ToolTipManager

ToolTipManager ttm = ToolTipManager.sharedInstance();
ttm.setInitialDelay(0);
ttm.setDismissDelay(10000);

2) оберните это к invokeLater для удаления замораживания или мерцания

tf.addMouseListener(new MouseListener() {

    @Override
    public void mouseClicked(MouseEvent e) {
    }

    @Override
    public void mousePressed(MouseEvent e) {
    }

    @Override
    public void mouseReleased(MouseEvent e) {
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                tf.setToolTipText(tf.getText());
            }
        });
    }

    @Override
    public void mouseExited(MouseEvent e) {
    }
});
4 голосов
/ 04 января 2012

Если вы хотите обновлять всплывающие подсказки каждый раз, когда пользователь что-то вводит, вы должны добавить DocumentListener к Document вашего JTextField, что может быть извлекается с помощью JTextField#getDocument.

В учебнике Swing есть пример такого DocumentListener

1 голос
/ 04 января 2012

Попробуйте обновить всплывающую подсказку по событию changeUpdate объекта документа вашего текстового поля:

import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

tf.getDocument().addDocumentListener(new DocumentListener() {
    public void changedUpdate(DocumentEvent e) {
        tf.setToolTipText(tf.getText());
    }
    public void removeUpdate(DocumentEvent e) {
            tf.setToolTipText(tf.getText());
    }
    public void insertUpdate(DocumentEvent e) {
            tf.setToolTipText(tf.getText());
    }
});
0 голосов
/ 04 января 2012

Вы должны использовать KeyListener для JTextField.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...