2

我是java新手。我确实有一个 java 类,但我想继续前进。我很喜欢!这是我的问题。我正在尝试绘制游戏所需的两个桨。我确实为它们创建了 2 个对象,它们都“显示”,但会发生以下情况:

主要赛跑者

import javax.swing.JFrame;


public class PongRunner {

    public static void main (String[] args)
    {

        new PongRunner();
    }

    public PongRunner()
    {
        JFrame PongFrame= new JFrame();
        PongFrame.setSize(800,600);
        PongFrame.add(new PaddleB());
        PongFrame.add(new PaddleA());
        PongFrame.setLocationRelativeTo(null);
        PongFrame.setTitle("My Pong Game");
        PongFrame.setResizable(false);
        PongFrame.setVisible(true);
        PongFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

}

PaddleA并且PaddleB都是drawRect Graphics并绘制一个特定的矩形。

我告诉JFrame首先添加的图形是唯一可见的。它下面的那个没有被添加到框架中我想知道为什么,以及如何将两个桨画在同一个JFrame... 2天。一些帮助会很好。我刚开始学习java,我认为我正在取得进步。一些技巧也很好,谢谢:),特别是actionListener因为我将不得不使用它们来移动桨!

两个桨的源代码:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JPanel;
import javax.swing.Timer;

public class PaddleA extends JPanel implements ActionListener
{
    private Timer timer;

    public void timer()
    {
        timer = new Timer(25, this);
        timer.start();

    }

public void actionPerformed(ActionEvent e)
{
    repaint();
}

public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    g.setColor(Color.RED);
    g.fillRect(70,200,20,100);      
}
}

桨B:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JPanel;
import javax.swing.Timer;

public class PaddleB extends JPanel implements ActionListener
{

private Timer timer;

    public void timer()
    {
        timer = new Timer(25, this);
        timer.start();

    }

    public void actionPerformed(ActionEvent e)
    {
        repaint();
    }


    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.setColor(Color.BLUE);
        g.fillRect(500, 200, 20, 100);

    }

}
4

5 回答 5

3

这是因为您添加了第一个桨,然后在第一个桨上添加了第二个桨,从而替换了它们:

    PongFrame.add(new PaddleB());
    PongFrame.add(new PaddleA());

在这里尝试使用LayoutManagers 只是一个快速示例:

    PongFrame.getContentPane().add(new PaddleB(),BorderLayout.WEST);
    PongFrame.getContentPane().add(new PaddleA(),BorderLayout.EAST);

g.fillRect(...);的 x 和 y 坐标也太大JFrame,因此不会显示。像这样改变它:

    g.fillRect(0,0, 20, 100);

虽然不相关:

  • 不要JFrame.add()使用JFrame.getContentPane().add()

更新:

正如其他人提到的那样,游戏的逻辑有点不对劲。您应该有一个单独的绘图面板,它添加到s 中,JFrame并且所有绘图都是在单个JPanelusing Graphics 而不是JPanels 上完成的。这是一个小例子:

在此处输入图像描述

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class PongRunner {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new PongRunner();
            }
        });
    }

    public PongRunner() {
        JFrame PongFrame = new JFrame();
        PongFrame.setTitle("My Pong Game");
        PongFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        PongFrame.setResizable(false);
        PongFrame.setSize(400,400);
        //PongFrame.setLocationRelativeTo(null);
        PongFrame.getContentPane().add(new DrawingPanel());
        PongFrame.setVisible(true);
    }
}

class DrawingPanel extends JPanel {

    Rect rect1, rect2;

    public DrawingPanel() {
        super(true);
        rect1 = new Rect(80, 80, 20, 100, Color.yellow);
        rect2 = new Rect(100, 200, 20, 100, Color.red);

    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(rect1.getColor());
        g.fillRect(rect1.getX(), rect1.getY(), rect1.getWidth(), rect1.getHeight());
        g.setColor(rect2.getColor());
        g.fillRect(rect2.getX(), rect2.getY(), rect2.getWidth(), rect2.getHeight());
    }
}

class Rect {

    private Color color;
    private int x, y, height, width;

    Rect(int x, int y, int width, int height, Color color) {
        this.x = x;
        this.y = y;
        this.height = height;
        this.width = width;
        this.color = color;
    }

    public Color getColor() {
        return color;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    public int getWidth() {
        return width;
    }

    public int getHeight() {
        return height;
    }

    public Rectangle getBounds() {
        return new Rectangle(x, y, width, height);
    }
}

请注意,此片段并不完美,仅演示了绘制矩形以形成某种游戏所需的陈规定型逻辑

于 2012-09-28T21:50:14.480 回答
3

由于您已将 2 个 paddle 添加到BorderLayout.CENTERmain 的同一位置,因此PongFrame只会显示第二个 paddle。

这种类型的绘画更容易在一个Graphics对象上使用一个对象来完成JComponent

于 2012-09-28T21:29:38.147 回答
3

Swing 组件并不是真正设计成这样使用的。您的每个桨 JPanel 都试图绘制一个矩形,但容器(JFrame)及其布局管理器将控制 JPanel 的大小和位置。所以他们绘制的矩形可能超出了他们的界限,根本不会出现。

如果您像这样一个接一个地添加它们,某些布局管理器将仅显示其中一个 JPanel - 请参阅Reimus的回答。

要制作这样的动画图形,您可能需要从填充 JFrame 的单个 JComponent(例如 JPanel)开始,并将两个桨画为矩形。

于 2012-09-28T21:32:51.640 回答
0

我没有时间尝试运行您的代码,但尝试设置“桨”对象的大小和位置,或者将它们设置为不透明。我相信 Swing 试图通过不绘制完全被另一个不透明组件覆盖的组件来加速渲染。出于这个原因,它可能不会画出你的一个桨。

如果您确实设置了桨的大小和位置,您可能需要修改您的paintComponent方法:如果我的记忆是正确的,我认为Graphics传入的对象被剪辑到组件的区域,所以 0,0 将是组件的左上角。

于 2012-09-28T21:28:37.057 回答
0

您不应该JFrame通过该JFrame#add(Component)方法将您的 JPanel 添加到您的。最好将它们添加到 contentPane:frame.getContentPane().add(panel);尽管您应该阅读有关LayoutManager的信息。他们可以通过在框架中定位组件来帮助您,或者如果您使用不正确,它们会搞砸。

于 2012-09-28T21:29:17.413 回答