2017-10-05 9 views
2

아래의 테스트 케이스와 비슷한 동작을하는 애플리케이션을 실행 중입니다.Java 8 - 창 전환 후 모든 키보드 입력 또는 포커스 손실.

문제는 포커스를 클릭하고 아래의 응용 프로그램 프레임을 보면서 다른 창으로 이동 한 다음 focusGained 청취자가있는 텍스트 필드를 직접 클릭하여 대화 상자를 닫으면 모든 키 입력이 응용 프로그램의 모든 텍스트 필드에 손실 될 수 있습니다.

응용 프로그램의 아무 곳이나 처음에 작업 표시 줄의 아이콘을 클릭하여 다시 포커스를 얻으면 다시 발생하지 않습니다.

자바 8 특정 - 자바 7에서 자바 (9)에 대해 확실하지 초점을 잃지 않을 것입니다하지만 어쨌든

테스트 케이스 아래에이 동작을 보여줍니다 옵션을 선택하지 않습니다.

@Override 
public void focusGained(FocusEvent e) 
{ 
    noFocus.requestFocusInWindow(); 

    SwingUtilities.invokeLater(new Runnable() 
    { 
     public void run() 
     { 
       createDialog().setVisible(true); 
     } 
    }); 
} 

이 대화 상자가 표시되기 전에 텍스트 필드가 제대로 초점을 얻을 수 있습니다 :

public class FocusTest extends JFrame 
{ 
    JTextField noFocus; 

    public static void main(String[] args) 
    { 
     FocusTest ft = new FocusTest(); 
     ft.setVisible(true); 
    } 

    public FocusTest() 
    { 
     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     setBounds(100,100,300,150); 
     setLayout(new GridLayout(3,1, 2, 2)); 
     setTitle("Losing keyboard..."); 
     noFocus = new JTextField(); 
     add(noFocus); 

     JTextField jft = new JTextField(); 
     jft.addFocusListener(new FocusAdapter() 
     { 
      @Override 
      public void focusGained(FocusEvent e) 
      { 
       createDialog().setVisible(true); 
       noFocus.requestFocusInWindow(); 
      } 
     }); 
     add(jft); 

     JButton jb = new JButton("OPEN"); 
     jb.addActionListener(new ActionListener() 
     { 
      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
       if(e.getActionCommand().equals("OPEN")) 
        createDialog().setVisible(true); 
      } 
     }); 
     add(jb); 
    } 

    private JDialog createDialog() 
    { 
     final JDialog jd = new JDialog(this, true); 
     jd.setLocationRelativeTo(this); 
     jd.setLayout(new BorderLayout()); 
     jd.getContentPane().add(new JTextField(), BorderLayout.CENTER); 
     JButton jb = new JButton("Close"); 
     jb.addActionListener(new ActionListener() 
     { 
      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
       if(e.getActionCommand().equals("Close")) 
        jd.dispose(); 
      } 
     }); 
     jd.getContentPane().add(jb, BorderLayout.SOUTH); 
     jd.setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
     jd.pack(); 
     return jd; 
    } 
} 

답변

2

는 무슨 일이 일어나고 있는지 정확히는 모르겠지만, 하나 개의 솔루션 SwingUtilities.invokeLater()를 사용하는 것입니다.

+0

그래, 고마워. 나는 이것이 7과 8 사이의 행동을 변화 시켰다는 것을 불안하게 만든다. –