setComponentPopupMenu
(계속해서 크로스 플랫폼 방식으로 팝업의 마우스 및 키보드 호출을 처리하므로 좋음) JPopupMenu.show(Component, int, int)
을 덮어 쓰면 해당 행을 선택할 수 있습니다. 당신의 팝업이있는 x를 키보드를 통해 호출 (당신은 또한 당신의 대상 구성 요소에 getPopupLocation
를 오버라이드 (override)하지 않는) 경우, 당신은 JPopupMenu.show
얻을 예 위치는 구성 요소의 중간 될 것
는
JPopupMenu jPopupMenu = new JPopupMenu() {
@Override
public void show(Component invoker, int x, int y) {
int row = jList.locationToIndex(new Point(x, y));
if (row != -1) {
jList.setSelectedIndex(row);
}
super.show(invoker, x, y);
}
};
jList.setComponentPopupMenu(jPopupMenu);
참고. 이 경우 이미 선택 항목이있는 경우 선택 항목을 변경하지 않으려 고합니다.
키보드 대 마우스 호출 문제를 해결하기위한 해결책은 구성 요소의 클라이언트 속성을 getPopupLocation
으로 설정하고 팝업을 표시 할 때 확인하는 것이 었습니다. getPopupLocation
에 대한 인수는 키보드를 통해 호출 할 때 null
이됩니다. 다음은 핵심 코드입니다 (구성 요소 및 팝업 메뉴에서 사용할 수있는 유틸리티 클래스로 구현되었을 수 있음).
private static final String POPUP_TRIGGERED_BY_MOUSE_EVENT = "popupTriggeredByMouseEvent"; // NOI18N
public static Point getPopupLocation(JComponent invoker, MouseEvent event)
{
boolean popupTriggeredByMouseEvent = event != null;
invoker.putClientProperty(POPUP_TRIGGERED_BY_MOUSE_EVENT, Boolean.valueOf(popupTriggeredByMouseEvent));
if (popupTriggeredByMouseEvent)
{
return event.getPoint();
}
return invoker.getMousePosition();
}
public static boolean isPopupTriggeredByMouseEvent(JComponent invoker)
{
return Boolean.TRUE.equals(invoker.getClientProperty(POPUP_TRIGGERED_BY_MOUSE_EVENT));
}
그런 다음 구성 요소에 getPopupLocation
를 오버라이드 (override) :
@Override
public Point getPopupLocation(MouseEvent event)
{
return PopupMenuUtils.getPopupLocation(this, event);
}
팝업 위치에있는 행을 선택 (또는 어떤 조치가 이해 할 수 있는지 여부를 결정하기 위해 JPopupMenu.show
의 재정에 isPopupTriggeredByMouseEvent
전화
JPopupMenu jPopupMenu = new JPopupMenu() {
@Override
public void show(Component invoker, int x, int y) {
int row = jList.locationToIndex(new Point(x, y));
if (row != -1 && PopupMenuUtils.isPopupTriggeredByMouseEvent((JComponent) invoker)) {
jList.setSelectedIndex(row);
}
super.show(invoker, x, y);
}
};
테스트되지 않은 코드의 팬은 아니지만'isPopupTrigger()'확인을위한 투표를 강요 당했다. –
예, 작동합니다.감사 ! – VaclavDedik
@Vena, @ Andrew Thompson : 천만에. –