如何使CardLayout可以处理任意数量的卡片?

时间:2018-08-16 17:34:45

标签: java swing user-interface cardlayout

我试图使cardLayout可以处理任意数量的卡,这意味着我将需要某种遍历我拥有的所有对象的循环。现在,我尝试了一下,并使其与手动创建的JPanels一起使用,但是一旦将其放入循环中,将无法使用。

@SuppressWarnings("serial")

public class ClassCardLayoutPane extends JPanel{

JPanel cards;

public ClassCardLayoutPane() {
    initialiseGUI();
}

private void initialiseGUI() {
    String[] listElements = {"A2", "C3"};
    cards = new JPanel(new CardLayout());


    JLabel label = new JLabel("Update");
    add(label);

    JList selectionList = new JList(listElements);
    selectionList.addListSelectionListener(new ListSelectionListener() {

        @Override
        public void valueChanged(ListSelectionEvent evt) {

            if (!evt.getValueIsAdjusting()) {
                label.setText(selectionList.getSelectedValue().toString());
                CardLayout cl = (CardLayout)(cards.getLayout());
                cl.show(cards, label.getText());


            }
        }

    });

    // The panels created by this loop don't work, the cards get stuck on the first one

    /*
    for (int i = 0; i < listElements.length-1; i ++) {

        JPanel temp = new JPanel();
        temp.add(new JLabel(i+""));
        cards.add(temp, listElements[i]);

    }*/


    JPanel card1 = new JPanel();
    card1.add(new JTable(20,20));

    JPanel card2 = new JPanel();
    card2.add(new JTable(10,20));

    cards.add(card1, listElements[0]);
    cards.add(card2, listElements[1]);

    //the panels here do work. I don't know what I'm doing wrong

    add(selectionList);
    add(cards);
}

public static void main(String[] args) {
    JFrame main = new JFrame("Win");
    main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    main.setPreferredSize(new Dimension(1366, 768));
    main.getContentPane().add(new ClassCardLayoutPane());
    main.pack();
    main.setVisible(true);
}

}

好的,所以注释掉的for loop是什么对我不起作用,这让我真的感到困惑吗?有人可以向我解释为什么它不起作用以及如何使它起作用吗?顺便说一句,listElements可以是不同的大小,这就是我要尝试使用的大小,因为最终,listElements将从LinkedList开始,所以当我为ListItems创建数组时,每次都会有不同的大小,因为我不知道会有多少个项目。有人可以帮我做这个工作吗?所谓“不起作用”,是指在使用循环时,JPanel卡在第一张卡上,不再切换到下一张卡!没有错误消息,程序可以正常运行,但是没有完成交换卡的含义!请注意,当我单独进行操作时,该程序可以正常运行!谢谢。

1 个答案:

答案 0 :(得分:1)

  

好的,所以注释掉的for loop是什么对我不起作用,这让我真的感到困惑吗?

您应该做的第一件事是将调试代码添加到循环中,以查看是否使用了唯一的卡名。

如果您这样做,则会发现以下问题:

for (int i = 0; i < listElements.length-1; i ++) {

为什么要从列表长度中减去1?您只能将一个面板添加到CardLayout。

代码应为:

for (int i = 0; i < listElements.length; i ++) {

当代码没有按照您认为的那样执行时,您需要添加调试代码或使用调试器逐步查看代码,以查看代码是否按预期执行。

您不能总是盯着代码看。