【问题标题】:Cant draw two items to Jframe无法将两个项目绘制到 Jframe
【发布时间】:2019-09-21 04:32:19
【问题描述】:

我无法在 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 了解不多。请在回答时尽量记住这一点。

【问题讨论】:

    标签: java swing jframe awt graphics2d


    【解决方案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

    最后,不要@Overridepaint()方法。 @Override paintComponent() 方法。

    【讨论】:

    • 我正在尝试使用 GridLayout,但现在我的 Jframe 根本没有弹出,我已经对上面的类进行了更改,以反映我根据您的回答所做的更改。知道为什么框架没有显示吗?
    • @Mr.Pat 你frame.setVisiblue(true);了吗?
    • 哎呀,太尴尬了。它在初始程序中,但我想我在进行更改时将其删除。它现在工作!非常感谢!!!
    【解决方案2】:

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

    我正在尝试制作风景,

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

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

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

    【讨论】:

    • 是的,这是有道理的。我想我在画一个风景,用户定义他们看到的东西,所以在一些地方会有一条带湖的船,而在另一些地方会有树木。你说得对,我只是没有解释清楚。
    【解决方案3】:

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

    在你的情况下,它添加Last组件只是因为JFrame的默认布局是BoderLayout并且可以添加组件

    frame.add(home, BorderLayout.LINE_START);

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

    frame.setLayout(new FlowLayout());

    【讨论】:

    • System.out.println(new JFrame("").getLayout().getClass()); 打印 class java.awt.BorderLayout
    猜你喜欢
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多