Как поменять JPanel на действие в JPanel - PullRequest
3 голосов
/ 09 апреля 2020

Я новичок (я sh) в Java Swing, но мне не удалось найти элегантное решение моей проблемы, поэтому я решил поднять вопрос здесь.

Я пытаюсь изменить текущую JPanel на другую JPanel на основе события нажатия кнопки из текущей JPanel. По сути, просто скрывая одну панель и отображая другую. Я чувствую, что это может быть сделано в моем классе MainFrame, однако я не уверен, как сообщить об этом обратно. Ничто из того, что я пытаюсь сделать, кажется, не работает так, как хотелось бы. Спасибо

Приложение. java

public static void main(final String[] args) {
    MainFrame mf = new MainFrame();
}

MainFrame. java

public class MainFrame extends JFrame {

    public MainFrame(){
        setTitle("Swing Application");
        setSize(1200, 800);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setVisible(true);

        // First Page Frame switch
        getContentPane().add(new FirstPage());

    }
}

FirstPage. java

public class FirstPage extends JPanel {

    public FirstPage() {
        setVisible(true);
        JButton clickBtn = new JButton("Click");
        clickBtn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent actionEvent) {
                // Change to SecondPage JPanel here.
            }
        });
        add(clickBtn);
    }
}

SecondPage . java

public class SecondPage extends JPanel {

    public SecondPage() {
        setVisible(true);
        add(new JLabel("Welcome to the Second Page"));

    }
}

Любая дополнительная информация, пожалуйста, спросите спасибо:)

Ответы [ 2 ]

4 голосов
/ 09 апреля 2020

Я думаю, что лучше всего использовать CardLayout . Создан для таких случаев. Посмотрите мой пример:

public class MainFrame extends JFrame {
    private CardLayout cardLayout;

    public MainFrame() {
        super("frame");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        cardLayout = new CardLayout();
        getContentPane().setLayout(cardLayout);

        getContentPane().add(new FirstPage(this::showPage), Pages.FIRST_PAGE);
        getContentPane().add(new SecondPage(this::showPage), Pages.SECOND_PAGE);

        setLocationByPlatform(true);
        pack();
    }

    public void showPage(String pageName) {
        cardLayout.show(getContentPane(), pageName);
    }

    public static interface PageContainer {
        void showPage(String pageName);
    }

    public static interface Pages {
        String FIRST_PAGE = "first_page";
        String SECOND_PAGE = "second_page";
    }

    public static class FirstPage extends JPanel {
        public FirstPage(PageContainer pageContainer) {
            super(new FlowLayout());

            JButton button = new JButton("next Page");
            button.addActionListener(e -> pageContainer.showPage(Pages.SECOND_PAGE));
            add(button);
        }
    }

    public static class SecondPage extends JPanel {
        public SecondPage(PageContainer pageContainer) {
            super(new FlowLayout());

            add(new JLabel("This is second page."));

            JButton button = new JButton("Go to first page");
            button.addActionListener(e -> pageContainer.showPage(Pages.FIRST_PAGE));
            add(button);
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new MainFrame().setVisible(true));
    }
}
3 голосов
/ 09 апреля 2020

CardLayout - правильный инструмент для работы. Вы можете просто создать ActionListener, используемый для обмена страницами в классе JFrame, и передать ссылку на него в FirstPage:

import java.awt.CardLayout;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class MainFrame extends JFrame {

    public MainFrame(){
        setTitle("Swing Application");
        setSize(1200, 800);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setLocationByPlatform(true);

        //Create card layout and set it to the content pane 
        CardLayout cLayout = new  CardLayout();
        setLayout(cLayout);

        //create and add second page to the content pane 
        JPanel secondPage = new SecondPage();
        add("SECOND",secondPage);

        //create an action listener to swap pages 
        ActionListener listener = actionEvent ->{
            cLayout.show(getContentPane(), "SECOND");
        };

        //use the action listener in FirstPage
        JPanel firstPage = new FirstPage(listener);
        add("FIRST", firstPage);
        cLayout.show(getContentPane(), "FIRST");
        setVisible(true);
    }

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

class FirstPage extends JPanel {

    public FirstPage(ActionListener listener) {
        JButton clickBtn = new JButton("Click");
        clickBtn.addActionListener(listener);
        add(clickBtn);
    }
}

class SecondPage extends JPanel {
    public SecondPage() {
        add(new JLabel("Welcome to the Second Page"));
    }
}
...