动画使用的JFrame多个JComponent上 [英] animation with multiple jComponents using jframe

查看:174
本文介绍了动画使用的JFrame多个JComponent上的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我遇到麻烦的动画在我的花园网格面板的顶部可见。无论我最后补充到contentPane一个节目。反正是有在同一时间,以显示多个组件。我试着开关类动画和花园电网扩展JPanel,但没有奏效。动画是一系列显示一个字符,当你用鼠标拖动运动图像。我需要一个字符在花园网格面板的顶部移动。任何帮助吗?

 包装查看;
进口java.awt.BorderLayout中;
进口java.awt.Color中;
进口java.awt.Container中;
进口java.awt.GridBagLayout中;
进口java.awt.Panel;进口javax.swing.JFrame中;
进口javax.swing.JLayeredPane中;
公共类驱动器{
公共静态无效的主要(字串[] args){    JFrame的帧=新的JFrame();
   JLayeredPane的窗格=新的JLayeredPane();
   frame.add(面板);   动画动画=新的动画();
   GardenPanel花园=新GardenPanel(6,4,600,800);
   pane.add(动画,新整型(1));   pane.add(园,新的整数(0));
    frame.setSize(800,600);
    的System.out.println(pane.highestLayer()); //只是为了检查我没有隐藏层    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(真);    而(真){
        frame.repaint();
        尝试{
            视频下载(100);
        }赶上(InterruptedException的E){
            e.printStackTrace();
        }
    }

}

}

--------动画类-----------

您应该会看到一个移动的兽人。你可以使用鼠标拖动兽人。如果preSS
 *你的鼠标没有移动它,功率会增加。
 *
 * /

 包装查看;进口java.awt.Color中;
进口java.awt.Graphics;
进口java.awt.Image中;
进口java.awt.event.MouseEvent中;
进口java.awt.event.MouseListener;
进口java.awt.event.MouseMotionListener;
进口java.awt.image.BufferedImage中;
进口的java.io.File;
进口java.io.IOException异常;
进口javax.imageio.ImageIO中;
进口javax.swing.ImageIcon中;
进口javax.swing.JComponent中;
进口javax.swing.JFrame中;
进口javax.swing.JLayeredPane中;
进口javax.swing.JPanel中;公共类动画扩展JComponent的实现的MouseMotionListener,MouseListener的{
    最终诠释frameCount = 10;
    INT picNum = 0;
    BufferedImage的[] []图片;
    INT XLOC = 0;
    INT yloc = 0;
    最终诠释xIncr = 8;
    最终诠释yIncr = 2;
    最终静态INT frameWidth = 900;
    最终静态INT frameHeight = 600;
    最终静态INT imgWidth = 165;
    最终静态INT imgHeight = 165;
    //有关兽人基本信息    的BufferedImage seedImage;
    INT mouseX;
    INT mouseY的;
    INT seedX = XLOC;
    诠释邋遢= yloc;
    布尔mouseholding;
    布尔移动= FALSE;
    INT权力;
    公共枚举阶段{
        MOVE,电源
    }
    S期;    //通过图像阵列中重写此JPanel的paint方法循环和绘制图像
    公共无效漆(图形G){
        picNum =(picNum + 1)%frameCount;
        如果(mouseholding&放大器;&放大器;(S == s.POWER)){
            的System.out.println(功率++);
        }
        g.drawImage(图片[0] [picNum],XLOC,yloc,Color.gray,本);
        g.drawImage(seedImage,seedX,破旧,imgWidth / 8,imgHeight / 8,本);
    }
    //构造函数:得到阵列图像,段和存储
    公共动画(){
        seedImage =的createImage();
        BufferedImage的[] IMG = createAnimation();
        图片=新的BufferedImage [img.length] [10];
        对于(INT J = 0; J< img.length; J ++){
            的for(int i = 0; I< frameCount;我++)
                图片[J] [i] = IMG [J] .getSubimage(imgWidth * I,O,imgWidth,imgHeight);
        }
        addMouseMotionListener(本);
        addMouseListener将(本);
    }    //从文件,并返回读取的图像
    私人BufferedImage的[] createAnimation(){
        BufferedImage的[] = BufferedImage的新BufferedImage的[4];
        尝试{
            BufferedImage的[0] = ImageIO.read(新文件(图像/ orc_forward_southeast.png));
            BufferedImage的[1] = ImageIO.read(新文件(图像/ orc_forward_southwest.png));
            BufferedImage的[2] = ImageIO.read(新文件(图像/ orc_forward_northeast.png));
            BufferedImage的[3] = ImageIO.read(新文件(图像/ orc_forward_northwest.png));
            返回的BufferedImage;
        }赶上(IOException异常五){
            e.printStackTrace();
        }
        返回null;
    }    私人的BufferedImage的createImage(){
        的BufferedImage BufferedImage的;
        尝试{
            的BufferedImage = ImageIO.read(新文件(图像/ seed.png));
            返回的BufferedImage;
        }赶上(IOException异常五){
            e.printStackTrace();
        }
        返回null;        // TODO:更改此方法,以便您可以加载其他兽人动画位图
    }    //实现的MouseListener和MouseMotionListener和接口中的方法
    @覆盖
    公共无效的mouseDragged(事件的MouseEvent){
        mouseX = event.getX();
        mouseY的= event.getY();
        如果((XLOC&下; mouseX)及及(XLOC + imgWidth> mouseX)及及(yloc&下; mouseY的)及及(yloc + imgHeight> mouseY的)及&放大器;(S == stage.MOVE )){            //System.out.println(\"Imagecoor:(\"+xloc+,+ yloc +)+mousecoor :(+ mouseX +,+ mouseY的+));
            //你可以打印,如果你想坐标
            XLOC = mouseX-imgWidth / 2;
            yloc = mouseY的-imgHeight / 2;
            seedX = mouseX;
            邋遢= mouseY的;
        }
    } // draging图像
    @覆盖
    公共无效的mouseMoved(的MouseEvent为arg0){
    }
    @覆盖
    公共无效的mouseClicked(的MouseEvent E){
    }
    @覆盖
    公共无效的mouseEntered(的MouseEvent E){
    }
    @覆盖
    公共无效的mouseExited(的MouseEvent E){
    }    //对于增加功率。
    @覆盖
    公共无效鼠标pressed(事件的MouseEvent){
        mouseholding = TRUE;
        mouseX = event.getX();
        mouseY的= event.getY();
        如果((XLOC == mouseX-imgWidth / 2)及及(yloc == mouseY的-imgHeight / 2)){
            S = stage.POWER;
        }
    }
    @覆盖
    公共无效的mouseReleased(事件的MouseEvent){
        mouseholding = FALSE;
        S = stage.MOVE;
        功率= 0;
    }
}

