簡體   English   中英

如何通過另一個面板更改CardLayout的面板

[英]how to change a panel of CardLayout through another panel

在我的程序中,我有一個基於向導的布局。 由CardLayout實現。 因此,存在一組擴展JPanels的類。 我想在每個面板中都有按鈕以導航到其他面板。 例如,當程序顯示第一個面板時,我想要一個按鈕來顯示第二個面板。

我很累在主cardlayout面板支架中創建一個方法,因此任何其他類都可以通過此方法更改顯示面板,但是它不起作用並且出現stackoverflow錯誤。

這是我的課

基本框架:

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) {
        // TODO code application logic here
        new Base();
    }
}

包含子面板的主類:

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

    public MainPanel() {
        NewSession session = new NewSession();
        ChooseSource chooseSource = new ChooseSource();

        panelHolder.add(session, "Session");
        panelHolder.add(chooseSource, "ChooseSource");

        cl.show(panelHolder, "Session");
        add(panelHolder);
    }

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

子面板1

public class NewSession extends JPanel {
    MainPanel ob2 = new MainPanel();

    public NewSession(){
        JButton newSessionBTN = new JButton("Create A New Session");

        newSessionBTN.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e){
                System.out.println("HI");

                ob2.showPanel("ChooseSource");
            }
        });

        add(newSessionBTN);
    }
}

子面板2

public class ChooseSource extends JPanel {

    public ChooseSource(){
        JLabel showMe = new JLabel("Show Me");
        JButton back = new JButton("Back");
        //MainPanel ob = new MainPanel();

        back.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e){
                //ob.showPanel("start");
            }
        });

        add(back);
        add(showMe);
    }
}

如您所見,每個子面板中都有一個按鈕,單擊后這些按鈕必須顯示另一個面板。 稍后,他們還將數據從一個傳輸到另一個。

錯誤:

Exception in thread "main" java.lang.StackOverflowError
    at java.awt.Component.setFont(Component.java:1899)
    at java.awt.Container.setFont(Container.java:1748)
    at javax.swing.JComponent.setFont(JComponent.java:2751)
    at javax.swing.LookAndFeel.installColorsAndFont(LookAndFeel.java:208)
    at javax.swing.plaf.basic.BasicPanelUI.installDefaults(BasicPanelUI.java:66)
    at javax.swing.plaf.basic.BasicPanelUI.installUI(BasicPanelUI.java:56)
    at javax.swing.JComponent.setUI(JComponent.java:663)
    at javax.swing.JPanel.setUI(JPanel.java:153)
    at javax.swing.JPanel.updateUI(JPanel.java:126)
    at javax.swing.JPanel.<init>(JPanel.java:86)
    at javax.swing.JPanel.<init>(JPanel.java:109)
    at javax.swing.JPanel.<init>(JPanel.java:117)
    at InnerPanels.NewSession.<init>(NewSession.java:21)
    at StrongBaseLayout.MainPanel.<init>(MainPanel.java:22)

通過重復最后兩行,錯誤會比這更長。

我該如何運作?

另外,我還有一個想法是在頁面底部有一個下一個和上一個按鈕來切換面板。 但是不確定哪一個是最佳的。 任何想法?

每當您看到意外的StackOverflowError總會尋找無意遞歸的存在,實際上,這正是您要執行的操作,因為MainPanel創建了NewSession對象,然后創建了新的MainPanel對象,然后又創建了新的NewSession對象,然后再創建了一個新的MainPanel對象....無限重復執行或直到堆棧內存(因此堆棧溢出)用完為止。

這里:

public class NewSession extends JPanel {
    MainPanel ob2 = new MainPanel();  // *****

和這里:

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

    public MainPanel() {
        NewSession session = new NewSession();  // *****

不要那樣做 而是要小心地創建每個對象中的一個,並且只有一個。 使用setter方法或構造函數參數可以幫助您完成此任務。

例如,更改為:

public class NewSession extends JPanel {
    MainPanel ob2;

    NewSession(MainPanel mainPanel) {
       this.ob2 = mainPanel;

和這個:

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

    public MainPanel() {
        NewSession session = new NewSession(this);

關於:

另外,我還有一個想法是在頁面底部有一個下一個和上一個按鈕來切換面板。 但是不確定哪一個是最佳的。 任何想法?

我不確定你在這里是什么意思。 定義“最佳”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM