2011-08-23 8 views
3

JScrollPane에 포커스를주는 데 문제가 있습니다. 내가 작업중인 키 바인딩을 시도 할 수 있도록 창을 만들 때이 작업을 수행하려고합니다. 모든 것이 그것이 있어야하고 올바른 크기로 나타납니다. 내가있어하는 것은 다음과 같습니다JScrollPane를 포커스 할 수 없습니까?

import java.awt.*; 
import java.swing.*; 

public class MyInterface extends JFrame { 
    public MyInterface() {} 

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

    private static void createAndShowGUI() { 
     // define custom table model 
     JTable table = new JTable(model); 
     MyScrollPane scrollPane = new MyScrollPane(table); 
     MyInterface frame = new MyInterface(); 
     scrollPane.setPreferredSize(new Dimension(512, 512)); 
     frame.getContentPane().add(scrollPane); 
     frame.pack(); 
     frame.setVisible(); 
     scrollPane.requestFocus(); 
    } 
} 

public class MyScrollPane extends JScrollPane implements KeyListener { 
    public MyScrollPane(Component view) { 
     super(view, ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); 
    } 

    // key event processing 
} 

나는 윈도우가 완성 개방 후 스크롤에 대한 초점을 요청합니다 프레임에 윈도우 청취자를 추가했지만, 그것은 도움이되지 않았다. 어떤 아이디어?

편집 : 생각은 내가 언급해야하는 scrollPane.isFocusable()와 scrollPane.isRequestFocusEnabled 모두 true를 반환, 그래서 나는 포커스를 줄 수 있어야합니다.

편집 : 에 초점을 맞출 수없는 것 같습니다. (프레임, 테이블 등)이므로 다른 문제가 있습니다. 아무리 노력해도 null이 표시됩니다.

Component compFocusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(); 
System.out.println("focus owner: " + compFocusOwner); 
+2

왜 코드가'JScrollPane'을 확장합니까? 클래스를 확장하는 것을 피하는 것이 일반적으로 선호되며,이 예에서 볼 수있는 것은 클래스를 확장하는 것을 정당화하지 않습니다. BTW - 좀 더 빨리 도움을 받으려면 [SSCCE] (http://pscode.org/sscce.html)를 게시하십시오. –

답변

4

나는 가능하지가 JScrolPane에 포커스를 설정할 수 있지만 장소 문제를 수 없습니다 JScrolPane에있는 JComponent에,에 초점을 설정할 수 있다고 생각

Runnable doRun = new Runnable() { 

     @Override 
     public void run() { 
      myComponent.requestFocus();//requestFocusInWindow 
      myComponent.grabFocus(); 
     } 
    }; 
    SwingUtilities.invokeLater(doRun); 
+0

스크롤 창 안의 테이블에서이 작업을 시도했지만 그 중점을 줄 수는 없습니다. 가능하다면 스크롤 창에 초점을 맞추고 싶습니다. 화살표 키를 통해 스크롤 창에서 스크롤 할 수 있도록 KeyListener를 추가하고 있습니다. 기본적으로 저는 스크롤 창을 사용하여 게임의지도를 저장합니다. 따라서 컨테이너가 키 이벤트를 내용보다 해석하기를 바랍니다.지도가 매번 바뀔 것이기 때문입니다. 또한 키 핸들러는 스크롤바를 움직이기 때문에 스크롤 창 자체보다 테이블을 제어하는 ​​것이 더 지저분 할 것입니다. – bendicott

+0

그러면 마지막 줄에'myTable.changeSelection (row, col, false, false);를 추가하십시오. – mKorbel

+0

오, 내용 자체가 바뀌지는 않을 것입니다. (파괴 가능한 지형을 추가 할 계획입니다. 다른 주제); 여러 테이블이 있지만 한 번에 하나씩 만 표시됩니다. 예를 들어 overworld지도에 대한 테이블 하나 (건물 내부 용). 플레이어가 상점에 들어올 때마다 (매우 작은지도이기도 함) overworld지도 자체를 편집하는 것은 비실용적이므로 필요에 따라 콘텐츠를 간단히 교환 할 것입니다.이렇게하려면 모든지도에 스크롤하기위한 키 이벤트를 해석하는 코드가 있어야합니다. 이는 정확하게 직관적이지 않습니다. – bendicott

4

왜 이런가 필요합니까? JScrollPane 내부의 구성 요소에 중점을 두어야한다고 생각합니다. 그 초점이 없다는 것을 어떻게 감지합니까? 스크롤 창 자체에는 보이지 않는 부분이 있습니다 (단지 1 픽셀짜리 프레임 만 보일 수도 있음).

+0

다시 나보다 빨리 hmmmm +1 – mKorbel

+0

죄송합니다. 아무도 내 테스트 코드를 원하지 않는다고 생각했습니다. scrollPane 포커스를 주려고 시도한 후에이 줄을 추가했습니다. System.out.println ("scrollPane has focus ?:"+ scrollPane.hasFocus()); – bendicott

3

How to Use Key Bindings: How Key Bindings Work에서 언급 한 바와 같이, 복합 구성 요소가 일반적으로 사용하는 WHEN_ANCESTOR_OF_FOCUSED_COMPONENT지도. Key Bindings과 같이 최상위 구성 요소의 루트 창에 바인딩을 추가 할 수도 있습니다.

+0

에 의해 게시물을 확인하십시오. 키 바인딩에 대한 헤드 업을 보내 주셔서 감사합니다. 이것은 KeyListener를 구현하는 것보다 훨씬 강력 해 보입니다. – bendicott

+0

동의; 이 관련 [예제] (http://stackoverflow.com/questions/5797862/draw-a-line-in-a-jpanel-with-button-click-in-java/5797965#5797965)를 참조하십시오. – trashgod

0

나는 문제가 무엇인지 전혀 알지 못했다. 더 나은 아이디어가 없기 때문에 모든 것을 삭제하고 다시 입력 했으므로 이제 작동합니다. 으로 JScrollPane을 포커스 할 수 있습니다. 기본적으로 .isFocusable() 및 isRequestFocusEnabled()가 모두 true로 설정되어 있기 때문에 가능하다고 생각했습니다. 하지만 그래, 나는 모른다. 최소한 키 바인딩을위한 몇 가지 좋은 링크가 있습니다. 도와 주셔서 감사합니다!

관련 문제