不能将两个项目绘制到Jframe



我不能为jframe绘制两个项目(将会有更多(,即我试图制作景观,但是绘制的物品最后覆盖了任何东西。

主:

import javax.swing.*;
import java.awt.*;

public class TheComponets extends JComponent {


    public static void main(String[] args){
        JFrame frame = new JFrame();
                frame.setSize(600, 600);
        frame.setTitle("A house on the water!");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        House home = new House();
        Sun sun = new Sun();
        frame.setLayout(new GridLayout(2,3));
        frame.add(home);
        frame.add(sun);

    }


}

房屋课:

import javax.swing.*;
import java.awt.*;
import java.applet.*;
// Program to draw a house
public class House extends JComponent
{
    public void paintComponent(Graphics g)
    {
        // Draw the roof
        g.setColor(Color.red);
        int xs[] = {100,160,220};
        int ys[] = {100,50,100};
        Polygon poly=new Polygon(xs,ys,3);
        g.fillPolygon(poly);
        // Draw the body of house
        g.setColor(Color.blue);
        g.fillRect(100,100,120,120);
        // draw the door
        g.setColor(Color.orange);
        g.fillRect(145,160,30,60);

    }
}

太阳课:

import javax.swing.*;
import java.awt.*;
public class Sun extends JComponent {
    public void paintComponent(Graphics g)
    {
        // draw sun
        g.setColor(Color.yellow);
        g.fillOval(500, 0, 50, 50);
    }
}

我希望房子和太阳出现在Jframe中,但到目前为止,它只会显示最后一个frame.add((对象。我只编程了两个月,对摇摆和awt不了解。回答时请记住这一点。

的原因是,默认情况下, JFrame使用borderlayout。当您没有任何约束的情况下,frame.add(component)时,组件将添加到BorderLayout.CENTER位置。因此,无论您将在没有约束的情况下添加多少个组件,BorderLayout都会覆盖较早的旧组件,因为所有这些组件都被添加到CENTER中。

解决方案要么选择要添加要添加组件的位置:

frame.add(home,BorderLayout.CENTER);
frame.add(sun,BorderLayout.LINE_START);

要么更改容器的布局(在您的情况下是Jframe(:

frame.setLayout(new FlowLayout());
frame.add(home);
frame.add(sun);

值得阅读:布局经理的视觉指南

最后,请勿@Override paint()方法。@Override paintComponent()方法。

当您使用单个面板进行自定义绘画时,您的绘画将在2D中完成,因为组件根据所用的布局管理器放置在2D空间中。

我试图建立景观,

然后将所有您的自定义绘画放在单个类中。

首先,您绘制背景。然后,您将阳光粉刷,然后是房子等。

您现在将完全控制绘制项目的顺序。

要在jframe上添加多个组件,需要从布局管理器设置布局。它可以是flowlayout,gridlayout或borderlayout ....

在您的情况下,它仅添加了最后一个组件,仅是因为Jframe的默认布局是Boderlayout,并且可以添加组件

frame.add(home,borderlayout.line_start(;

您有page_start,page_end,line_start,line_end,中心位置添加组件。因此,将第二个组件添加到其他位置,或使用

更改框架的布局

frame.setlayout(new Flowlayout(((;

最新更新