【问题标题】:Array to String to append to a textArea in a JFrame GUI?数组到字符串以附加到 JFrame GUI 中的 textArea?
【发布时间】:2014-04-02 19:36:57
【问题描述】:

我有一个Arraylist<ActivityPerformed> activityPerformed,我想将它作为String printReport() 的一部分打印到textArea

这就是我现在拥有的(位于 Tracker.class 中)

public String getActivityPerformed() {
    String done = "";
    String error = "No tracked activities.\n";
    for(int i = 0; i < activityPerformed.size(); i++) {
        done += activityPerformed.get(i);
        done += "\n";
        return done;
    }
    return error;
}

public String printReport()
{   
    lifestyleReport  = "\n \nLifestyle Report \n";
    lifestyleReport += "Activities Performed \n" + getActivityPerformed();
    return lifestyleReport;
}

}

这就是我的 GUI (TrackerGUI.class):

public class Report implements ActionListener {
    public void actionPerformed (ActionEvent ae) {
        if(tracker.foodEaten.isEmpty() == true && tracker.activityPerformed.isEmpty() == true)
            textArea.append("Error: No food/activity tracked. \n");
        else textArea.append(tracker.printReport());
    }
}

我应该在代码中添加什么以使数组正确打印到textArea 中?我总是得到这样的东西:@365bc793

【问题讨论】:

  • 你在你的类中重写了toString 方法吗?
  • 没有。我怎么做?我在搜索答案时一直看到它,但我真的不明白它是如何工作的,因为大多数解决方案都是基于System.out.print

标签: java swing user-interface arraylist


【解决方案1】:
  for(int i = 0; i < activityPerformed.size(); i++) {
            done += activityPerformed.get(i);
                                        ^------------Object of ActivityPerformed
            done += "\n";
            return done;
        }

在上面的代码中,您从列表中获取元素索引 i,但类型为 ActivityPerformed,因此当您在 textarea 上打印时,对象会被打印。

【讨论】:

  • 你能解释一下吗?我真的不明白你想说什么。
  • List 是 ActivityPerformed 类型,意味着列表将包含此类的对象。当您尝试获取任何具有索引的元素时,它将返回 ActivityPerformed 的对象。所以我不确定类的哪个属性您希望在报告中看到的 ActivityPerformed。
【解决方案2】:

每次将对象通过连接转换为字符串时,如

done += activityPerformed.get(i);

它的toString() 方法被调用。每个对象都有这样的方法,因为所有的 Java 类都继承自 java.lang.Object,而 java.lang.Object 具有该方法的默认实现。但是,此默认实现仅返回对象的类型及其 hashCode。所以,如果你想返回不同的东西,你必须在你的类中重写 toString():

@Override
public String toString() {
    return "Hello, I'm an ActivityPerformed, and my name is " + this.name;
}

所以,要么这样做,要么从您的对象中打印特定值:

for(int i = 0; i < activityPerformed.size(); i++) {
    ActivityPerformed a = activityPerformed.get(i)
    done += a.getName();
    done += " - "
    done += a.getFoo();
    done += "\n";
}

另外,请注意您应该支持 foreach 循环:

for (ActivityPerformed a : activityPerformed) {
    done += ...
}

还请注意,您不应该从循环内部返回,否则您的字符串中只会包含列表的第一个元素。

最后,您应该使用 StringBuilder 来提高您的代码效率。不这样做会创建大量临时对象并且效率低下:

StringBuilder builder = new StringBuilder();
for (ActivityPerformed a : activityPerformed) {
    builder.append(...);
}
return builder.toString();

【讨论】:

  • 澄清一下:builder.append(...) 是否包含您在上面指定的done += .. 部分?另外,我是否需要导入或声明任何东西才能使getFoo() 工作?我收到“找不到符号 - 方法 getFoo”错误。
  • builder.append() 将某些内容附加到构建器。附加所有内容后,您可以使用 builder.toString() 从构建器获取完整字符串。阅读 javadoc。您将通过阅读文档来学习。我对你的 ActivityPerformed 类一无所知,所以我想象它有一个 getFoo() 方法返回你想在文本区域打印的内容。这不是在不理解的情况下剪切'n粘贴的代码。这是说明您应该遵循的原则的示例代码。将 getFoo() 和 getName() 替换为您想要从 ActivityPerformed 对象获取和打印的内容。
  • D'oh,我很晚才意识到 getName()getFoo() 对我的代码来说是什么(我给它起了不同的名字)。不过,我们从未在课堂上讨论过StringBuilder(Beginner's Java),所以我不能将它用于我的代码。它适用于a.getName()a.getFoo()(尽管在我的情况下是getTotalCalories())。谢谢!
  • 仅在 JDK 中就有数千个类,您将使用许多额外的库。如果你只使用你在课堂上讨论过的课程,你不会走得太远。开发人员工作的很大一部分是阅读文档并学习以自主方式使用新类。
  • 是的,我明白了。问题是,这是 for 我的初学者的 Java 课程,如果我们使用尚未在课堂上讨论过的代码,我的教授会扣分。一旦我们了解了更多基础知识,我将开始修改和试验更多代码。
猜你喜欢
  • 2016-03-02
  • 1970-01-01
  • 2023-01-19
  • 2011-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
相关资源
最近更新 更多