Внешний JPanle не отображается в JFrame

Я делаю университетский проект. Проект представляет собой одноэлементное свинг-приложение. У меня есть мейнфрейм, где я пытаюсь каждый раз обновлять мэйнфрейм новой внешней панелью, когда пользователь нажимает на другую вкладку меню. Проблема в том, что когда я загружаю внешнюю JPanel в мейнфрейме, ничего не отображается. Я также спрашиваю, правильный ли путь я выбрал. Спасибо!

Мейнфрейм.js

public class MainFrame extends JFrame {
JMenuBar menuBar;
JMenu homeshop, topCat, orders, login, register, exit;
ShopPanel shopPanel;
private OrderTrack orderTrack = new OrderTrack();

private void changePanel(JPanel panel) {
    getContentPane().removeAll();
    getContentPane().add(panel, BorderLayout.CENTER);
    getContentPane().doLayout();
    update(getGraphics());
}

private class MenuAction implements ActionListener {
    private JPanel panel;
    private MenuAction(JPanel pnl) {
        this.panel = pnl;
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        changePanel(panel);
    }
}
private void initMenu() {
    // Menu setup
    menuBar = new JMenuBar();
    //Items
    homeshop = new JMenu("Shop");
    menuBar.add(homeshop);

    topCat = new JMenu("Top Books");
    menuBar.add(topCat);

    orders = new JMenu("Orders");
    //orders.addActionListener(new MenuAction(orderTrack));
    menuBar.add(orders);

    login = new JMenu("Login");
    menuBar.add(login);

    register = new JMenu("Register");
    menuBar.add(register);

    setJMenuBar(menuBar);
}
public void initMainFrame () {
    // Frame setup
    setSize(400, 300);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    shopPanel = new ShopPanel();
    add(shopPanel);
    setVisible(true);
}
public MainFrame() {
    super("Welcome!");
    initMenu();
    initMainFrame();
}

}

ShopPanel.j

public class ShopPanel extends JPanel {
JPanel panel = new JPanel();
private JList<String> shopList;
private ArrayList<String> titleBooks;

public ShopPanel() {

    // QUERY //
    DBQuery bookTitle = new DBQuery();
    titleBooks = bookTitle.QueryOne("select title from book", "title");

    // GRIDBAG LAYOUT //
    panel.setLayout(new GridBagLayout());

    // label //
    JLabel lblInsertOrderId = new JLabel("Insert order ID");
    panel.add(lblInsertOrderId);

    // LIST OF BOOKS //
    shopList = new JList(titleBooks.toArray());
    shopList.setVisibleRowCount(6);
    shopList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    panel.add(shopList);
}

}

App.js

public class App {

public static void main (String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            new MainFrame();
        }
    }); 
}

}

Сообщение об ошибке отсутствует.

Почему вы закомментировали эту строку? orders.addActionListener(new MenuAction(orderTrack)); Если вы пытаетесь что-то выполнить при нажатии на пункт меню, вы, вероятно, должны как-то зарегистрировать действие.

Multicolaure 20.07.2019 17:17

Ваш класс ShopPanel создает 2 JPanels при создании: одна, переменная панели, в которую добавляются компоненты и которая является не отображается, а другая - сам класс, в который не добавляются компоненты и который добавляется в графический интерфейс. Решение: не создавайте 2 панели JPanel там, где нужна только одна

Hovercraft Full Of Eels 20.07.2019 17:37

@Multicolaure это было по ошибке :). Я раскомментировал его и все еще не работает. я оглядываюсь, чтобы увидеть, если я могу найти что-то. Спасибо за Ваш ответ! :).

alexco96 20.07.2019 17:50

@HovercraftFullOfEels Спасибо, это была проблема! :)

alexco96 20.07.2019 17:50

Пожалуйста, измените заголовок с JPanle на JPanel.

Janos Vinceller 28.07.2019 20:42
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
22
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сама ваша ShopPanel ЯВЛЯЕТСЯ JPanel. Нет необходимости иметь член JPanel и добавлять все к нему. Это не отображается, потому что оно не добавляется ко всему дереву компонентов. Попробуйте удалить "панель" и сделать все без нее, например: add() вместо panel.add(). Хотя не пробовал...

Ты очень много, это сработало! Могу ли я спросить вас, является ли это хорошей структурой для такого рода проекта? и почему, если я нажму Order в Jmenu, панель не переключается с OrderTrack?

alexco96 20.07.2019 17:38

создайте еще один вопрос для этого, пожалуйста, я сейчас занят

Janos Vinceller 20.07.2019 19:42

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