2012-01-04 49 views
2

我有这种情况,我想在图中显示一个数字。该号码将被输入Jtextfield,我希望工具提示以数字显示金额。问题是,工具提示显示较旧的数据。文本提交前的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); 
     } 
    }); 
} 
} 

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

现在如何显示文本框中尚未提交的文本上的工具提示?

回答

-2

您应该使用KeyListener作为JTextField

+0

-1收听上的'JTextComponent'在输入改变应与'DocumentListener'发生DocumentListener和教程链接的文档字段 – Robin 2012-01-04 14:19:26

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

Jtextfield不会实际触发changedUpdate事件。只有在风格发生变化时才会触发此事件。一个纯文本组件只会触发removeUpdate()和insertUpdate()..谢谢你的回答,尽管.. – sethu 2012-01-04 14:36:30

+0

不客气。你是对的changedUpdate,但不会insertUpdate解决你的问题。看到你已经接受了与我的非常相似的答案,我假定你仍然采用DocumentListener方法。 – Abbas 2012-01-04 14:49:15

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

该解决方案也适用。你能告诉我添加一个Document Listener和一个Mouse Listener的区别吗? jtextfield上的文本更改何时实际提交?来自DocumentListener的 – sethu 2012-01-04 14:40:13

+0

是事件总是生成时总是有一些变化,从MouseListener是事件总是生成onmouseEntered事件 – mKorbel 2012-01-04 15:06:16