Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 提交文本前Jtextfield工具提示更新_Java_Swing - Fatal编程技术网

Java 提交文本前Jtextfield工具提示更新

Java 提交文本前Jtextfield工具提示更新,java,swing,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; impor

在这种情况下,我想用数字显示一个数字。数字将输入到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);
        }
    });
 }
}
让我们假设这种情况,用户在第一个文本字段中键入数字。文本光标仍在同一文本字段上。当用户现在将鼠标指针移动到第一个文本字段上时,工具提示仍然显示旧文本。 现在,当您将焦点转移到第二个文本字段时,第一个文本字段的数据将被提交,因此工具提示也将刷新


现在,如何在文本字段中仍未提交的文本上显示工具提示

您应该对
JTextField
使用
KeyListener
,如果您想在用户每次键入内容时更新工具提示,您应该在
JTextField


有这样一个示例:DocumentListener

尝试更新文本字段文档对象的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());
    }
});

您无法从
Focus
捕获此事件,因为它们是从
focusLost/focusgound
调用的,如果您想动态更改
JToolTip
的文本,只需删除这两个方法并添加
MouseListener

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

-1侦听
JTextComponent
上输入的更改应该与
Document
上的
DocumentListener
一起发生,而不是与文本字段上的键侦听器一起发生。Jtextfield实际上不会触发changedUpdate事件。只有在样式发生更改时,才会触发此事件。纯文本组件仅激发removeUpdate()和insertUpdate()。。谢谢你的回答,不客气。关于changedUpdate,您是对的,但insertUpdate不能解决您的问题。鉴于您已经接受了一个与我非常相似的答案,我假设您仍然采用DocumentListener方法。这个解决方案也很有效。您能告诉我添加文档侦听器和鼠标侦听器的区别吗?jtextfield上的文本更改实际上是什么时候提交的?从DocumentListener总是生成事件当有一些更改时,从MouseListener总是在MouseEntered事件上生成事件