0

我无法在我的花园网格面板上看到动画。无论我最后添加到那个显示的内容窗格中。无论如何要同时显示多个组件。我尝试切换类动画和花园网格以扩展 jpanel,但没有任何效果。动画是一系列图像,当您使用鼠标拖动角色时,它会显示角色移动。我需要那个角色在花园网格面板上移动。有什么帮助吗?

  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 Class------------应该显示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);



    }

}
4

2 回答 2

2

你说:

我无法在我的花园网格面板上看到动画。无论我最后添加到那个显示的内容窗格中。

JFrame 的 contentPane 使用 BorderLayout,这就是 BorderLayouts 的工作方式。如果您默认添加一个组件(没有 int 第二个参数),它默认放置在 BorderLayout.CENTER 位置并覆盖之前添加的任何内容。您将需要阅读 Swing 布局管理器教程以获取更多详细信息。

无论如何要同时显示多个组件。

是的,使用不同的布局管理器和组件。如果您希望组件相互叠加,请考虑使用 JLayeredPane。

我尝试切换类动画和花园网格以扩展 jpanel,但没有任何效果。动画是一系列图像,当您使用鼠标拖动角色时,它会显示角色移动。我需要那个角色在花园网格面板上移动。有什么帮助吗?

不确定您的确切问题是什么。

于 2013-10-29T01:56:16.170 回答
1

有两种方法可以使动画位于花园面板的顶部。然而,正如“充满鳗鱼的气垫船”所指出的那样,您如何使用“GridBagLayout”存在问题。

在处理动画时,我倾向于使用绝对定位,这样很容易手动指定组件的确切位置,并且可以确保所有内容都可见。我通过将 jLayeredPane/jPanel 添加到 jFrame 并向它们添加组件而不是 jFrame 来做到这一点。

这里有两种方法可以让动画位于 GardenPanel 的顶部。

1)以不同的顺序添加组件以获得不同的结果。试试看。

2) 将所有组件添加到“ContentPane”后,您可以设置所需组件的 Z-Order,如下所示:

//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. JLabel我通过使用 a而不是您的自定义Animation组件和 aJLayeredPane而不是您的组件来保持这个示例非常简单GardenPanel,您应该能够将它们都换掉。
  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);
    }
    

    }

使用此示例代码,您可以调整您的原始代码以遵循类似的路径。

于 2013-10-29T02:44:44.487 回答