循环生成JFrame,命名问题
Generate JFrames in a loop, naming issue
初学者 Java 程序员在这里。我正在尝试创建一个纸牌游戏来了解有关 Java 的更多信息。我有一个名字数组,我从数据库中提取了这些名字。对于数组中的每个字符串,我想创建一个 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 {
}
}
}
在框架中为标准jpanel 设置一个可增长的布局,然后每次都向标准jpanel 添加一个新的jpanel。这应该可以解决命名问题。如果你需要访问每个面板,你可以将它们存储在一个数组中
覆盖所有同名面板的原因是您的这部分代码:
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
}
初学者 Java 程序员在这里。我正在尝试创建一个纸牌游戏来了解有关 Java 的更多信息。我有一个名字数组,我从数据库中提取了这些名字。对于数组中的每个字符串,我想创建一个 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 {
}
}
}
在框架中为标准jpanel 设置一个可增长的布局,然后每次都向标准jpanel 添加一个新的jpanel。这应该可以解决命名问题。如果你需要访问每个面板,你可以将它们存储在一个数组中
覆盖所有同名面板的原因是您的这部分代码:
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
}