未在Jpanel顶部绘制的组件

时间:2017-04-13 03:12:41

标签: java swing jpanel paintcomponent

如果我直接在画框上画画,它显示正常,但船不会出现在画面顶部......

 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行观察者课程。我已经尝试了所有我能想到的东西,还有一些人也看过它。提前谢谢。

1 个答案:

答案 0 :(得分:3)

您需要覆盖getPreferredSize()类的Ship方法以返回组件的大小。每个Swing组件都负责知道它的首选大小,因为它是进行自定义绘制的组件。

  

但是这艘船不会出现在面板上......

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

  

如果我直接在画框上画画,它显示正常

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

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