2013-10-29 4 views
0

내 정원 격자 패널 위에 애니메이션을 표시하는 데 문제가 있습니다. 어느 것이 든 내가 보여주는 내용 창에 마지막으로 추가하십시오. 어쨌든 동시에 여러 구성 요소를 표시 할 수 있습니까? japanel을 확장하기 위해 클래스 애니메이션과 정원 그리드를 전환 해 보았지만 아무 것도 효과가 없었습니다. 애니메이션은 마우스로 드래그 할 때 캐릭터가 움직이는 것을 보여주는 일련의 이미지입니다. 그 성격이 정원 격자 패널 위로 이동해야합니다. 어떤 도움?jframe을 사용하는 여러 jComponents가있는 애니메이션

package view; 
import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Container; 
import java.awt.GridBagLayout; 
import java.awt.Panel; 

import javax.swing.JFrame; 
import javax.swing.JLayeredPane; 


public class Driver { 
public static void main(String[] args) { 

    JFrame frame = new JFrame(); 
    JLayeredPane pane = new JLayeredPane(); 
    frame.add(pane); 

    Animation animation = new Animation(); 
    GardenPanel garden = new GardenPanel(6,4,600,800); 


    pane.add(animation,new Integer(1)); 

    pane.add(garden, new Integer(0)); 
    frame.setSize(800, 600); 


    System.out.println(pane.highestLayer());// just to check I dont have hidden layers 







    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 

    while(true){ 
     frame.repaint(); 
     try { 
      Thread.sleep(100); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

}

}

-------- 애니메이션 클래스 -----------

당신은 움직이는 오크를 볼 수 있습니다. 마우스를 사용하여 오크를 드래그 할 수 있습니다. 이동하지 않고 * 마우스를 누르면 전원이 증가합니다. * */

package view; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLayeredPane; 
import javax.swing.JPanel; 

public class Animation extends JComponent implements MouseMotionListener, MouseListener{ 
    final int frameCount = 10; 
    int picNum = 0; 
    BufferedImage[][] pics; 
    int xloc = 0; 
    int yloc = 0; 
    final int xIncr = 8; 
    final int yIncr = 2; 
    final static int frameWidth = 900; 
    final static int frameHeight = 600; 
    final static int imgWidth = 165; 
    final static int imgHeight = 165; 
    //basic info about the orc 

    BufferedImage seedImage; 
    int mouseX; 
    int mouseY; 
    int seedX = xloc; 
    int seedY = yloc; 
    boolean mouseholding; 
    boolean moving = false; 
    int power; 
    public enum stage { 
     MOVE, POWER 
    } 
    stage s; 

    //Override this JPanel's paint method to cycle through picture array and draw images 
    public void paint(Graphics g) { 
     picNum = (picNum + 1) % frameCount; 
     if(mouseholding && (s == s.POWER)){ 
      System.out.println(power++); 
     } 


     g.drawImage(pics[0][picNum], xloc, yloc, Color.gray, this); 
     g.drawImage(seedImage, seedX, seedY, imgWidth/8, imgHeight/8, this); 
    } 


    //Constructor: get image, segment and store in array 
    public Animation(){ 
     seedImage = createImage(); 
     BufferedImage[] img = createAnimation(); 
     pics = new BufferedImage[img.length][10]; 
     for(int j = 0; j < img.length; j++){ 
      for(int i = 0; i < frameCount; i++) 
       pics[j][i] = img[j].getSubimage(imgWidth*i, 0, imgWidth, imgHeight); 
     } 
     addMouseMotionListener(this); 
     addMouseListener(this); 
    } 

    //Read image from file and return 
    private BufferedImage[] createAnimation(){ 
     BufferedImage[] bufferedImage = new BufferedImage[4]; 
     try { 
      bufferedImage[0] = ImageIO.read(new File("images/orc_forward_southeast.png")); 
      bufferedImage[1] = ImageIO.read(new File("images/orc_forward_southwest.png")); 
      bufferedImage[2] = ImageIO.read(new File("images/orc_forward_northeast.png")); 
      bufferedImage[3] = ImageIO.read(new File("images/orc_forward_northwest.png")); 
      return bufferedImage; 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    private BufferedImage createImage(){ 
     BufferedImage bufferedImage; 
     try { 
      bufferedImage = ImageIO.read(new File("images/seed.png")); 
      return bufferedImage; 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 

     // TODO: Change this method so you can load other orc animation bitmaps 
    } 

    // implement the method in mouseListener and mouseMotionListener interface 
    @Override 
    public void mouseDragged(MouseEvent event) { 
     mouseX = event.getX(); 
     mouseY = event.getY(); 
     if((xloc<mouseX) && (xloc+imgWidth >mouseX) && (yloc<mouseY) && (yloc+imgHeight>mouseY) && (s==stage.MOVE)){ 

      //System.out.println("Imagecoor:("+xloc+", "+yloc+")"+" mousecoor:("+mouseX+","+mouseY+")"); 
      // you can print the coordinate if you want  
      xloc = mouseX-imgWidth/2; 
      yloc = mouseY-imgHeight/2; 
      seedX = mouseX; 
      seedY = mouseY; 
     } 
    } // draging the image 
    @Override 
    public void mouseMoved(MouseEvent arg0) { 
    } 
    @Override 
    public void mouseClicked(MouseEvent e) { 
    } 
    @Override 
    public void mouseEntered(MouseEvent e) {  
    } 
    @Override 
    public void mouseExited(MouseEvent e) { 
    } 

    // for increasing the power. 
    @Override 
    public void mousePressed(MouseEvent event) { 
     mouseholding = true; 
     mouseX = event.getX(); 
     mouseY = event.getY(); 
     if((xloc == mouseX-imgWidth/2) && (yloc == mouseY-imgHeight/2)){ 
      s = stage.POWER; 
     } 
    } 
    @Override 
    public void mouseReleased(MouseEvent event) { 
     mouseholding = false; 
     s = stage.MOVE; 
     power = 0; 
    } 
} 

-------- GardenPanel 클래스 ------------ 2 개 블랙 라인

를 표시해야합니다
package view; 

import java.awt.Graphics; 

import javax.swing.JComponent; 
import javax.swing.JLayeredPane; 
import javax.swing.JPanel; 

public class GardenPanel extends JComponent { 
    private int numOfRows; 
    private int numOfColumns; 
    private int frameWidth; 
    private int frameHeight; 

    public GardenPanel(int numOfRows, int numOfColumns, int frameHeight, int frameWidth){ 
     this.numOfRows = numOfRows; 
     this.numOfColumns = numOfColumns; 
     this.frameHeight = frameHeight; 
     this.frameWidth = frameWidth; 


    } 
    int secondX = ((frameWidth -((frameWidth/3) *2))/4) * 3; 

    @Override 
    public void paint(Graphics g){ 
     g.drawLine((frameWidth/3) * 2, (frameHeight/4) * 3, (frameWidth/3 * 2) - 30, frameHeight/4); 

     g.drawLine(((frameWidth/3) * 2) + 200, (frameHeight/4) * 3, ((frameWidth -((frameWidth/3) *2)/4) * 3) - 30, frameHeight/4); 



    } 

} 
+0

'Animation'과'GardenPanel' 클래스는 어떻게 생겼습니까? –

+0

Idk 당신의 프로젝트는 무엇입니까 그러나 스윙처럼이 상황에 대한 API가 아닐 수도 있습니다 ... –

답변

2

당신의 상태 :

내 정원 격자 패널 위에 애니메이션을 표시하는 데 문제가 있습니다. 어느 것이 든 내가 보여주는 내용 창에 마지막으로 추가하십시오.

JFrame의 contentPane은 BorderLayout을 사용하므로 BorderLayouts의 작동 방식입니다. 기본적으로 (int 두 번째 매개 변수없이) 구성 요소를 추가하면 기본적으로 BorderLayout.CENTER 위치에 배치되며 이전에 추가 된 항목을 모두 포함합니다. 이에 대한 자세한 내용은 Swing 레이아웃 관리자 자습서를 읽으십시오.

어쨌든 여러 구성 요소를 동시에 표시 할 수 있습니다.

예, 다른 레이아웃 관리자 및 구성 요소를 사용하십시오. 컴퍼넌트가 서로 겹치도록 (듯이)하려면, JLayeredPane의 사용을 고려해주세요.

japanel을 확장하기 위해 클래스 애니메이션과 정원 격자를 전환 해 보았지만 아무 것도 효과가 없었습니다. 애니메이션은 마우스로 드래그 할 때 캐릭터가 움직이는 것을 보여주는 일련의 이미지입니다. 그 성격이 정원 격자 패널 위로 이동해야합니다. 어떤 도움?

정확한 질문은 여기에 있습니다.

1

애니메이션을 가든 패널 위에 두는 방법은 두 가지가 있습니다. 그러나 "Hovercraft Full of Eels"에서 지적한 것처럼 "GridBagLayout"을 사용하는 방법에 문제가 있습니다.

애니메이션을 사용하여 작업 할 때 결석 위치 지정을 사용하는 경향이 있습니다. 이렇게하면 구성 요소의 정확한 위치를 수동으로 지정하기가 쉽고 모든 것이 표시되도록 할 수 있습니다. jLayeredPane/jPanel을 jFrame에 추가하고 jFrame 대신 컴포넌트를 추가하여이 작업을 수행합니다.

다음은 GardenPanel 위에 애니메이션을 배치 할 수있는 두 가지 방법입니다.

1) 다른 결과를 위해 구성 요소를 다른 순서로 추가하십시오. 시도 해봐.

일단 모든 구성 요소가 "의 ContentPane"당신은 당신이 정상에 할 구성 요소의 z 순서를 설정할 수 있습니다, 이런 일에 추가 된

2) :

//Create this object first so we can set the Z-Order later 
Animation animation = new Animation() 
frame.getContentPane().add(animation); //use object above, not a "new" Animation 
frame.getContentPane().add(new GardenPanel(6,4,600,800)); 
//Do something like this after all other components have been added to the ContentPane. 
frame.getContentPane().setComponentZOrder(animation, 0); 

편집 : 에서 당신이 보았던 것은 기본을 가지고 있다는 것을 보여주었습니다. 그래서 여기에 당신이하고 싶은 것을 보여줄 수 있다고 믿는 편집 가능한 자급 한 예제가 있습니다.

animation은 빨간색 상자로 표시되고 GardenPanel은 파란색 영역으로 표시됩니다.

참고 :

  1. 나는 pane에 구성 요소를 추가 한 순서입니다. 우선 : pane.add(animation); 다음 : pane.add(GardenPanel);.
  2. 내가 대신 사용자 정의 Animation 구성 요소의 JLabel하고 대신 GardenPanel 구성 요소의 JLayeredPane를 사용하여 매우 간단한 예제를 유지, 당신은 단지 그들을 모두 밖으로을 교환 할 수 있어야한다.
  3. 적어도 테스트하는 동안 Drive 클래스에서 while 루프를 제거하십시오. 두 구성 요소가 올바르게 표시되면 나중에 다시 칠 문제를 해결할 수 있습니다. 당신이 가능 비슷한 경로를 따라 원래의 코드를 적용 할 수 예제 코드를 사용

    import java.awt.Point; 
    import javax.swing.JFrame; 
    import javax.swing.JLayeredPane; 
    import javax.swing.JLabel; 
    
    public class Driver 
    { 
    //components 
    static JFrame frame = new JFrame(); 
    static JLayeredPane pane = new JLayeredPane(); 
    static JLabel animation = new JLabel(); 
    static JLayeredPane GardenPanel = new JLayeredPane(); 
    
    //variables 
    static Point startPos = new Point(0, 0); 
    static Point draggedPos = new Point(0, 0); 
    
    public static void main(String[] args) 
    { 
    //setup components 
    frame.setSize(800, 600); 
    pane.setSize(frame.getSize()); 
        pane.setBackground(java.awt.Color.GRAY); 
        pane.setOpaque(true); 
    
    animation.setSize(100, 150); 
    animation.setLocation((pane.getWidth() - animation.getWidth())/2, (pane.getHeight() - animation.getHeight())/2); 
    animation.setOpaque(true); 
    animation.setBackground(java.awt.Color.RED); 
    animation.addMouseListener(new java.awt.event.MouseAdapter() 
    { 
        @Override 
        public void mousePressed(java.awt.event.MouseEvent evt) 
        { 
        startPos = evt.getLocationOnScreen(); 
        } 
    }); 
    animation.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() 
    { 
        @Override 
        public void mouseDragged(java.awt.event.MouseEvent evt) 
        { 
        draggedPos = evt.getLocationOnScreen(); 
        animation.setLocation(animation.getX() + (draggedPos.x - startPos.x), animation.getY() + (draggedPos.y - startPos.y)); 
        startPos = evt.getLocationOnScreen(); 
        } 
    }); 
    
    GardenPanel.setSize(800, 600); 
    GardenPanel.setLocation(0, 0); 
    GardenPanel.setOpaque(true); 
    GardenPanel.setBackground(java.awt.Color.BLUE); 
    
    //add components 
    frame.add(pane); 
    //The order of the following will get the desired results, I do not specify Z-Order, I simply add the top component first 
    pane.add(animation); 
    pane.add(GardenPanel); 
    
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
    } 
    

    }

.

+0

나는 이것을 시도했지만 여전히 빈 프레임을 얻습니다. 지금까지 가지고있는 코드를 포함하도록 연산을 업데이트했습니다. 나는 당신의 충고를 따라 프레임에 jlayeredpane을 추가하고 layeredpane에 컴포넌트를 추가했지만 여전히 운이 없다. – user2510809

+0

1) 업데이트 된 코드에서 'GardenPanel'은 여전히 ​​애니메이션 위에 있습니다. Z 순서에서 0의 구성 요소는 항상 맨 위 구성 요소가 될 것이고, 'pane.add (garden); pane.add (애니메이션, 0);'. 2) 'Animation'및 'GardenPanel'수업에 대한 코드를 포함시켜주십시오. 그렇지 않으면 포인터를 제대로 제공 할 수 없습니다. 3)이 수업은 어떻게 사용/시작됩니까? 나는 'Thread.sleep'메쏘드가 스레드를 잠그고 응답하지 않을 것이기 때문에 이것을 묻습니다. – sorifiend

+0

나는 당신의 제안을 시도했지만 여전히 운이 없다. 나는 애니메이션과 gardenpanel 수업을 포함했다. 나는 애니메이션 수업이 길다는 것을 알고있다. 그래서 내가 왜 원래 그것을 포함시키지 않았는가. 나중에 쓰레드 코드를 고치 겠지만 지금은 두 컴포넌트를 모두 jframe에 표시하는 것에 중점을두고 있습니다. – user2510809

관련 문제