JAVA 卡片布局。如何从不同 类 调用卡片

JAVA cardLayout. how to call a card from different classes

我有一个程序,其框架包含带有卡片布局的主面板,我希望它显示不同的 cards/panel。

就我而言,我真的很难从按钮动作侦听器调用新卡片。

我希望在单击按钮后出现一张新卡片,但我在动作侦听器中输入的 none 代码显示了我想要的卡片。

我知道我的 actionListener 工作,因为我在里面做了一个 println。

这是我的代码。我去掉了所有不必要的东西,这样更容易阅读。感谢您的帮助!

我会采纳所有关于代码结构的建议

主框架:

public class MainFrame extends JFrame{

final static String CONNEXION_VIEW = "connexionView"; 
final static String CONNEXION_FAILED_VIEW = "connexionRefusee"; 

public MainFrame()
{
    super();
    initialize();
}


private void initialize()
{
    getMainPanel();

    add(getMainPanel());

}

CardLayout cardLayout;
public CardLayout getCardLayout()
{
    if (cardLayout == null)
    {
        cardLayout = new CardLayout();
    }
    return cardLayout;
}


JPanel mainPanel;
public JPanel getMainPanel()
{
    if (mainPanel == null)
    {
        mainPanel = new JPanel();

        mainPanel.setLayout(getCardLayout());

        mainPanel.add(CONNEXION_VIEW, getConnexionView());
        mainPanel.add(CONNEXION_FAILED_VIEW, getConnexionFailedView());

    }
    return mainPanel;
}

ConnexionView connexionView;
protected ConnexionView getConnexionView()
{
    if (connexionView == null)
    {
        connexionView = new ConnexionView();
    }
    return connexionView;
}

ConnexionFailedView connexionFailedView;
protected ConnexionFailedView getConnexionFailedView()
{
    if (connexionFailedView == null)
    {
        connexionFailedView = new ConnexionFailedView();
    }
    return connexionFailedView;
}

connexion 视图,带有点击按钮和我想放置代码的动作侦听器的视图

public class ConnexionView extends JPanel{

GridBagLayout gbl = new GridBagLayout();

private JButton btnConnexion;

Dimension dimensionBouton = new Dimension(170, 30);

public ConnexionView()
{
    super();
    initialise();
}

private void initialise()
{
    setLayout(gbl);

    GridBagConstraints gbcbtnConnexion = new GridBagConstraints();
    gbcbtnConnexion.gridwidth = GridBagConstraints.REMAINDER;
    gbcbtnConnexion.gridheight = GridBagConstraints.REMAINDER;
    gbcbtnConnexion.gridx = 1;
    gbcbtnConnexion.gridy = 2;
    add(getBtnConnexion(), gbcbtnConnexion);
}

private JButton getBtnConnexion()
{
    if (btnConnexion == null)
    {
        btnConnexion = new JButton("Connexion");
        btnConnexion.setPreferredSize(dimensionBouton);
        btnConnexion.setMinimumSize(dimensionBouton);

        btnConnexion.addMouseListener(new MouseAdapter()
        {
            @Override
            public void mouseClicked(MouseEvent e)
            {
                /////code to display the connexion_Failed_View

                System.out.println("test");
            }
        });
    }
    return btnConnexion;
}

}

连接失败视图,我想在单击按钮后显示的视图

public class ConnexionFailedView extends JPanel{

public ConnexionFailedView()
{
    super();
    initialise();
}

private void initialise()
{
    setBackground(Color.YELLOW);
}

提前致谢

您需要以某种方式将组件保留在 Button 中,以便您可以访问它。

class ConnexionView {
    private JComponent mainPanel;
    public ConnexionView(JComponent mp) { mainPanel = mp; }
}

显然,这意味着 MainFrame 需要传递它。

现在,监听器可以做

// it would be cleaner if you passed the layout in the constructor as well
CardLayout cl = (CardLayout) mainPanel.getLayoutManager();
cl.show(mainPanel, MainFrame.CONNEXION_FAILED_VIEW);