Я не могу нарисовать два элемента (их будет больше) в 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);


    }
}

Sun класс:

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. Пожалуйста, постарайтесь учесть это при ответе.

0
Mr.Pat 2 Май 2019 в 18:51

3 ответа

Лучший ответ

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

1
George Z. 2 Май 2019 в 15:57

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

я пытаюсь сделать пейзаж,

Тогда держите все свои заказные картины в одном классе.

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

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

0
camickr 2 Май 2019 в 16:15

Чтобы добавить несколько компонентов в 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 ());

0
Namrata Ajudiya 2 Май 2019 в 16:29