JPanel не будет отображать компоненты при нулевом макете
Я пытаюсь создать графический интерфейс, и я хочу разместить элементы в определенных местах. Я сделал макет моей панели нулевым, чтобы я мог сделать это. Тем не менее, ничего не появится, когда панель пуста.
Вот код:
public class OverView extends JFrame {
//height and width of screen
Toolkit tk = Toolkit.getDefaultToolkit();
int x = ((int) tk.getScreenSize().getWidth());//length of screen
int y = ((int) tk.getScreenSize().getHeight());//height
//components
private JLabel title;
private JLabel description;
private JPanel panel;
private ArrayList<JButton> farms;
//farm variables
public ArrayList<Farm> owned;
public OverView(ArrayList<Farm> owned) {
super("The Lolipop Farm - Overview");
setSize(700, 700);
setExtendedState(JFrame.MAXIMIZED_BOTH);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(null);
//initialize variables
this.owned = owned;
panel = new JPanel();
panel.setLayout(null);
title = new JLabel("<html>Your Farms - The Lolipop Farm"
+ "<br> <font size=1000> <i> An Eph Production </i> </font></html>");
//set background color, color, and font of JComponents
title.setFont(new Font("serif", Font.BOLD, 25));
title.setBackground(Color.GRAY);
title.setOpaque(true);
//set size and location of the components
title.setSize(350, 120);
title.setLocation(x / 2, 600);
//add to panel
panel.add(title);
//add panel to the screen
add(panel);
}
}
Почему на панели ничего не отображается, когда макет пуст?
2 ответа
Поскольку Overview - это Frame, я думаю, вы должны вызвать метод
setVisible(true);
в соответствии с https://docs.oracle.com/javase/tutorial/uiswing/layout/using.html, чтобы сделать его видимым. Теперь, если это не сработает, мне интересно, если вы создали экземпляр класса Overview где-то еще в вашем коде или в методе Main. Если нет, то нет объекта, который мог бы показать панель внутри вашего класса, поэтому ваша программа ничего не покажет.
Ваша проблема с кодом
setLayout(null);
Это установит макет JFrame в ноль, так как вы расширяете (наследуете его). У вас должен быть макет для JFrame, хотя вы можете обойтись без макета для JPanel. Просто удалите эту строку, и все будет хорошо.
РЕДАКТИРОВАТЬ: И, конечно, вам нужно вызвать setVisible(true), как сказал другой парень.