[英]How do I make a CardLayout work with an arbitrary amount of cards?
我正在尝试使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卡在第一张卡上,不再切换到下一张卡! 没有错误消息,程序可以正常运行,但是没有完成交换卡的含义! 请注意,当我单独进行操作时,该程序可以正常运行! 谢谢。
好的,因此注释掉的for loop对我不起作用,这让我真的感到困惑吗?
好吧,您应该做的第一件事是将调试代码添加到循环中,以查看是否使用了唯一的卡名称。
如果这样做,您将注意到以下问题:
for (int i = 0; i < listElements.length-1; i ++) {
为什么要从列表长度中减去1? 您只能将一个面板添加到CardLayout中。
代码应为:
for (int i = 0; i < listElements.length; i ++) {
如果您认为代码没有执行,则需要添加调试代码或使用调试器逐步检查代码,以查看代码是否按预期执行。
您不能总是盯着代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.