初学者Java程序员。我正在尝试创建一个纸牌游戏,以了解有关Java的更多信息。我有一系列名字,我拿出了一个数据库。对于数组中的每个String,我想创建一个JPanel,在JLabels中我将设置名称,功能,健康等。
问题是,当我在循环中创建它们时,它们都具有相同的名称并相互覆盖。由于我读过Java没有动态变量名,我该如何解决?
public void loadDatabaseCardElements(ArrayList cards) {
ArrayList<String> buildCards = cards;
int i;
for(i = 0; i != buildCards.size();) {
String var = buildCards.get(0);
//create the Panel etc
JPanel mainHolder = new JPanel();
mainHolder.setLayout(new BoxLayout(mainHolder, BoxLayout.PAGE_AXIS));
JLabel name = new JLabel("Name: " + var);
JLabel powerLabel = new JLabel("Power: ");
JLabel healthLabel = new JLabel("Health: ");
JLabel armorLabel = new JLabel("Armor: ");
JLabel type1Label = new JLabel("Type1");
JLabel type2Label = new JLabel("Type2: ");
JLabel ability1Label = new JLabel("Ability1: ");
JLabel ability2Label = new JLabel("Ability2: ");
JLabel ability3Label = new JLabel("Ability3: ");
JButton card1 = new JButton("Add to deck");
mainHolder.add(name);
mainHolder.add(powerLabel);
mainHolder.add(healthLabel);
mainHolder.add(armorLabel);
mainHolder.add(type1Label);
mainHolder.add(type2Label);
mainHolder.add(ability1Label);
mainHolder.add(ability2Label);
mainHolder.add(ability3Label);
mainHolder.add(card1);
mainHolder.setBorder(BorderFactory.createLineBorder(Color.black));
mainHolder.setPreferredSize( new Dimension( 130, 200 ) );
frame1.add(mainHolder, BorderLayout.WEST);
SwingUtilities.updateComponentTreeUI(frame1);
card1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
preDeck.add(var); //add to another array when clicked
}
});
if (buildCards.size() != 0) {
buildCards.remove(0);
} else {
}
}
}
答案 0 :(得分:0)
为框架中的标准jpanel设置可增长的布局,然后每次都将新的jpanel添加到标准jpanel。这应该解决命名问题。如果你需要访问每个面板,你可以将它们存储在一个数组
中答案 1 :(得分:0)
覆盖所有具有相同名称的面板的原因是由于这部分代码所致:
int i;
for(i = 0; i != buildCards.size();) {
String var = buildCards.get(0);
您要将列表的第一个元素分配给每个JLabel
。这可以帮助您实现所需:
for(int i = 0; i < buildCards.size(); i++){
String var = buildCards.get(i);
// Followed by your code
}