Не могу нарисовать два предмета в Jframe - PullRequest
0 голосов
/ 02 мая 2019

Я не могу нарисовать два элемента (их будет больше) в Jframe, я пытаюсь создать пейзаж, но нарисованный последний элемент перезаписывает что-либо перед ним.

Main:

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 ]

1 голос
/ 02 мая 2019

Причина этого в том, что 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() метод вместо.

0 голосов
/ 02 мая 2019

Когда вы используете отдельные панели для пользовательской раскраски, тогда ваша рисование будет выполнено в 2D, поскольку компоненты располагаются в двухмерном пространстве на основе используемого менеджера компоновки.

Я пытаюсь создать пейзаж,

Затем сохраните все свои пользовательские рисунки в одном классе.

Сначала вы рисуете фон.Затем вы рисуете солнце, затем дом и т. Д.

Теперь у вас есть полный контроль над порядком, в котором окрашиваются предметы.

0 голосов
/ 02 мая 2019

Чтобы добавить несколько компонентов в JFrame, необходимо установить макет из Менеджера макетов.это может быть FlowLayout или Gridlayout или BorderLayout ....

В вашем случае он добавляет последний компонент только потому, что макетом JFrame по умолчанию является BoderLayout и можно добавить компонент

frame.add (home, BorderLayout.LINE_START);

у вас есть PAGE_START, PAGE_END, LINE_START, LINE_END, CENTER для добавления компонента.поэтому добавьте второй компонент в другую позицию или измените расположение кадра, используя

frame.setLayout (new FlowLayout ());

...