2017-11-17 2 views
0

자바 스윙 애플리케이션에서 도움말 팝업과 함께 텍스트 필드가 있습니다.
즉, 사용자가 텍스트 필드 내에서 마우스로 더블 클릭하면,이 팝업 (장식되지 않은 JFrame으로 구현 됨)이 표시된다.TextField가 다른 창에 포커스를 잃습니다.

텍스트 필드가 포커스를 잃으면이 팝업이 다시 숨겨집니다.
이 팝업을 표시하면 포커스가 자동으로 해당 프레임으로 이동하여 텍스트 필드에서 lostFocus 이벤트가 발생합니다. 이것은 물론 팝업을 다시 닫습니다.

textField가 동일한 창 내의 다른 구성 요소로 포커스를 잃는 경우에만 lostFocus 이벤트를 트리거하고 싶습니다.

어떤 방법을 생각 하나?

+0

초점을받은 개체를 확인하고 그 개체에 따라 창을 숨 깁니다. –

답변

1

솔루션은 내가 생각했던 것보다 쉽다이다.
설정되면 이벤트를 무시하십시오.

UPDATE 다음 ifTemporary() 플래그가 설정되어 있으면
(getOppositeComponent() 의해) 초점을 얻는 구성 요소를 결정한다.
해당 구성 요소가 null이거나 해당 상위 창이 Google 팝업 프레임이 아닌 경우 팝업을 닫는 것보다 좋습니다.

+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

힌트를 보내 주셔서 감사합니다. 그러나 나는 더 쉬운 해결책을 찾았다 고 생각합니다 (제 답변을보십시오). –

관련 문제