gpt4 book ai didi

java - 自定义 JComponent 未添加到 JPanel

转载 作者:行者123 更新时间:2023-12-02 06:05:03 24 4
gpt4 key购买 nike

我对我认为非常简单的问题有点坚持。

我有一个自定义的 JComponent Ball,它只不过是一个简单的椭圆形。我正在尝试将球添加到 JPanel 中,我已将其设置为 JFrame 的默认内容 Pane (通过frame.setContentPane(mainPanel))。除了球之外,我还有 Paddle 类的另外两个组件,这是我创建的另一个自定义 JComponent。奇怪的是,桨可以添加得很好。

相关面板有意使用绝对布局来定位元素,因为这应该是 Pong 游戏的简单重现。

将球和两个 Racket 添加到 JPanel 后,我进行了一个简单的测试,发现返回的组件数组仅列出了两个: Racket 。添加所有这些并初始化 JPanel 和 JFrame 的完整代码如下:

public Pong()
{
frame = new JFrame("Pong");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

mainPanel = new JPanel(null);

mainPanel.setBackground(Color.black);
mainPanel.setPreferredSize(new Dimension(500, 500));

player = new Paddle(20, 100);
enemy = new Paddle(20, 100);
ball = new Ball(5, Color.GREEN);

mainPanel.add(player);
mainPanel.add(enemy);
mainPanel.add(ball);
enemy.setColor(Color.RED);

frame.setContentPane(mainPanel);
frame.pack();

Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
int x = screen.width/2 - frame.getWidth()/2;
int y = screen.height/2 - frame.getHeight()/2;
frame.setLocation(x, y);

mainPanel.addKeyListener(mc);

frame.setVisible(true);

mainPanel.repaint();

x = mainPanel.getWidth()/2 - ball.getWidth()/2;
y = mainPanel.getHeight()/2 - ball.getHeight()/2;
System.out.println("X: " + x + ", Y: " + y);
ball.setLocation(x, y);

x = 0;
y = mainPanel.getHeight()/2 - player.getHeight()/2;
System.out.println("X: " + x + ", Y: " + y);
player.setLocation(x, y);

x = mainPanel.getWidth() - enemy.getWidth();
y = mainPanel.getHeight()/2 - enemy.getHeight()/2;
System.out.println("X: " + x + ", Y: " + y);
enemy.setLocation(x, y);

System.out.println(Arrays.deepToString(mainPanel.getComponents()));

mainPanel.repaint();

frame.addMouseListener(new MouseAdapter()
{
@Override
public void mousePressed(MouseEvent e)
{
mainPanel.requestFocus();
}
});

dm.start();
mainPanel.requestFocus();
}

球的代码如下[注意:球是私有(private)的,因为它是类Pong的内部类,它不扩展任何东西]:

private class Ball extends JComponent
{
private int radius;
private Color color;

public Ball(int size, Color c)
{
if(size > 0)
radius = size;
else
radius = 1;
this.setPreferredSize(new Dimension(radius, radius));
color = c;
}

public Ball(int size)
{
this(size, Color.RED);
}

//Getters and Setters...

@Override
public void paintComponent(Graphics g)
{
System.out.println("Radius: " + radius);
g.setColor(color);
g.fillOval(0, 0, radius, radius);
}
}

这不是我第一次在处理项目时遇到这个问题,当我在 JPanel 上使用自定义 JComponent 和绝对定位时,它似乎总是会发生,尽管在其他项目中,我不这样做这似乎没有问题。这可能是我忽略的非常简单的事情,但我一生都想不出它是什么。对此的任何答案将不胜感激。

如果绝对必要,all the lines of code for this project can be found here (总共超过 300 行)。

预先感谢您的帮助!

最佳答案

当您使用空布局将组件添加到面板时,您需要负责设置组件的大小位置

如果您不设置大小,那么它将为零,因此没有任何内容可绘制。

关于java - 自定义 JComponent 未添加到 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22362625/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com