2011-03-06 6 views
1

JFrame에서 JTable을 마우스 오른쪽 버튼으로 클릭하면 JPopupMenu가 표시됩니다. 이 JPOPupMenu를 그대로 둔 상태에서 마우스로 JTable로 이동하면 여전히 행에 마우스를 올려 놓을 수 있습니다.소유자 JFrame에서 호버 효과를 사용하지 않도록 JPopupMenu를 강제 설정 하시겠습니까?

이것은 Windows 응용 프로그램의 기본 동작이 아닙니다. 정상적인 경우 팝업 메뉴가 프로그램에 나타나면 팝업 소유자 윈도우에서 마우스 오버 조치를 차단합니다.

Java에서 동일한 작업을 수행 할 수 있습니까?

+0

팝업 또는 툴팁의 일반적인 윈도우 동작이라고 생각합니다. 당신의 설명은 모달 대화 상자의 동작입니다. –

+0

@Hovercraft Eels의 전체 : 이것은 틀립니다. Windows 메모장을 열고 마우스 오른쪽 버튼을 클릭하여 잘라 내기/복사/붙여 넣기 팝업을 표시하십시오. 그대로두고 메모장의 메뉴 바에서 마우스로 움직여 메뉴 바 버튼 위로 마우스를 가져 가면 호버 효과가 발생하지 않습니다. 하지만 자바 애플리케이션에서는 여전히 JMenubar 컨트롤에 마우스를 올릴 수 있습니다. – Brad

+0

메뉴 효과를 사용하지 않으려면 상위 레벨 컨테이너에 마우스 수신기를 설정해야합니다. 내 대답은 아래를 참조하십시오. – klonq

답변

1

이 문제에 접근하는 한 가지 방법은 호버 이벤트를 사용할지 여부를 표시하도록 GUI 요소 중 하나에서 인스턴스 변수를 설정하는 것입니다. 아래에서이 작업 방법을 보여 줬지만 완전한 형태는 아니며 JPopupMenu를 닫을 때 호버를 다시 활성화하고 호버 효과를 발생하기 전에 ENABLE_HOVER 필드의 상태를 확인해야합니다.

public MyTable extends JTable { 

    private boolean ENABLE_HOVER = true; 

    public MyTable() { 
    ... 
    this.addMouseListener(new MouseListener(){ 
     ... 
     public void mouseClicked(MouseEvent e) { 
      if (isRightClick(e)) { 
       setHoverEnabled(false); 
       showJPopupMenu(); 
      } 
     } 
    }); 
    } 

    protected void setHoverEnabled(final boolean hover) { 
     this.ENABLE_HOVER = hover; 
    } 
} 
+0

고마워,하지만 사용자가 마우스를 올릴 수있는 JTable 이외의 많은 다른 컨트롤이 있습니다. 아이디어는 모든 컨트롤에서 개인화 된 툴팁을 사용하므로 컨트롤 위로 마우스를 가져 가면 호버 효과와 함께 팁이 표시되어 팝업이 표시되는 동안 모양이 너무 어둡게 보입니다. 팝업을 표시 할 때와 같은 것이 필요합니다. myFrame.setEnabled (false); ... 그런 것 같지만 팝업으로 인해 비활성화됩니다. – Brad

1

가능 요소의 다수를 비활성화하는 데 더 적합한 다른 방법은 유리 창에서 이벤트를 가로채는 것입니다. 이것이 어떻게 작동하는지 보여주는 예는 here입니다. 인터페이스가 이미 구축 된 경우 구성 요소 클래스를 다시 지그재그해야 할 수도 있습니다.

유리창에서 모든 이벤트를 차단해야합니다. 마우스를 올리면 (팝업 메뉴가 표시되지 않음) 해당 이벤트에 이벤트를 전달할 수 있습니다. 그렇지 않은 경우, 호버가 무효가되어, JPopupMenu상에서 MouseEvent가 발생했을 경우, JPopupMenu에게만 건네집니다.