저는 스윙 개발에 익숙하지 않습니다. 제 질문이 바보가 아니길 바랍니다.포커스 소유자 일시적으로 null로 변경
다음과 같은 문제가 있습니다. 을 사용하여 포커스를 추적 중입니다. 속성 permanentFocusOwner
의 수신 대기 중입니다. 그러나 하나의 컨트롤에서 다른 컨트롤로 포커스가 변경되면 permanentFocusOwner
속성의 중간 변경이 null
이됩니다.
현재 포커스가 패널 중 하나 또는 하위 패널에있는 경우 현재 UI 로직에서 컨트롤을 일부 변경하고 있습니다. 그러나 중간을 얻는 것은 null
이 논리를 나눕니다.
Google에서이 문제에 대한 정보를 검색 한 결과 관련성이 발견되지 않았습니다.
문제는 의도적으로 설계된 동작인지와 임시 해결 방법 중간에 null이 있는지 여부입니다.
import java.awt.*;
import java.beans.*;
import javax.swing.*;
public class FocusNullTest extends JFrame {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
FocusNullTest self = new FocusNullTest();
self.setVisible(true);
}
});
}
public FocusNullTest() {
setSize(150, 100);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = getContentPane();
contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.X_AXIS));
contentPane.add(new JButton("1"));
contentPane.add(new JButton("2"));
KeyboardFocusManager focusManager =
KeyboardFocusManager.getCurrentKeyboardFocusManager();
focusManager.addPropertyChangeListener(
"permanentFocusOwner",
new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent e) {
System.out.println("permanentFocusOwner changed from: "
+ e.getOldValue());
System.out.println("permanentFocusOwner changed to : "
+ e.getNewValue());
}
});
}
}
로그 출력은 : 여기
는 상기 동작 재생 최소화 애플리케이션이다(프로그램 개시는 자동 버튼 1 세트 포커스)
permanentFocusOwner은 변경된 : null
permanentFocusOwner가 다음으로 변경되었습니다 : javax.swing.JButton [, 0,18,41x26, (건너 뛴)]
,691,363,210 는 permanentFocusOwner가 변경
(2 버튼 클릭) : NULL
permanentFocusOwner가 변경 : javax.swing.JButton
permanentFocusOwner로 변경 [0,18,41x26 (스킵)] 널 의사 코드에서, [(스킵) 41,18,41x26] javax.swing.JButton
(선택 부 :
permanentFocusOwner로 변경)
내 목표는 항목이 확장되어 포커스를 얻었을 때 더 많은 정보를 표시하는 목록보기처럼 보이게하는 것입니다. 확장 된보기에는 몇 가지 추가 버튼이 있습니다.
JList
은 (1) 버튼을 클릭 할 수 없으며 (2) 해당 항목의 높이가 일정하기 때문에 항목을 동적으로 확대하려는 경우 적절한 컨트롤이 아닌 것처럼 보입니다. 편집 모드가있는 JTable
은 최소한 일정한 항목 크기 때문에 적절한 해결책이 아닌 것으로 보입니다.
그래서 세로 상자 레이아웃을 컨테이너로 사용하여 일반 JPanel
을 사용하고 모델 변경 사항을 구독하고 수동으로 비주얼을 업데이트합니다. 문제는 단추를 클릭 할 때 포함하는 목록 항목이 포커스를 잃는 것입니다. 초점이 null
으로 일시적으로 변경되지 않으면 목록 항목 내에 초점이 남아 있음을 감지 할 수 있습니다.(- 원인을 못 찾았 단 초점 asynchrous 자연이 어떻게 든 이유가있을 수 있다는 추측이 아니라, 그것은해야 콩 사양 기준)
firePropertyChange(someProperty, oldValue, null)
firePropertyChange(someProperty, null, newValue)
+ 1에 대해 [sscce] (http://sscce.org/)이지만 목표에 대한 자세한 내용은 더 나은 해결책을 제시 할 수 있습니다. – trashgod
@trashgod : 코드 의도에 대한 세부 정보를 추가했습니다. – Vlad