Не вижу ни одного компонента в JFrame

#java #jframe

#java #jframe

Вопрос:

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

public class Box {
    public static void main(String[] args){
        BoxFrame frame = new BoxFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

class BoxFrame extends JFrame{
    public BoxFrame(){
        setTitle("BoxGame");
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
        DrawComponent[] component = new DrawComponent[4];
        component[0] = new DrawComponent(0, 0, 20, 20);
        component[1] = new DrawComponent(400, 0, 20, 20);

        add(component[0]);
        add(component[1]);//here the problem is
    }
    public static final int DEFAULT_WIDTH = 600;
    public static final int DEFAULT_HEIGHT = 400;
}

class DrawComponent extends JComponent{
    private double left;
    private double top;
    private double width;
    private double height;
    public DrawComponent(double l, double t, double w, double h){
        left = l;
        top = t;
        width = w;
        height = h;
    }
    public void paintComponent(Graphics g){
        Graphics2D g2 = (Graphics2D) g;
        Rectangle2D rect = new Rectangle2D.Double(left, top, width, height);
        g2.draw(rect);
        g2.setPaint(Color.BLUE);
        g2.fill(rect);
    }
}
  

вот мой код, он не сложный. но когда я пытаюсь нарисовать два компонента, в окне отображается только один. этот фрагмент кода, когда я избавляюсь от первого компонента, в окне отображается второй. и я просмотрел метод JFrame.add в javadocs, но не нашел, в чем ошибка, пожалуйста, помогите мне

Ответ №1:

Проблема в том, что вы используете менеджер компоновки по умолчанию JFrame , который является a BorderLayout . Когда вы add создадите свой второй компонент, он заменит первый. (Оба добавляются в CENTER ячейку.)

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

В противном случае я бы посоветовал вам нарисовать все поля для одного и того же компонента.