2011-08-21 14 views
10

私はGUIのイディオムに多少慣れていますが、テキスト入力フィールドに何か間違ったタイプを入力すると、バルーンがフィールドから誤った/予想される入力に関する情報がポップアップします。私はもう一度タイプするまで見えるままです。 しかし、今私は例を見つけることができませんでした。入力の検証中に一時的なバルーンツールチップを表示するには?

JTextfieldが指定されていると、私のキーライダーによってトリガーされたときにそのようなバルーンを表示するライブラリ/コードを知っていますか?

@see http://www.javapractices.com/topic/TopicAction.do?Id=151

+1

関連:http://stackoverflow.com/questions/5852941/popup-messages-for-validation –

答えて

11

Balloon Tipはそれを行うライブラリです:

すべて必要だった
balloonTip = new BalloonTip(f, "Tooltip msg"); 

tooltipBalloon = new BalloonTip(someComponent, "I'm a balloon tooltip!"); 
// Now convert this balloon tip to a tooltip, such that the tooltip shows up after 500 milliseconds and stays visible for 3000 milliseconds 
ToolTipUtils.balloonToToolTip(tooltipBalloon, 500, 3000); 
+0

リンクありがとう+1 – mKorbel

+1

驚くばかりのライブラリ! –

6

ジェームズPoulsonによって与えられたリンクは、おそらくより良いソリューションを提供していますが、私はこれがDocumentFilterとJWindowのを使用して、いくつかの単純なJavaコードで可能であったかどうかを確認する必要がありました。これを行うには、次の方法があります。

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Point; 
import java.awt.Window; 
import javax.swing.*; 
import javax.swing.text.AttributeSet; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.DocumentFilter; 
import javax.swing.text.PlainDocument; 

public class InfoBalloon extends JPanel { 
    private static final int PREF_WIDTH = 400; 
    private static final int PREF_HEIGHT = 300; 
    private static final String REGEX_TEST = "\\d*"; 
    private static final String ERROR_TEXT = "Please only add numbers to the text field"; 
    private JTextField textField = new JTextField(10); 
    private JWindow errorWindow; 


    public InfoBalloon() { 
     add(new JLabel("Please Enter Number")); 
     add(textField); 

     ((PlainDocument)textField.getDocument()).setDocumentFilter(new MyNumberDocFilter()); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(PREF_WIDTH, PREF_HEIGHT); 
    } 

    private void showErrorWin() {  
     if (errorWindow == null) { 
     JLabel errorLabel = new JLabel(ERROR_TEXT); 
     Window topLevelWin = SwingUtilities.getWindowAncestor(this); 
     errorWindow = new JWindow(topLevelWin); 
     JPanel contentPane = (JPanel) errorWindow.getContentPane(); 
     contentPane.add(errorLabel); 
     contentPane.setBackground(Color.white); 
     contentPane.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY)); 
     errorWindow.pack(); 
     } 

     Point loc = textField.getLocationOnScreen(); 
     errorWindow.setLocation(loc.x + 20, loc.y + 30); 
     errorWindow.setVisible(true); 
    } 

    private boolean textOK(String text) { 
     if (text.matches(REGEX_TEST)) { 
     return true; 
     } 
     return false; 
    } 

    private class MyNumberDocFilter extends DocumentFilter { 
     @Override 
     public void insertString(FilterBypass fb, int offset, String string, 
       AttributeSet attr) throws BadLocationException { 
     if (textOK(string)) { 
      super.insertString(fb, offset, string, attr); 
      if (errorWindow != null && errorWindow.isVisible()) { 
       errorWindow.setVisible(false); 
      } 
     } else { 
      showErrorWin(); 
     } 
     } 

     @Override 
     public void replace(FilterBypass fb, int offset, int length, String text, 
       AttributeSet attrs) throws BadLocationException { 
     if (textOK(text)) { 
      super.replace(fb, offset, length, text, attrs); 
      if (errorWindow != null && errorWindow.isVisible()) { 
       errorWindow.setVisible(false); 
      } 
     } else { 
      showErrorWin(); 
     } 
     } 

     @Override 
     public void remove(FilterBypass fb, int offset, int length) 
       throws BadLocationException { 
     super.remove(fb, offset, length); 
     if (errorWindow != null && errorWindow.isVisible()) { 
      errorWindow.setVisible(false); 
     } 
     } 
    } 

    private static void createAndShowUI() { 
     JFrame frame = new JFrame("Info Balloon"); 
     frame.getContentPane().add(new InfoBalloon()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowUI(); 
     } 
     }); 
    } 
} 

建設的または破壊的な批評が大歓迎です!

+1

かなり良い、あなたはそれがあまりにもツールチップもあることを主張した場合。私が生産コードのために変更する唯一のことは、JWindowにJFrameに登録されたComponentAdapter( 'componentMoved'をオーバーライド)をJFrameに登録してJFrameに対する相対位置を固定しておくことです。 – toto2

+0

@ toto2:推薦いただきありがとうございます! –

+0

phaaaおそらく親から突き出ている窓:-) +1 – mKorbel

関連する問題