2017-11-17 8 views
0

java-swingアプリケーション内で、何らかのヘルプポップアップを持つテキストフィールドがあります。
すなわち、ユーザがテキストフィールド内でマウスをダブルクリックすると、このポップアップ(装飾されていないJFrameとして実装されている)が表示される。TextFieldが他のウィンドウにフォーカスを失います

テキストフィールドがフォーカスを失うとすぐに、このポップアップは再び非表示になります。
このポップアップを表示すると、フォーカスが自動的にそのフレームに移動し、テキストフィールドにlostFocusイベントが発生します。これはもちろんポップアップをもう一度閉じます。

テキストフィールドが同じウィンドウ内の別のコンポーネントにフォーカスを失った場合にのみ、lostFocusイベントがトリガーされるようにしたいと思います。

どのようにすればよいでしょうか?

+0

フォーカスを受け取ったオブジェクトを確認し、それに応じてウィンドウを非表示にします。 –

答えて

1

溶液は思ったよりも簡単です。
設定すると、イベントは無視されます。

UPDATE:ifTemporary()フラグが設定されている場合
、(getOppositeComponent()により)フォーカスを取得成分を決定します。
nullのコンポーネント、またはその親ウィンドウがポップアップフレームでない場合は、ポップアップを閉じるよりも重要です。

+1

'(装飾されていないJFrameとして実装されています)' - フレームの代わりに装飾されていないJDialogを使用します。アプリケーションには単一のJFrameだけを含める必要があります。 – camickr

0

どのオブジェクトがフォーカスを受けているかチェックし、それに応じてウィンドウを非表示にします。 focusLostコールバック内
isTemporary()フラグをチェック:

これは粗い例

public class MainFrame extends JFrame { 

    private JWindow popupWindow; 

    public MainFrame() throws HeadlessException { 
     super("Main Frame"); 
     createGUI(); 
    } 

    private void createGUI() { 
     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     setPreferredSize(new Dimension(600, 400)); 

     JPanel panel = new JPanel(); 
     panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS)); 

     JTextField hintTextField = new JTextField(); 

     popupWindow = new JWindow(this); 
     popupWindow.getRootPane().setBorder(BorderFactory.createLineBorder(Color.RED)); 
     popupWindow.getRootPane().setLayout(new BorderLayout()); 
     popupWindow.getRootPane().add(hintTextField, BorderLayout.CENTER); 

     for(int i = 0; i < 10; i++) { 
      JTextField textField = new JTextField(); 
      textField.addMouseListener(new MouseAdapter() { 
       @Override 
       public void mouseClicked(MouseEvent e) { 
        if(e.getClickCount() == 2) { 
         Point point = textField.getLocationOnScreen(); 
         popupWindow.setBounds(point.x, point.y + textField.getPreferredSize().height, 200, 200); 
         popupWindow.setVisible(true); 
        } 
       } 
      }); 

      textField.addFocusListener(new FocusAdapter() { 
       @Override 
       public void focusLost(FocusEvent e) { 
        if(e.getOppositeComponent() != hintTextField) { 
         popupWindow.setVisible(false); 
        } 
       } 
      }); 

      panel.add(textField); 
     } 

     add(panel, BorderLayout.PAGE_START); 

     pack(); 
     setLocationRelativeTo(null); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> new MainFrame().setVisible(true)); 
    } 
} 
+0

ヒントをありがとうが、私は簡単な解決策を見つけたと思う(私の答えを参照)。 –

関連する問題