如果我直接在画框上画画,它显示正常,但船不会出现在画面顶部......
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行观察者课程。我已经尝试了所有我能想到的东西,还有一些人也看过它。提前谢谢。
答案 0 :(得分:3)
您需要覆盖getPreferredSize()
类的Ship
方法以返回组件的大小。每个Swing组件都负责知道它的首选大小,因为它是进行自定义绘制的组件。
但是这艘船不会出现在面板上......
默认使用FlowLayout的PlaySpace
类尊重添加到其中的任何组件的首选大小。默认情况下,Ship
的首选大小为(0,0),因此无需绘制任何内容。
如果我直接在画框上画画,它显示正常
框架内容窗格的默认布局管理器是BorderLayout。将组件添加到BorderLayout的CENTER
时,布局会忽略组件的首选大小,只会使组件占用框架中的所有可用空间。
阅读Layout Managers上Swing教程中的部分,了解每个布局管理器的更多信息和工作示例。