Java JPanels don';不要出现在杂志上

Java JPanels don';不要出现在杂志上,java,swing,graphics,jframe,jpanel,Java,Swing,Graphics,Jframe,Jpanel,我是java新手。我确实有一门java课程,但我想取得成功。我真的很喜欢!这是我的问题。我正试着划出比赛所需的两个桨。我确实为它们创建了两个对象,它们都“显示”,但发生了以下情况: 主流道 import javax.swing.JFrame; public class PongRunner { public static void main (String[] args) { new PongRunner(); } public Pong

我是java新手。我确实有一门java课程,但我想取得成功。我真的很喜欢!这是我的问题。我正试着划出比赛所需的两个桨。我确实为它们创建了两个对象,它们都“显示”,但发生了以下情况:

主流道

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

}
pailea
paileb
都是drawRect图形并绘制特定的矩形

我告诉
JFrame
首先添加的图形是唯一可见的图形。它下面的一个没有被添加到框架中,我想知道为什么,以及如何在同一个
JFrame
中画两个桨。。。我在读我的书,尽可能多地上网,但这两天没有运气。来点帮助就好了。我刚开始学习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);

    }

}

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


如果您确实设置了拨片的大小和位置,您可能必须修改
paintComponent
方法:如果我的记忆正确,我认为传入的
Graphics
对象会被剪裁到组件的区域,因此0,0将是组件的左上角。

您不应该通过
JFrame#add(component)
方法将JPanel添加到
JFrame
。最好将它们添加到contentPane:
frame.getContentPane().add(面板)您应该阅读有关s。它们可以帮助您将组件放置在框架中,或者在您使用不正确的组件时将其弄乱。

当您将两个挡板添加到相同的
边框布局中时。将主
边框的位置居中,只会显示第二个挡板


在一个
JComponent
上使用一个
Graphics
对象更容易完成这种类型的绘制。Swing组件并不是专门为这样使用而设计的。每个Padle JPanel都试图绘制一个矩形,但是容器(JFrame)及其布局管理器将控制JPanel的大小和位置。因此,他们绘制的矩形可能超出其边界,并且根本不会出现

一些布局管理器只会显示一个JPanel,如果你像这样一个接一个地添加它们-参见Reimus的答案


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

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

    PongFrame.add(new PaddleB());
    PongFrame.add(new PaddleA());
尝试使用
LayoutManager
s以下是一个快速示例:

    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()
UPADTE:

正如其他人提到的,这个游戏的逻辑有点不合理。您应该有一个添加到
JFrame
中的单个绘图面板,所有绘图都是使用
Graphic
s而不是
JPanel
s在单个
JPanel
上完成的。下面是一个小例子:

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


请注意,这段代码并不完美,它只是演示了绘制矩形以形成某种游戏所需的常规逻辑

你真的认为这是一个合适的标题吗?-1适合亲密选民。这个问题非常清楚,并且符合堆栈溢出问题的范围。+1是的,我同意“在一个JComponent上使用一个图形对象更容易完成这种类型的绘制”我尝试过了,谢谢!!!但我想让他们改变坐标,我怎么用BorderLayout.WEST来做呢?