Как изменить панели CardLayout с отдельной панели?

1

Мой макет программного обеспечения - это своего рода волшебная база. Таким образом, базовая панель разделена на два JPanel. Одна левая панель, которая никогда не изменяется. И одна правая панель, которая работает с CardLayout. Он имеет множество подпанелей и показывает каждый из них методом.

Я могу легко перейти от одной внутренней панели к другой. Но я хочу иметь кнопку в левой панели и менять панели с правой стороны.

Вот пример кода, который вы можете запустить:

БАЗА:

public class Base {
        JFrame frame = new JFrame("Panel");
        BorderLayout bl = new BorderLayout();

    public Base(){
        frame.setLayout(bl);
        frame.setSize(800, 600);
        frame.add(new LeftBar(), BorderLayout.WEST);
        frame.add(new MainPanel(), BorderLayout.CENTER);

        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {
        // TODO code application logic here
        new Base();
    }
}

Левая сторона

public class LeftBar extends JPanel{
    JButton button;
    MainPanel mainPanel = new MainPanel();

    public LeftBar(){
        setPreferredSize(new Dimension(200, 40));
        setLayout(new BorderLayout());
        setBackground(Color.black);

        button = new JButton("Show Second Page");
        button.addActionListener(new ActionListener(){
           @Override
           public void actionPerformed(ActionEvent ae) {
               mainPanel.showPanel("secondPage");
           }

       });

       add(button, BorderLayout.NORTH);
    }
}

Правая сторона

public class MainPanel extends JPanel {
    private CardLayout cl = new CardLayout();
    private JPanel panelHolder = new JPanel(cl);

    public MainPanel(){
        FirstPage firstPage = new FirstPage(this);
        SecondPage secondPage = new SecondPage(this);

        setLayout(new GridLayout(0,1));

        panelHolder.add(firstPage, "firstPage");
        panelHolder.add(secondPage, "secondPage");

        cl.show(panelHolder, "firstPage");
        add(panelHolder);

    }
    public void showPanel(String panelIdentifier){
        cl.show(panelHolder, panelIdentifier);
    }
}

Внутренние панели для правой стороны:

public class FirstPage extends JPanel {
    MainPanel mainPanel;
    JButton button;

    public FirstPage(MainPanel mainPanel) {
       this.mainPanel = mainPanel;
       setBackground(Color.GRAY);

       button = new JButton("Show page");
       button.addActionListener(new ActionListener(){
           @Override
           public void actionPerformed(ActionEvent ae) {
               mainPanel.showPanel("secondPage");
           }

       });

       add(button);
    }
}



public class SecondPage extends JPanel{
    MainPanel mainPanel;
    JButton button;
    public SecondPage(MainPanel mainPanel){
       this.mainPanel = mainPanel;
        setBackground(Color.white);
       add(new JLabel("This is second page"));
    }
}

И это картина, чтобы дать вам идею: Изображение 174551

Как я объяснил, я могу перейти с первой страницы на "вторую страницу" с помощью этого метода: mainPanel.showPanel("secondPage"); или mainPanel.showPanel("firstPage"); ,

Но у меня также есть JButton в левой панели, который я называю тем же методом, чтобы показать вторую панель CardLayout. Но это не работает. Однако он не дает никакой ошибки.

Любая идея, как изменить эти панели CardLayout за пределами панелей?

Теги:
oop
swing
layout-manager
cardlayout

1 ответ

4
Лучший ответ

Проблема в том, что у LeftBar есть mainPanel который инициализируется новым экземпляром MainPanel. Таким образом, у вас есть два экземпляра MainPanel, один из которых выделен в Base и добавлен в кадр, а другой - в LeftBar.

Таким образом, LeftBar выполняет mainPanel.showPanel("secondPage"); на втором экземпляре MainPanel который даже не является частью визуальной иерархии. Чтобы исправить это, просто передайте существующий экземпляр MainPanel конструктору LeftBar. Вы уже делаете это в FirstPage и SecondPage.

  • 1
    Огромное спасибо. Это сработало.
  • 0
    @ Не за что! :)
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню