2014-12-16 1 views
2

나는 불가능할 수도있는 뭔가를 찾고 있습니다. Java에서 (Windows 7에서 실행되는 1.6은 플랫폼에 따라 다르기 때문에) 다른 창 위에 창을 표시하려고하지만 트리거하는 구성 요소에서 포커스를 훔치지는 않습니다. 아래에 첨부 된 예제에서는 텍스트 필드를 클릭하고 새 팝업을 앞에 띄우지 만 텍스트 필드에 포커스를 유지할 수있게하고 싶습니다. 대신에 패널을 앞쪽으로 가져 오지만 텍스트 필드에 다시 집중하지 마십시오.초점을 유지하지 않는 동안 Java 위로

이것이 가능한지 주로 궁금해합니다. (일반적으로 프론트 윈도우는 Windows에 초점을 맞추고 있으므로 아마도 기대하지 않습니다.) 그렇지 않으면 누군가가 좋은 해결 방법에 대한 의견을 갖고 있습니다. 나는 열린 귀입니다.

예 :

public class PopUpExample 
{ 
    // Global toolkit listener. 
    enum PopUp 
    { 
     INSTANCE; 

     private PopUpWindow m_popUp; 
     private JTextComponent m_textComponent; 

     public void initialize(PopUpWindow p) 
     { 
      m_popUp = p; 

      Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() 
      { 
       public void eventDispatched(AWTEvent e) 
       { 
        // Ensure event is a focus gain event. 
        if ((e instanceof FocusEvent) 
          && ((FocusEvent)e).getID()==FocusEvent.FOCUS_GAINED) 
        { 
         // If it is on a text field, make the pop up appear, but maintain focus on the text field 
         if ((e.getSource() instanceof JTextComponent)) 
         { 
          m_textComponent = (JTextComponent)e.getSource(); 
          // FIXME Code below here should set the button on top, yet leave the text field with focus. 
          m_popUp.setAlwaysOnTop(true); 
          m_popUp.setFocusable(false); 
          m_popUp.setVisible(true); 
          m_textComponent.requestFocus(); 
          // end FIXME 
         } 
         // Otherwise, make the pop up disappear (if it isn't the pop up itself). 
         else if (((JComponent)e.getSource()).getRootPane().getComponent(0) instanceof PopUpWindow) 
         { 
          m_popUp.setVisible(false); 
         } 
        } 
       } 
      }, AWTEvent.FOCUS_EVENT_MASK); 
     } 
    } 

    // Pop up window that isn't focusable 
    class PopUpWindow extends JFrame 
    { 
     public PopUpWindow() 
     { 
      super(); 

      BorderLayout layout = new BorderLayout(); 
      this.setLayout(layout); 

      this.setMinimumSize(new Dimension(100, 100)); 

      JButton button = new JButton("WantOnFront"); 
      button.setFocusable(false); 
      this.add(button, BorderLayout.CENTER); 

      this.setFocusable(false); 
     } 
    } 

    // Main application window. 
    class GuiWindow extends JFrame 
    { 
     public GuiWindow() 
     { 
      super(); 

      BorderLayout layout = new BorderLayout(); 
      this.setLayout(layout); 

      this.setMinimumSize(new Dimension(400, 400)); 

      JButton button = new JButton("defaultFocusButton"); 
      this.add(button, BorderLayout.CENTER); 

      JTextField textField = new JTextField("WantToMaintainFocusWhenClicked"); 
      this.add(textField, BorderLayout.SOUTH); 
     } 
    } 

    // Setup code 
    public PopUpExample() 
    { 
     new GuiWindow().setVisible(true); 
     PopUp.INSTANCE.initialize(new PopUpWindow()); 
    } 

    public static void main(String[] args) 
    { 
     new PopUpExample(); 
    } 
} 
+1

가장 중요한 점은 무엇입니까? 달성하려는 효과는 무엇이며 그 이유는 무엇입니까? 전반적인 문제를 더 잘 이해하면 괜찮은 해결책을 제시하는 것이 더 나을 것입니다. 또한 자식 윈도우는 JFrame이 아니라 JDialog이어야합니다. –

+0

문제의 목표에서 내 목표를 추상화하고 싶었지만 (질문에서 부풀어 오를 것이라고 생각했기 때문에), 유용한 정보라고 생각하면 가상 키보드를 만들고 있습니다. 텍스트 필드를 선택할 때 나타나는 팝업은 실제로 가상 키보드를 표시하기 위해 눌러 질 수있는 버튼입니다. 그러나 실제 키보드는 여전히 입력 할 수 있어야하기 때문에 텍스트 필드에 포커스를 유지하고 싶습니다. – Ironcache

+1

정보를 제공해 주셔서 감사합니다. Camickr는 스윙 천재입니다. –

답변

4

새로운 팝업가 앞에 표시되지만 텍스트 필드에 초점을 유지해야합니다.

JDialog dialog = new JDialog(...); 
dialog.setFocusableWindowState(false); 
... 
dialog.setVisible(true); 
+0

JDialog에 대해 몰라 setFocusableWindowState (bool); 빠른 답장을 보내 주셔서 감사합니다. – Ironcache

관련 문제