在提交文本之前更新Jtextfield工具提示

时间:2012-01-04 13:45:12

标签: java swing

我有这种情况,我希望在数字中显示一个数字。该数字将输入到Jtextfield,我希望工具提示以数字显示数量。问题是,工具提示显示较旧的数据。

我写了一些代码来向您展示问题:

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 个答案:

答案 0 :(得分:4)

如果您想在每次用户输入内容时更新工具提示,您应该向JTextField的{​​{3}}添加DocumentListener,可以使用{{3}检索Document }}

JTextField#getDocument有一个例如DocumentListener

答案 1 :(得分:4)

您无法从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) {
    }
});

答案 2 :(得分:1)

尝试更新文本字段的文档对象的changedUpdate事件上的工具提示:

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());
    }
});

答案 3 :(得分:-2)

您应该KeyListener使用JTextField