-------- GardenPanel类------------
应显示2黑线

 包装查看;进口java.awt.Graphics;进口javax.swing.JComponent中;
进口javax.swing.JLayeredPane中;
进口javax.swing.JPanel中;公共类GardenPanel扩展JComponent的{
    私人诠释numOfRows;
    私人诠释numOfColumns;
    私人诠释frameWidth;
    私人诠释frameHeight;    公共GardenPanel(INT numOfRows,诠释numOfColumns,诠释frameHeight,诠释frameWidth){
        this.numOfRows = numOfRows;
        this.numOfColumns = numOfColumns;
        this.frameHeight = frameHeight;
        this.frameWidth = frameWidth;
    }
    INT secondX =((frameWidth - ((frameWidth / 3)* 2))/ 4)* 3;    @覆盖
    公共无效漆(图形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) ;    }}


解决方案

您说明:


  

我遇到麻烦的动画在我的花园网格面板的顶部可见。无论我最后补充到contentPane一个节目。


一个JFrame的contentPane的使用BorderLayout的,这就是BorderLayouts如何工作。如果您在默认情况下添加组件(没有一个int 2参数),它在默认情况下在BorderLayout.CENTER位置放置,并涵盖任何加到pviously有$ P $。您将要阅读的Swing布局管理器教程在此了解更多详情。


  

反正是有同时显示多个组件。


是,使用不同的布局管理器和组件。如果你想在彼此顶部组件,可以考虑使用的JLayeredPane。


  

我已经尝试切换动画类和花园电网扩展JPanel,但没有奏效。动画是一系列显示一个字符,当你用鼠标拖动运动图像。我需要一个字符在花园网格面板的顶部移动。任何帮助吗?


不知道您的具体问题是在这里。

I am having trouble getting the animation visible on top of my garden grid panel. Whichever I add last to the contentpane that one shows. is there anyway to show multiple components at the same time. I've tried switching the classes animation and garden grid to extend jpanel but nothing has worked. Animation is a series of images that shows a character moving when you are dragging it with a mouse. I need that character to move on top of the garden grid panel. any help?

  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();
        }
    }

}

}

--------Animation Class-----------

you should see a moving orc. you can drag the orc using your mouse. If you press * your mouse without moving it, the power will increase. * */

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------------ should display 2 black lines

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);



    }

}

解决方案

You state:

I am having trouble getting the animation visible on top of my garden grid panel. Whichever I add last to the contentpane that one shows.

A JFrame's contentPane uses BorderLayout, and that's how BorderLayouts work. If you add a component by default (without an int 2nd parameter), it is placed by default in the BorderLayout.CENTER position and covers anything added there previously. You will want to read the Swing layout manager tutorial for more details on this.

is there anyway to show multiple components at the same time.

Yes, use different layout managers and components. If you want components on top of each other, consider using a JLayeredPane.

I've tried switching the classes animation and garden grid to extend jpanel but nothing has worked. Animation is a series of images that shows a character moving when you are dragging it with a mouse. I need that character to move on top of the garden grid panel. any help?

Not sure what your exact question is here.

这篇关于动画使用的JFrame多个JComponent上的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