2016-11-10 4 views
0

안녕하세요. JLayer 함수를 찾았습니다. 대기 잠금 장치로 사용하고 싶습니다. 레이어를 활성화하면 기본 구성 요소가 모든 이벤트 (키 및 마우스)를받습니다. 레이어에서 이벤트를 catch하고 위임을 방지하려면 어떻게해야합니까? Java JLayer : 이벤트를 기본 요소로 삭제하는 것을 방지하는 방법

은 사전에 감사를 표하는 MouseEvent 또는 KeyEvent을 수신 구성 요소를 찾기 위해 상위/하위 계층 구조를 검색합니다

dbausnnd

답변

0

스윙.

따라서 하단 레이어에 MouseListenerKeyListener을 추가해야합니다.

예를 들어, 이것은 Disable Glass Pane에서 사용 된 접근법입니다.

1

나는 "바쁜 표시 애니메이션 'http://docs.oracle.com/javase/tutorial/uiswing/misc/jlayer.html에서 예를 데리고 오버라이드 몇 가지 방법을 :의 processMouseEvent와의 processMouseEvent를 조건부 e.consume()와 함께, 그리고 물론

jlayer.setLayerEventMask(
        AWTEvent.MOUSE_EVENT_MASK | 
          AWTEvent.MOUSE_MOTION_EVENT_MASK 
      ); 


class WaitLayerUI extends LayerUI<JPanel> implements ActionListener 
{ 
     private boolean mIsRunning; 
     private boolean mIsFadingOut; 
     private Timer mTimer; 

     private int mAngle; 
     private int mFadeCount; 
     private int mFadeLimit = 15; 

     @Override 
     public void installUI(JComponent c) { 
      super.installUI(c); 
      JLayer jlayer = (JLayer)c; 
      jlayer.setLayerEventMask(
        AWTEvent.MOUSE_EVENT_MASK | 
          AWTEvent.MOUSE_MOTION_EVENT_MASK 
      ); 
     } 

     @Override 
     public void uninstallUI(JComponent c) { 
      JLayer jlayer = (JLayer)c; 
      jlayer.setLayerEventMask(0); 
      super.uninstallUI(c); 
     } 

     @Override 
     protected void processMouseEvent(MouseEvent e, JLayer l) { 
      System.out.println("mouse event"); 
      if (mIsRunning) 
      { 
       e.consume(); 
      } 
     } 

     @Override 
     protected void processMouseMotionEvent(MouseEvent e, JLayer l) { 
      System.out.println("mouse motion event"); 
      if (mIsRunning) 
      { 
       e.consume(); 
      } 
     } 

     @Override 
     public void paint(Graphics g, JComponent c) 
     { 
      Graphics2D g2 = (Graphics2D)g.create(); 

      try 
      { 
       int w = c.getWidth(); 
       int h = c.getHeight(); 

       // Paint the view. 
       super.paint(g, c); 

       if (!mIsRunning) 
       { 
        return; 
       } 


       float fade = (float)mFadeCount/(float)mFadeLimit; 

       // Gray it out. 
       Composite urComposite = g2.getComposite(); 
       g2.setComposite(AlphaComposite.getInstance(
         AlphaComposite.SRC_OVER, .5f * fade)); 
       g2.fillRect(0, 0, w, h); 
       g2.setComposite(urComposite); 

       // Paint the wait indicator. 
       int s = Math.min(w, h)/10; 
       int cx = w/2; 
       int cy = h/2; 
       g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
         RenderingHints.VALUE_ANTIALIAS_ON); 
       g2.setStroke(
         new BasicStroke(s/4, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); 
       g2.setPaint(Color.white); 
       g2.rotate(Math.PI * mAngle/180, cx, cy); 
       for (int i = 0; i < 12; i++) 
       { 
        float scale = (11.0f - (float)i)/11.0f; 
        g2.drawLine(cx + s, cy, cx + s * 2, cy); 
        g2.rotate(-Math.PI/6, cx, cy); 
        g2.setComposite(AlphaComposite.getInstance(
          AlphaComposite.SRC_OVER, scale * fade)); 
       } 
      } 
      catch (Exception ex) { 
       mIsRunning = false; 
      } 
      finally 
      { 
       g2.dispose(); 
      } 
     } 

     public void actionPerformed(ActionEvent e) 
     { 
      if (mIsRunning) 
      { 
       firePropertyChange("tick", 0, 1); 
       mAngle += 3; 
       if (mAngle >= 360) 
       { 
        mAngle = 0; 
       } 
       if (mIsFadingOut) 
       { 
        if (--mFadeCount == 0) 
        { 
         mIsRunning = false; 
         mTimer.stop(); 
        } 
       } 
       else if (mFadeCount < mFadeLimit) 
       { 
        mFadeCount++; 
       } 
      } 
     } 

     public void start() 
     { 
      if (mIsRunning) 
      { 
       return; 
      } 

      // Run a thread for animation. 
      mIsRunning = true; 
      mIsFadingOut = false; 
      mFadeCount = 0; 
      int fps = 24; 
      int tick = 1000/fps; 
      mTimer = new Timer(tick, this); 
      mTimer.start(); 
     } 

     public void stop() 
     { 
      mIsFadingOut = true; 
     } 

     @Override 
     public void applyPropertyChange(PropertyChangeEvent pce, JLayer l) 
     { 
      if ("tick".equals(pce.getPropertyName())) 
      { 
       l.repaint(); 
      } 
     } 
}