2012-01-04 53 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