将ArrayList打印到JLabel而不是在GUI上打印



我目前面临一个问题,我有一个问题的ArrayList答案,我正试图将每个答案打印到JLabel中,因为这将显示添加到题库中的问题。

问题是它只会打印一个答案,并且数组中可能存储了5个答案。它正在将它打印到控制台上,我已经尝试将this.add(answerLabel);放入for循环内部和外部。

我这样做是最好的方式吗?

answerLabel = new JLabel();
answerLabel.setBounds(100, 100, 300, 300);
for (int i = 0; i < answers.size(); i++) {
answerLabel.setText("Answer " + i + ": " + answers.get(i));
System.out.println("Answer " + i + ": " + answers.get(i));
this.add(answerLabel);
}

您需要考虑的是,一旦添加了前一个,就创建一个新的JLabel实例

answerLabel = new JLabel();
answerLabel.setBounds(100, 100, 300, 300);
for (int i = 0; i < answers.size(); i++) {
answerLabel.setText("Answer " + i + ": " + answers.get(i));
System.out.println("Answer " + i + ": " + answers.get(i));
this.add(answerLabel);
answerLabel = new JLabel();
answerLabel.setBounds(100, 100, 300, 300);
}

您的代码存在一些问题:

  1. setBounds告诉我们您正在使用null-layout,请参阅:为什么在Swing中使用空布局不受欢迎?如果这还不足以说明使用它的问题,这里有一个例子。相反,使用布局管理器,让Swing为您进行计算

  2. 每次for进行迭代时,您都会在JLabel上调用setText,这将覆盖上一次迭代中的内容,因此您有两个选项:

  • 在每次迭代上创建JLabel的新实例

    JPanel pane = new JPanel();
    pane.setLayout(new BoxLayout(pane, BoxLayout.PAGE_AXIS));
    for (int i = 0; i < answers.size(); i++) {
    answerLabel = new JLabel();
    answerLabel.setText("Answer " + i + ": " + answers.get(i));
    pane.add(answerLabel);
    }
    this.add(pane);
    
  • 创建一个String的实例,并将所有文本附加到其中,然后用String的值在JLabel上调用setText一次

    String text = "";
    for (int i = 0; i < answers.size(); i++) {
    text += "Answer " + i + ": " + answers.get(i) + "n"; //Replace this for a StringBuilder, just making this an example
    }
    answerLabel.setText(text);
    this.add(answerLabel);
    

最新更新