2016-11-11 39 views
0

初学Java程序员在这里。我正在尝试创建一个纸牌游戏来学习更多关于Java的知识。我有一个名字数组,我拿出一个数据库。对于数组中的每个字符串,我想创建一个JPanel,并在JLabels中设置名称,权力,健康等。在循环中生成JFrames,命名问题

问题是当我在循环中创建它们时,它们都具有相同的名称并覆盖彼此。自从我读取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 { 

     } 

    } 
} 
+1

在这种情况下的问题是,你以这样的方式,将覆盖'BorderLayout.WEST'的当前内容添加'JPanel'到'JFrame'区。查看https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html了解布局管理器的信息。我会说,通过GUI开发学习Java可能不是最好的方法。通过开发问题本身的模型可以学习基本概念。这可以在用户输入或不用用户输入的情况下进行测试,然后您可以尝试建立一个视图,以增加信心。 –

回答

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 
} 
0

为框架中的标准jpanel设置可增长的布局,然后每次向标准jpanel添加一个新的jpanel。这应该解决命名问题。如果u需要访问每个面板,你可以将它们存储在一个数组