Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将移动对象添加到JFrame_Java_Swing_Graphic - Fatal编程技术网

Java 将移动对象添加到JFrame

Java 将移动对象添加到JFrame,java,swing,graphic,Java,Swing,Graphic,我正在创建一个java游戏。游戏中有一个英雄和一个泡泡。当我按下箭头键时,英雄应该移动,泡泡应该有连续的对角线运动。当我分别将英雄或气泡添加到JFrame中时,我得到了所需的行为,但当我将它们都添加到JFrame中时,我只得到了一个非常小的正方形!我试图将它们添加到相同的JPanel中,然后将JPanel添加到JFrame中,但它不起作用。可能我必须为JPanels定义某种类型的布局 我做错了什么 代码: public class Pang { public static void main(S

我正在创建一个java游戏。游戏中有一个英雄和一个泡泡。当我按下箭头键时,英雄应该移动,泡泡应该有连续的对角线运动。当我分别将英雄或气泡添加到
JFrame
中时,我得到了所需的行为,但当我将它们都添加到JFrame中时,我只得到了一个非常小的正方形!我试图将它们添加到相同的
JPanel
中,然后将
JPanel
添加到
JFrame
中,但它不起作用。可能我必须为
JPanel
s定义某种类型的布局

我做错了什么

代码:

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

    JFrame f=new JFrame();
    JPanel gamePanel=new JPanel();
    gamePanel.setPreferredSize(new Dimension(800, 600));


    DrawHero d=new DrawHero();
    DrawBubble bubble=new DrawBubble();

    gamePanel.add(d);
    gamePanel.add(bubble);

    f.add(gamePanel);

    f.setVisible(true);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setSize(800, 600);
}
}


public class DrawHero extends JPanel implements ActionListener, KeyListener {
    Timer myTimer = new Timer(5, this);
    int x = 0, y = 0, dx = 0, dy = 0, step = 10;
    private transient Image imageHero = null;

    public DrawHero() {
        myTimer.start();
        addKeyListener(this);
        setFocusable(true);
        setFocusTraversalKeysEnabled(false);

    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;

        imageHero = getHeroImage();

        g2.drawImage(imageHero, x, y, 40, 40, null);

    }

    public Image getHeroImage() {
        Image image = null;

        image = getImage("hero.png");
        return image;
    }

    public Image getImage(String path) {
        Image tempImage = null;
        try {
            URL heroiURL = DrawHero.class.getResource(path);
            tempImage = Toolkit.getDefaultToolkit().getImage(heroiURL);
        } catch (Exception e) {
            System.out.println("Error loading hero image! - "
                    + e.getMessage());
        }
        return tempImage;
    }

    public void actionPerformed(ActionEvent e) {

        repaint();
    }

    public void moveUp() {

        y = y - step;

    }

    public void moveDown() {
        y = y + step;

    }

    public void moveLeft() {

        x = x - step;

    }

    public void moveRight() {
        x = x + step;

    }

    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();
        if (keyCode == KeyEvent.VK_UP) {
            moveUp();
        }
        if (keyCode == KeyEvent.VK_DOWN) {
            moveDown();
        }
        if (keyCode == KeyEvent.VK_LEFT) {
            moveLeft();
        }
        if (keyCode == KeyEvent.VK_RIGHT) {
            moveRight();
        }
    }

    public void keyTyped(KeyEvent e) {
    }

    public void keyReleased(KeyEvent e) {
    }
}


public class DrawBubble extends JPanel implements ActionListener, KeyListener {
    Timer myTimer = new Timer(5, this);
    int x = 100, y = 200, dx = 0, dy = 0, step = 10;
    private transient Image imageHero = null;

    public DrawBubble() {
        myTimer.start();
        addKeyListener(this);
        setFocusable(true);
        setFocusTraversalKeysEnabled(false);

    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.fill(new Ellipse2D.Double(x, y, 40, 40));


    }


    public void actionPerformed(ActionEvent e) {

         x=x+dx;
         y=y+dy;
        repaint();
    }

    public void moveBubble() {
         dy=2;
         dx=2;
    }



    public void keyPressed(KeyEvent e) {
        moveBubble();

    }

    public void keyTyped(KeyEvent e) {
    }

    public void keyReleased(KeyEvent e) {
    }
}
当我将英雄或气泡分别直接添加到JFrame中时,我得到了所需的行为,但当我将它们都添加到JFrame中时,我只得到了一个非常小的正方形

JFrame的默认布局管理器是BorderLayout。如果使用“添加”(零部件)而不使用约束,零部件将转到中心。只能将一个零部件添加到中心,因此仅显示最后添加的零部件

我试图将它们添加到同一个JPanel中,然后将该JPanel添加到JFrame中,但它不起作用

JPanel的默认布局管理器是FlowLayout,它考虑组件的首选大小。问题是您没有重写
getPreferredSize()
方法,因此大小为(0,0),并且没有要绘制的内容

可能我必须为JPanel定义某种类型的布局

实际上,由于需要随机运动,因此需要在面板上使用空布局,然后使用组件的
setSize()
setLocation()
方法来定位组件


然后,当您执行此操作时,自定义绘制应始终在(0,0)而不是(x,y)处进行,因为位置将控制组件在面板上绘制的位置。

我建议
DrawHero
DrawBubble
(应分别称为
Hero
Bubble
)应该扩展任何
JComponent
。相反,每个人应该只知道如何在请求时将自己绘制到传递给它的
图形
对象

然后,单个
游戏场
PlayingArea
类应保留对所有
气泡
对象和
英雄
的引用,并调用这些对象的
绘制(图形)
方法

使用这种方法,不必担心
游戏场
组件中的布局(它们变得无关紧要)

这是我在[]中渲染静止对象的基本策略


谢谢,这是一个比我想做的更简单的解决方案!