2014-04-25 6 views
1

Snippet자바 스윙에서 커서 포커스가있는 두 JList 중 어떤 것을 알 수 있습니까?

안녕하세요, 저는 Java Swing을 사용하여 간단한 태그 도구를 만들고 있습니다. 구성 요소에는 두 개의 JLists가 있으며 태그 지정 버튼을 클릭 할 때마다 주어진 텍스트에 태그를 추가하려고합니다. 커서 포커스가 왼쪽 JList에 있으면 왼쪽 JList의 텍스트를 수정하고 오른쪽 JList의 텍스트가 올바른 경우 오른쪽 텍스트를 수정합니다. 커서 초점을 사용하면 키보드 화살표를 사용하여 목록 항목을 탐색 할 수 있습니다.

따라서 버튼 수신기는 현재 커서 포커스가 왼쪽 Jlist 또는 오른쪽 Jlist 중 어디에 있는지 알려야합니다. 어떻게해야합니까? 이미 "getFocusOwner"를 사용해 보았습니다. 그러나 방금 클릭 한 버튼을 반환합니다.

+0

문제는 커서 포커스가 의미하는 것은 "커서 포커스가 JVM을 의미하는 것"이 ​​아니라는 것입니다. :) – user1803551

답변

1

가장 우아한 방법으로, 당신은 추가 할 수없는 동안은 당신의 Jlist

public class CheckFocus extends JFrame { 

    JList<String> focusedList = null; 
    JList<String> list1 = new JList<>(new String[]{"A", "B"}); 
    JList<String> list2 = new JList<>(new String[]{"1", "2"}); 

    CheckFocus() { 

     JButton btn = new JButton("Who has focus?"); 

     btn.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) {  

       if (focusedList.equals(list1)) 
        System.out.println("list1"); 
       else if (focusedList.equals(list2)) 
        System.out.println("list2"); 
       else 
        System.out.println("none"); 
      } 
     }); 

     MyFocusListener mfl = new MyFocusListener(); 
     list1.addFocusListener(mfl); 
     list2.addFocusListener(mfl); 

     getContentPane().add(list1, BorderLayout.LINE_START); 
     getContentPane().add(list2, BorderLayout.LINE_END); 
     getContentPane().add(btn, BorderLayout.CENTER); 

     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     pack(); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 

     new CheckFocus(); 
    } 


    class MyFocusListener extends FocusAdapter { 

     @Override 
     public void focusGained(FocusEvent e) { 

      super.focusGained(e); 
      focusedList = (JList<String>) e.getSource(); 
     } 
    } 
} 

각 목록에서 셀을 선택하고 다음 버튼을 누르면에 FocusListener는 JVM은 같은 목록을 처리합니다 - 그들은 둘 다에 초점이 이 아닙니다. 당신이 원하는 것은 버튼을 누르기 직전에 포커스가있는 것을 알아야하지만, JVM은 이러한 종류의 정보를 저장하지 않으므로 사용자가 직접 저장해야합니다.