【问题标题】:Component not being painted on top of Jpanel组件未绘制在 Jpanel 之上
【发布时间】:2023-03-21 22:36:02
【问题描述】:

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

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

【问题讨论】:

    标签: java swing jpanel paintcomponent


    【解决方案1】:

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

    但飞船不会出现在面板顶部...

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

    如果我直接在框架上绘画,它会显示得很好

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

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

    【讨论】:

    • 非常感谢...我已经知道了,但我仍然忽略了它的可能性。
    • @fishertrav,很高兴它有帮助。不要忘记通过单击复选标记“接受”答案,以便人们知道问题已解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 2012-06-19
    • 2021-04-14
    相关资源
    最近更新 更多