【问题标题】:Java GUI Switching panels using Card Layout使用卡片布局的 Java GUI 切换面板
【发布时间】:2017-03-02 12:39:44
【问题描述】:

好的,我正在使用卡片布局将面板从第一个面板切换到第二个面板,然后再切换到第三个面板。我一直在网上寻找,但我找不到我要找的确切内容。我希望我的面板属于不同的类别,并使用按钮来回切换到不同的面板。我为此找到了几个来源,但是所有面板都添加到原始面板中,然后使用原始面板中的相同按钮切换到不同的面板。

(即)面板 2 使用面板 1 中的按钮切换到面板 3,面板 3 使用面板 1 中的按钮切换到面板 4,面板 4 使用面板 1 中的按钮切换回面板 2。

但应该是面板 1 使用面板 1 中的按钮切换到面板 2,面板 2 使用面板 2 中的按钮切换到面板 3,面板 3 应该使用面板 3 中的按钮切换到面板 1意味着应该不需要第四个面板。

我的问题是我想使用不同的按钮来回切换,而不是使用相同的按钮,因为我打算在每个面板的每个按钮中编写额外的代码。因为我基本上想创建 3 个面板,以便一旦将详细信息添加到注册表单并且用户单击注册,详细信息就会添加到数据库中,然后它会切换到登录面板并关闭注册面板。 如果用户名和密码与数据库中的条目匹配,则登录面板会接收用户名和密码,并且用户单击登录转到新面板并关闭登录面板。

现在我已经完成了注册和登录阶段,只是从一个面板切换到下一个面板就是问题所在。有没有办法使用卡片布局,以便您使用每个面板的不同按钮切换到不同的面板来执行此操作,或者是否有其他方法可以执行此操作。

如果需要,我可以附加我的代码。但它连接到一个数据库,所以它不会在没有数据库的情况下编译。

【问题讨论】:

  • 另外值得一提的是,我是使用卡片布局的新手,因为我通常使用多个帧并在每个帧之间切换,尽管我知道它的编程很糟糕。
  • 我基本上想做 splungebob 在早期堆栈溢出问题中提出的问题,但不一定与卡片布局 stackoverflow.com/questions/15840686/…
  • “如果需要,我可以附加我的代码。但它连接到数据库,因此没有数据库就无法编译。” 1)我们不想要代码转储,发布minimal reproducible exampleShort, Self Contained, Correct Example。 2)用一些硬编码数据替换数据库。

标签: java swing layout-manager cardlayout


【解决方案1】:

您肯定需要一个 4. 面板女巫,其中包含 3 个面板并具有 cardLayout。

要从卡片中更改卡片,您需要使用 next() 方法交出动作监听器。我做了一个不美观的小例子来说明我的意思;-)

public class CardExample{

private class panel extends JPanel{

    private panel(ActionListener alNext, String text){
        JButton buttonNext = new JButton("next");
        buttonNext.addActionListener(alNext);

        JLabel textLabel = new JLabel(text);

        this.add(textLabel);
        this.add(buttonNext);
    }
}

public CardExample(){}

public static void main(String[] args){

   CardExample ce = new Cardexample();
   ce.myGUI();
}

private void myGUI() {

    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setSize(200, 200);

    CardLayout cardLayout = new CardLayout();

    frame.getContentPane().setLayout(cardLayout);

    ActionListener al = e -> cardLayout.next(frame.getContentPane());

    frame.getContentPane().add(new panel(al, "Panel 1"));
    frame.getContentPane().add(new panel(al, "Panel 2"));
    frame.getContentPane().add(new panel(al, "Panel 3"));

    frame.setVisible(true);
}

}

【讨论】:

    【解决方案2】:

    按钮是在同一个面板上还是在不同的面板上无关紧要。

    按钮只是执行布局管理器中的一个方法。您可以使用:

    1. next(...) - 转到 CardLayout 中的下一个面板,或
    2. show(...) - 在 CardLayout 中显示特定面板。

    如果您无法使用 CardLayout 访问面板,您可以轻松获得此功能。在按钮的 ActionListener 中,您可以执行以下操作:

    JButton button = (JButton)event.getSource();
    JPanel buttonPanel = (JPanel)button.getParent();
    JPanel cardPanel = (JPanel)buttonPanel.getParent();
    CardLayout layout = (CardLayout)cardPanel.getLayout();
    layout.next(cardPanel);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-27
      • 2016-05-16
      • 2015-05-21
      • 2018-07-03
      • 2014-08-09
      相关资源
      最近更新 更多