从ArrayList <string>创建的JLabel不会出现*其他人将*

时间:2015-05-10 17:17:20

标签: java swing user-interface jpanel jlabel

我不是GUI或swing编程的新手,就像免责声明一样。

在我的扩展JPanel的类中,我有一个ArrayList&lt;字符串&gt;我想用来创建JLabel的opponentNames。我有一个ArrayList&lt; JLabel&gt;包含JLabel的标签。我使用了这个列表,并且我试图直接添加到框架,这就是为什么两者都在下面的代码块中。我知道我应该使用一个。

for(String s : opponentNames){
   JLabel label = new JLabel(s);
   label.setVisible(true);
   labels.add(label);
   this.add(label);
}

然后我在不使用我的ArrayList&lt;的情况下以相同的方式添加测试JLabel。字符串&gt;:

for(int i = 0; i < 5; i++){
   JLabel label = new JLabel(""+i);
   label.setVisible(true);
   labels.add(label);
   this.add(label);
}

这会为我的面板添加5个JLabel。

后来我尝试添加所有的ArrayList&lt; JLabel&gt;再次向专家组贴上标签:

for(JLabel l : labels){
   System.out.println(l.getText());
   System.out.println(l.isVisible());
   this.add(l);
}

在控制台中,每个标签都打印出正确的文本(数字和来自ArrayList的字符串&lt; String&gt; opponentNames)屏幕上显示的唯一内容是JLabels 0 ...... 4,两次。

TL; DR:我的所有JLabel都存在且设置可见,但屏幕上只显示了一些。

编辑:我有一个拼写错误:应该是label.setVisible(true);在第一个for循环中。这里的代码没有复制和粘贴,大大简化了。那是/我的代码中的错误。

edit2:这是可运行的代码。当然,当我测试它时,我的问题不会发生在这里,所以这告诉我在我的代码中的其他地方存在问题。

import javax.swing.JFrame;

public class JLabelTestMain {

public static void main(String[] args) {
    TestJLabelCode panel = new TestJLabelCode();
    JFrame frame = new JFrame();

    frame.setContentPane(panel);

    frame.pack();
    frame.validate();
    frame.setVisible(true);

    frame.setDefaultCloseOperation(3);
}

}

然后是另一个班级:

import java.util.ArrayList;

import javax.swing.JLabel;
import javax.swing.JPanel;

public class TestJLabelCode extends JPanel{
private ArrayList<String> opponentNames;
private ArrayList<JLabel> labels;


public TestJLabelCode(){
    opponentNames = new ArrayList<String>();
    labels = new ArrayList<JLabel>();

    opponentNames.add("client1");
    opponentNames.add("client2");
    opponentNames.add("client3");
    opponentNames.add("client4");
    opponentNames.add("client5");

    for(String s : opponentNames){
        JLabel label = new JLabel(s);
        label.setVisible(true);
        labels.add(label);
        this.add(label);
    }

    for(int i=0; i<5; i++){
        JLabel label = new JLabel(""+i);
        label.setVisible(true);
        labels.add(label);
        this.add(label);
    }

    for(JLabel label : labels){
        System.out.println(label.getText());
        System.out.println(label.isVisible());

        add(label);
    }
}

}

1 个答案:

答案 0 :(得分:0)

我发现了我的错误来源。这是一个非常大的网络游戏的一小部分。我不小心创建了这个面板两次。我正在重新绘制它的第一个实例,它是在没有客户端/对手名称的情况下初始化的,即使我正在更新它的第二个实例。控制台中的print语句来自第二个实例,而第一个实例是唯一显示的实例。

感谢@HovercraftFullOfEels和@Zhedar的帮助。