2014-01-14 2 views
0

저는 스윙과 자바 스윙을 이용한 인터페이스 디자인에 익숙하지 않습니다. 저는 버튼 클릭으로 서랍을 슬라이딩하여 서랍을 꺼내주세요. 첫째, 그렇게 할 수 있습니까? 그렇다면 어떻게해야합니까? 고맙습니다. 특정 방법 정보에 대한 응답으로 감사하겠습니다.자바 스윙을 이용한 서랍 슬라이드 애니메이션

+0

당신이 대략 당신이 이미 가지고있는 우리에게 보여 주시겠습니까 ... 이러한 사실은 사용자의 요구에 meeet 수있는 Sliding-Layout로, 유니버설 트윈 엔진을 사용하지했지만, 진짜 좋은 사례를 보았다 요컨대? 너의 "서랍"은 지금 뭐야? 레이아웃에 'null'이있는 'Container'에 일부 JPanel이 추가 되었습니까? – ccjmne

+0

방금 ​​캔버스가 있습니다 ... 버튼을 추가하는 방법을 알고 버튼을 클릭하면 새 창을 팝업하는 방법을 알지만 애니메이션을 수행하는 방법을 모르겠습니다. – nitinsh99

답변

2

을 한 경우에 StackOverflow을하거나 검색 - 당신이 그것에 대해 너무 많이 알고하지 않으면 Lesson: Concurrency in Swing를 읽을 수 이루다.

기본적인 방법은 단순히 graphics 그리고 이것은 단순히 예를 들어, 무승부의 크기에 기지 역할을 할 변수를 업데이트 할 수 있도록 할 Timer

스윙을 ... 그릴 것

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class DrawerPaneTest { 

    public static void main(String[] args) { 
     new DrawerPaneTest(); 
    } 

    public DrawerPaneTest() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new DrawerPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class DrawerPane extends JPanel { 

     private boolean drawIn = false; 
     private Timer timer; 
     private int drawWidth = 0; 
     private int drawDelta = 4; 

     public DrawerPane() { 
      addMouseListener(new MouseAdapter() { 
       @Override 
       public void mouseClicked(MouseEvent e) { 
        timer.stop(); 
        drawIn = !drawIn; 
        drawDelta = drawIn ? 4 : -4; 
        timer.start(); 
       } 
      }); 

      timer = new Timer(40, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        drawWidth += drawDelta; 
        if (drawWidth >= getWidth()/2) { 
         drawWidth = getWidth()/2; 
         timer.stop(); 
        } else if (drawWidth < 0) { 
         drawWidth = 0; 
         timer.stop(); 
        } 
        repaint(); 
       } 
      }); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.setColor(Color.RED); 
      g2d.drawFill(0, 0, drawWidth, getHeight()); 
      g2d.dispose(); 
     } 
    } 

} 

이것은 기본적으로 느려지거나 느린 개념을 고려하지 않습니다.사람들을 위해, 당신은 더 나은, 전용 애니메이션 프레임 워크를 보면 당신은 당신이 달성하고자하는 무엇에 따라 사용할 수 있습니다

Universal Tween Engine

  • Trident
  • Timing Framework
    • 싶습니다, 저는 개인적으로 Timing Framework를 좋아합니다. 대부분 Trident가 크기 나 위치와 같은 객체의 속성을 변경하는 기능을 제공하기 위해 설계된 자유를 제공하기 때문입니다. Timing Framework는 이러한 일을 할 수 있지만 그 점을 이해하려면 더 많은 작업이 필요합니다.

      나는

  • 1

    우선, Canvas을 사용하지 않아야한다고 생각합니다. IMO, Swing의 구성 요소를 AWT와 섞어서는 안되기 때문에 (실제 구성 요소에 관해 GUI - Swing이 AWT 위에 구축되었음을 알고 있습니다.)

    대신 JPanel을 사용하고 paintComponent 메서드를 사용하여 사용자 정의 페인팅을 수행 할 수 있습니다. 이에 대한 많은 자습서가 있습니다 (예 : Lesson: Performing Custom Painting).

    JPanel (단순히 그림을 Graphics2D으로 사용)에서 서랍을 그리는 방법을 알았 으면 애니메이션을 적용하는 것이 좋습니다. 기본적으로 속성 중 일부는 업데이트해야합니다. ..
    좋은 여유 효과와 모든 것을 쉽게 처리하고 포장하고 싶으십니까? Universal Tween Engine을 살펴볼 것을 권합니다. 나는 이미 그것을 사용했고 그걸로 당신을 도울 수있었습니다. 당신이 당신의 유니버설 트윈 엔진 라이브러리 프로젝트에 연결이되면

    는, 단순히 다음과 같은 몇 가지 호출을 사용 :

    Tween 
        .to(drawerProperties, Type.POSITION, 10.0f) // animate the POSITION property of your drawerProperties on 10.0 units of time 
        .target(100) // set the number of frames of that animation to 
        .ease(Quad.OUT) // set a nice quadratic effect on the animation 
        .start(tweenManager); // launch the animation 
    

    을 그리고, 다른 곳에서, 당신은 단지 Thread가 지속적으로 TweenManager를 업데이트하는 것이 실행이 필요합니다 TweenManager#update을 사용하십시오.

    다시 한번, 그것은 많은 작업처럼 보이지만 실제로는 매우 쉽게 쓸 수 있으며 유니버설 트윈 엔진 섹션은 매우 좋은 시작. 또한 프로젝트에 실제로 애니메이션을 추가하려면이 도구를 사용하는 것이 좋습니다.

    마지막 요점 : 스윙의 이벤트 발송 스레드의 속성을 업데이트해야 할 수도 있습니다. 귀하의 솔루션이 얼마나 정확하게 구현 될 것입니다. 특정 질문 : 당신이 원하는 당신이에 따라 얻을 수있는 가능한 방법은 여러 가지가있다

    관련 문제