2013-07-16 6 views
4

requestFocusInWindow()grabFocus() 메서드의 차이점을 알고 싶습니다. 둘 다이 프로그램에서 나에게 초점을 잡는 데는 잘 작동한다. 따라서, 나는 그 차이를 이해할 수 없었다.스윙에서 requestFocusInWindow()와 grabFocus() 사이의 차이

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
class Focus extends JFrame 
{ 
JButton jb; 

    public Focus() 
    { 
     createAndShowGUI(); 
    } 

    private void createAndShowGUI() 
    { 
     setTitle("grabFocus() vs requestFocusInWindow()"); 
     setLayout(new FlowLayout()); 
     setSize(400,400); 
     setVisible(true); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     jb=new JButton("Open Dialog"); 
     jb.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent ae) 
      { 
       showDialog(); 
      } 
     }); 

     add(jb); 
    } 

    private void showDialog() 
    { 
     JDialog jd=new JDialog(); 
     jd.setLayout(new GridLayout(2,2)); 
     jd.setVisible(true); 


     JLabel l1=new JLabel("Label 1"); 
     JLabel l2=new JLabel("Label 2"); 

     JTextField jt1=new JTextField(20); 
     JTextField jt2=new JTextField(20); 

     jd.add(l1); 
     jd.add(jt1); 
     jd.add(l2); 
     jd.add(jt2); 

     // Both of them are doing the thing 
     //jt2.grabFocus(); 
     jt2.requestFocus(); 

     jd.pack(); 
    } 

    public static void main(String args[]) 
    { 
     SwingUtilities.invokeLater(new Runnable(){ 
      public void run() 
      { 
       new Focus(); 
      } 
     }); 
    } 
} 

답변

10

대답은 간단하다, grabFocus()잡고 초점, 최상위 클래스의 윈도우에 포커스를 설정하는 여부에 상관없이. 윈도우가 액티브하지 않은 경우, 액티브하게되어 컴퍼넌트가 포커스를 취득합니다.

반면에 requestFocusInWindow()이라는 최상위 조상이 포커스 된 윈도우 인 경우에만이라고하는 구성 요소의 포커스를 가져옵니다.

예에서 JDialog은 최상위 조상이고 JButton을 클릭하면 자동으로 포커스를 얻습니다. 따라서 requestFocusInWindow()grabFocus()은 차이가 없습니다.

실용적인 접근 방법을 사용하여 차이점을 더 잘 이해할 수 있도록 프로그램을 다시 작성했습니다. 여기

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
class Focus extends JFrame 
{ 
JButton jb; 
JTextField jt; 

    public Focus() 
    { 
     createAndShowGUI(); 
    } 

    private void createAndShowGUI() 
    { 
     setTitle("grabFocus() vs requestFocusInWindow()"); 
     setLayout(new FlowLayout()); 
     setSize(400,400); 
     setVisible(true); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     jb=new JButton("Open Dialog"); 
     jb.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent ae) 
      { 
       showDialog(); 
      } 
     }); 

     add(jb); 

     jt=new JTextField(20); 

     add(jt); 
    } 

    private void showDialog() 
    { 
     JDialog jd=new JDialog(); 
     jd.setLayout(new GridLayout(2,2)); 
     jd.setVisible(true); 


     JLabel l1=new JLabel("Label 1"); 
     JLabel l2=new JLabel("Label 2"); 

     JTextField jt1=new JTextField(20); 
     JTextField jt2=new JTextField(20); 

     jd.add(l1); 
     jd.add(jt1); 
     jd.add(l2); 
     jd.add(jt2); 

     jt.requestFocusInWindow(); 
     //jt.grabFocus(); 

     jd.pack(); 
    } 

    public static void main(String args[]) 
    { 
     SwingUtilities.invokeLater(new Runnable(){ 
      public void run() 
      { 
       new Focus(); 
      } 
     }); 
    } 
} 

requestFocusInWindow()jt에 호출되고 작동하지 않습니다 (즉 jt 초점을하지 않음) JButton을 클릭하고 JDialogJTextField에 포커스가 놓여 졌을 때 JDialog이 활성화되어 있기 때문이다.

다음으로 grabFocus()이 작동합니다. JButton을 클릭하면 JDialog이 표시되지만 활성화되지는 않습니다. grabFocus()을 호출하면 즉시 JFrame이 활성 최상위 조상이되고 jt이됩니다.

+7

당신이이 포스트에서 실제 게시물을 언급하지는 못했지만 __grabFocus()는 사용되지 않습니다 .__ 청구를 확고히하기 위해 [Java 문서] (http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html#grabFocus())의 라인 - __ "이 메소드는 의도 된 것입니다. 클라이언트 코드는이 메소드를 사용해서는 안되며 대신 requestFocusInWindow() "__ -1을 사용해야합니다. ( –

+1

) 부모가없는 JDialog (내 명령 참조), 다시 invokeLater에 래핑되지 않은 상태에서 JDialog 포커스 소유자 (EDT 이벤트 다발)이며 포커스를 JDialogs 하위에 설정할 수 없으며 포커스를 JFrame – mKorbel

+0

@nIcEcOw로 되돌립니다.하지만 질문은'requestFocusInWindow()'와'grabFocus()'의 차이점에 대해서만 설명합니다. OP는'grabFocus()'가 사용되지 않을지 결코 묻지 않았습니다. 추가 정보가없는 답변은 StackOverflow에서 투표 할 수 있습니까? 그냥 알고 싶습니다!;) – user12458