【问题标题】:Jtextfield tooltip update before text is committed在提交文本之前更新 Jtextfield 工具提示
【发布时间】:2012-01-04 13:45:11
【问题描述】:

我有这种情况,我想用数字显示一个数字。该数字将输入到 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);
        }
    });
 }
}

让我们以这种情况为例,用户在第一个文本字段中输入数字。文本光标仍然在同一个文本字段上。当用户现在将鼠标指针移到第一个文本字段上时,工具提示仍然显示旧文本。 现在,当您将焦点转移到第二个文本字段时,第一个文本字段的数据将被提交,因此工具提示也会刷新。

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

【问题讨论】:

    标签: java swing


    【解决方案1】:

    如果您想在用户每次输入内容时更新工具提示,您应该在您的JTextFieldDocument 中添加一个DocumentListener,可以使用JTextField#getDocument 检索它。

    Swing tutorial 有一个这样的DocumentListener 示例

    【讨论】:

      【解决方案2】:

      你无法从Focus捕获这个事件,因为它们是从focusLost / focusGained调用的,如果你想动态更改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) {
          }
      });
      

      【讨论】:

      • 这个解决方案也有效。您能告诉我添加文档侦听器和鼠标侦听器之间的区别吗? jtextfield 上的文本更改实际何时提交?
      • 来自 DocumentListener 是总是在有一些变化时生成的事件,来自 MouseListener 是总是在 onmouseEntered 事件中生成的事件
      【解决方案3】:

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

      【讨论】:

      • A Jtextfield 实际上不会触发 changedUpdate 事件。仅当样式发生更改时,才会触发此事件。纯文本组件仅触发 removeUpdate() 和 insertUpdate().. 谢谢您的回答..
      • 不客气。您对 changedUpdate 是正确的,但 insertUpdate 不能解决您的问题。看到您接受了与我非常相似的答案,我假设您仍在采用 DocumentListener 方法。
      【解决方案4】:

      您应该使用KeyListener 作为JTextField

      【讨论】:

      • -1 监听 JTextComponent 上的输入变化应该发生在 DocumentListenerDocument 上,而不是文本字段上的关键监听器上
      猜你喜欢
      • 2019-04-06
      • 2017-03-30
      • 1970-01-01
      • 2015-08-03
      • 2019-12-01
      • 1970-01-01
      • 2015-12-26
      • 2012-10-01
      • 1970-01-01
      相关资源
      最近更新 更多