2014-06-05 3 views
0

I 같은 핸드 커서를 요구 JLabel의 단추의 범위 갖는 다층 Java 애플리케이션이 커서 그러나자바의 JLayeredPane 재정

button.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); 

을 그 위에 층을 경계 전체를 덮고있다 가지고 응용 프로그램 (팝업 등 그리기). 위의 레이어를 추가 했으므로 커서가 더 이상 변경되지 않습니다. 위의 레이어에 대해 커서를 null로 설정하려고 시도했지만 영향이 없습니다.

private void create() { 
    this.addWindowListener(windowAdapter); 
    this.setLayout(new BorderLayout()); 

    layers = new JLayeredPane(); 
    layers.setPreferredSize(this.getSize()); 

    dashboard = new DashBoard.DashBoardLayer(); 
    dashboard.setBounds(0, this.getHeight()-275, this.getWidth(),275); 

    application = new App.ApplicationLayer(); 
    application.setBounds(0,0,this.getWidth(),this.getHeight()-145); 

    filter = new FilterLayer(); 
    filter.setBounds(0,195,this.getWidth(),490); 

    menuBG = MenuLayerBg.getInstance(); 
    menuBG.setBounds(0,0,this.getWidth(),this.getHeight()); 

    menuPanes = MenuLayer.getInstance(); 
    menuPanes.setBounds(0,0,this.getWidth(),this.getHeight()); 

    layers.add(application, new Integer(0)); 
    layers.add(filter, new Integer(1)); 
    layers.add(dashboard, new Integer(2)); 
    layers.add(menuBG, new Integer(3)); 
    layers.add(menuPanes, new Integer(4)); 

    this.add(layers, BorderLayout.CENTER); 
} 

답변

1

MouseEvent입니다 만 상단의 구성 요소로 전달된다

여기 층의 기본 레이아웃이다. 따라서 최상위 레이어가 맨 아래 레이어의 구성 요소를 완전히 커버하는 경우 MouseEvent가 수신되지 않습니다.

How to Use Layered Panes의 스윙 튜토리얼에있는 LayeredPaneDemo.java 코드를 살펴보십시오. 이벤트가 상위 구성 요소 아래의 구성 요소에 의해 허용 될 수 있도록

for (int i = 0; i < layerStrings.length; i++) { 
     JLabel label = createColoredLabel(layerStrings[i], 
              layerColors[i], origin); 
     layeredPane.add(label, new Integer(i)); 
     origin.x += offset; 
     origin.y += offset; 

    label.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); // added 
    } 

각 구성 요소는 전체 프레임보다 고정 작은 크기이다 : 나는 코드를 다음과 같이 변경했다.

코드를 실행하면 커서가 위쪽 두 레이블에서 바뀝니다.

"Dukes Layer and Position"을 "Yellow"로 변경하고 확인란의 선택을 취소하면 커서가 모든 레이블에 대해 변경됩니다.

그러나, 그 위의 층

한 가지 가능한 솔루션은 상위 계층 아래의 구성 요소에 "마우스 이벤트를 재발 dispatch"하는 것입니다 전체 응용 프로그램을 포함하는 범위를 가지고있다. 이 방법의 예를 들어 How to Use Root Panes

에 스윙 튜토리얼에서 GlassPaneDemo.java을 확인하거나 완전히 다른 접근 방식 당신은 항상 false를 반환하기 위해 구성 요소의 contains(...) 메서드를 재정의 시도 할 수 있습니다. 이렇게하면 마우스 포인트가 구성 요소에 속하지 않으므로 마우스 이벤트가 구성 요소로 전달되지 않습니다. 나는 전에 이것을 시도한 적이 없으므로 이것이 다른 문제를 일으키는 지 알 수 없다.

는 내가이 createColoredLabel(...) 방법으로 변경 다음함으로써 LayeredPaneDemo이 시도 :

JLabel label = null; 

    if (color.equals(Color.green)) 
    { 
     label = new JLabel(text) 
     { 
      @Override 
      public boolean contains(int x, int y) 
      { 
       return false; 
      } 
     }; 
    } 
    else 
     label = new JLabel(text); 

    //JLabel label = new JLabel(text); 
+0

내가 끝이 잘 작동에 당신이 언급 한 것처럼 편집이 (가) 레이어 기능이 포함되어 있음을 발견했다. 오버레이 레이어가 false를 반환하면 하위 레이어가 커서를 표현할 수 없게되어서 감사합니다! – kmac