gpt4 book ai didi

java - 组件未绘制在 Jpanel 之上

转载 作者:行者123 更新时间:2023-11-29 04:32:13 29 4
gpt4 key购买 nike

如果我直接在框架上绘画,它显示得很好,但船不会出现在面板顶部...

 package MoonBlast;

import java.awt.BorderLayout;

import java.awt.Dimension;

import javax.swing.JFrame;


public class Frame extends JFrame{

PlaySpace p;
Ship s;


public Frame(String title){

this.setTitle(title);
this.setSize(800, 800);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
p = new PlaySpace();
s = new Ship();
p.add(s);
this.add(p, BorderLayout.CENTER);
this.setVisible(true);

}

}

package MoonBlast;

import java.awt.Color;
import java.awt.Dimension;
import javax.swing.JPanel;

public class PlaySpace extends JPanel {



public PlaySpace(){
super();
this.setPreferredSize(new Dimension(800, 800));
this.setBackground(Color.BLACK);

}

}

package MoonBlast;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Polygon;
import javax.swing.JComponent;

public class Ship extends JComponent{

@Override
public void paintComponent(Graphics g){

super.paintComponent(g);
Polygon p = new Polygon();
p.addPoint(350, 750);
p.addPoint(450, 750);
p.addPoint(400, 700);
g.setColor(Color.YELLOW);
g.fillPolygon(p);


}


}

我唯一遗漏的类是 1 行查看器类。我已经尝试了所有我能想到的方法,还有一些人也看过它。提前致谢。

最佳答案

您需要覆盖 Ship 类的 getPreferredSize() 方法以返回组件的大小。每个 Swing 组件都有责任了解其首选大小,因为它是执行自定义绘制的组件。

but the ship will not show up on top of the panel...

您的 PlaySpace 类默认使用 FlowLayout,它尊重添加到其中的任何组件的首选大小。默认情况下,Ship 的首选大小为 (0, 0),因此没有可绘制的内容。

If I paint directly on the frame, it shows up fine

框架内容 Pane 的默认布局管理器是 BorderLayout。当您将组件添加到 BorderLayout 的 CENTER 时,布局会忽略组件的首选大小,只会让组件占据框架中的所有可用空间。

阅读 Layout Managers 上的 Swing 教程部分有关每个布局管理器的更多信息和工作示例。

关于java - 组件未绘制在 Jpanel 之上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43382920/

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