Кнопки не отображаются в JPanel

У меня масса проблем с выяснением, почему кнопки в этом не отображаются? Они появлялись ранее сегодня, когда я тестировал программу, но теперь я застрял на 2 часа, пытаясь заставить кнопки снова появиться. Это также очень странно, потому что панель определенно появляется, потому что появляется фраза «Добро пожаловать в BookListApp».

    public BookListUI() {
        textPrompt.setText("Welcome to the BookListApp, fellow bookworm. Start storing your books immediately!");
        textPrompt.setBounds(WIDTH / 2 - 300, 50,500,100);
        frame = new JFrame();
        panel = new JPanel();

        panel.setLayout(null);
        panel.setSize(WIDTH, HEIGHT);
        panel.add(textPrompt);
        addButtons();
        frame.setSize(WIDTH, HEIGHT);
        frame.add(panel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setTitle("BookList Application");
        frame.setVisible(true);

    }

    public void addButtons() {
        panel.add(new JButton("Finished books"));
        panel.add(new JButton("Favorite books"));
        panel.add(new JButton("Search by genre"));
        panel.add(new JButton("Save all your books!"));
        panel.add(new JButton("Load your BookList Application"));
        panel.add(new JButton("Exit application"));
    }


    public static void main(String[] args) {
        new BookListUI();
    }

Проблемы начинаются здесь: panel.setLayout(null);. Исправьте это с помощью макетов, прежде чем тратить свое время или просить нас тратить свое.

Andrew Thompson 18.03.2022 06:29

Общие советы: 1) [Правки], чтобы добавить минимальный воспроизводимый пример. 2) Предоставьте иллюстрацию ASCII или простой рисунок того, как ожидается, что графический интерфейс будет выглядеть как при размере по умолчанию, так и при увеличении. 3) panel.setSize(WIDTH, HEIGHT); .. frame.setSize(WIDTH, HEIGHT); Лучшее, что можно сказать об этом, это то, что размер панели будет игнорироваться. Один или оба размера неверны, так как панель не может быть больше, чем рамка, которая ее отображает. Лучше pack() рамку подбирать по размеру к отображаемому контенту. Если графический интерфейс использует макеты, этот размер будет предложен автоматически. 4) textPrompt плохо назван. ..

Andrew Thompson 18.03.2022 06:36

.. generalInfo было бы точнее. 5) addButtons() — рассмотрите возможность добавления их (или соответствующих Action элементов) в JToolBar вместо этого.

Andrew Thompson 18.03.2022 06:37
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
41
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вы используете абсолютный макет (panel.setLayout(null);), вам нужно указать границы кнопок, которые будут видны:

button.setBounds(200, 200, 300, 30);

Хотя это и не является «неправильным», это очень плохой способ компоновки графического интерфейса пользователя, который приведет ко многим проблемам и снизит удобство сопровождения кода. Пока вы не поймете, насколько плохой совет для кросс-платформенных графических интерфейсов, пожалуйста, воздержитесь от дальнейших советов.

Andrew Thompson 18.03.2022 06:39

Да, но он/она спросил, почему кнопки не видны, не спрашивая совета по расположению.

Santiago Medina 18.03.2022 06:43
"Да, но.." См. Является ли «Не делай этого» правильным ответом? Возможно, если бы ваш ответ начался, "это одновременно и одна из возможностей, и худший способ сделать это". Я мог бы проголосовать за, а не против.
Andrew Thompson 18.03.2022 06:50
Ответ принят как подходящий

Используйте один или несколько подходящих менеджеров компоновки. Дополнительные сведения см. в статье Размещение компонентов внутри контейнера .

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

public class BookListUI {

    JLabel textPrompt = new JLabel("Welcome to the BookListApp, fellow bookworm. Start storing your books immediately!", JLabel.CENTER);

    public BookListUI() {
        JFrame frame = new JFrame();

        JPanel contentPane = new JPanel(new BorderLayout());
        contentPane.setBorder(new EmptyBorder(32, 32, 32, 32));
        frame.setContentPane(contentPane);

        frame.add(textPrompt, BorderLayout.NORTH);
        JPanel menuPane = new JPanel(new GridLayout(-1, 1));
        menuPane.setBorder(new EmptyBorder(32, 32, 0, 32));
        addButtons(menuPane);
        frame.add(menuPane);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setTitle("BookList Application");
        frame.setVisible(true);

    }

    public void addButtons(Container container) {
        container.add(new JButton("Finished books"));
        container.add(new JButton("Favorite books"));
        container.add(new JButton("Search by genre"));
        container.add(new JButton("Save all your books!"));
        container.add(new JButton("Load your BookList Application"));
        container.add(new JButton("Exit application"));
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new BookListUI();
            }
        });
    }
}

Другие вопросы по теме