无法将两个项目绘制到Jframe

时间:2019-05-02 15:51:05

标签: java swing jframe awt graphics2d

我无法在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()对象。我只编程了两个月,对Swing和awt并不了解。回答时,请记住这一点。

3 个答案:

答案 0 :(得分:1)

其原因在于,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);

值得阅读:A Visual Guide to Layout Managers

最后,请不要使用@Override paint()方法。改为使用@Override paintComponent()方法。

答案 1 :(得分:0)

要在JFrame上添加多个组件,需要从布局管理器设置布局。它可以是FlowLayout或Gridlayout或BorderLayout。...

在您的情况下,仅由于JFrame的默认布局是BoderLayout并可以添加组件,所以仅添加Last组件

frame.add(home,BorderLayout.LINE_START);

您具有PAGE_START,PAGE_END,LINE_START,LINE_END和CENTER位置以添加组件。因此,将第二个组件添加到其他位置或使用更改框架的布局

frame.setLayout(new FlowLayout());

答案 2 :(得分:0)

当您使用单独的面板进行自定义绘画时,由于组件是根据所使用的布局管理器放置在2D空间中的,因此绘画将以2D进行。

  

我正在尝试制作风景,

然后将所有自定义绘画都放在一个类中。

首先,您要绘制背景。然后画太阳,然后画房子等。

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