【问题标题】:How to print objects from an Array to a TextField如何将数组中的对象打印到 TextField
【发布时间】:2015-05-02 22:04:21
【问题描述】:
  • 问题:我无法将在数组中输入的值返回到预览文本框
  • 理想的解决方案:用户按下刷新,该框将填充数组中的对象。
  • JDK:1.8

工作命令行版本代码:

public static void printAll(Member[] platoon){
        //System.out.println("You are in the third loop");
        for (int cntr=0;cntr<platoon.length;cntr++){
            System.out.println("Member Name: " + platoon[cntr].getName() + " " + "Join Date: " + platoon[cntr].getJoinDate());
        }
    }

上面的代码采用一个实例化的对象类型成员数组,并通过 get 方法返回存储在每个成员中的每个值(String Name, int day, int month, int year);。

我正在尝试用 Java 的 GUI 功能做同样的事情。我的代码大约有 300 行,我绝对愿意将其全部发布,因为这是阻止我完成项目的最后一件事。

下面我写了我想用排数组的当前内容设置预览文本字段中的文本的动作事件。我试图做的只是将上面代码中的打印输出放入框中,它不喜欢 VOID 类型,所以我将其切换为返回类型 String。现在看来我不能将 For 循环的结果存储为字符串?我很想念一些重要的东西。

界面代码:

}else if(event.getSource() == refreshButton){
        displayText.setText(setPreview(platoon));

    }
public static String setPreview(Member[] platoon){
    //System.out.println("You are in the fourth loop");
    preview = (for (int cntr=0;cntr<platoon.length;cntr++){
        System.out.println("Member Name: " + platoon[cntr].getName() + " " + "Join Date: " + platoon[cntr].getJoinDate()););
        return preview;
    }
}

感谢大家的帮助,我们会不断更新此 OP,以帮助未来的 Stack Overflow 成员解决此问题。

【问题讨论】:

  • StringJoiner 浮现在脑海中;如果您使用 Swing,则为 JTextArea#append 或 JList
  • 这是使用 Swing 吗?为了尽快获得更好的帮助,请发布MCVE(最小完整可验证示例)或SSCCE(简短、独立、正确的示例)。

标签: java arrays object textfield


【解决方案1】:

循环不返回结果,有趣的想法,Java 就是不这样做。

你可以...

使用StringJoiner

StringJoiner joiner = new StringJoiner("\n");
for (int cntr=0;cntr<platoon.length;cntr++){
    joiner.add("Member Name: " + platoon[cntr].getName() + " " + "Join Date: " + platoon[cntr].getJoinDate());
}   
return joiner.toString();

你可以...

使用JTextArea#append

    for (int cntr = 0; cntr < platoon.length; cntr++) {
        ta.append("Member Name: " + platoon[cntr].getName() + " " + "Join Date: " + platoon[cntr].getJoinDate() + "\n");
    }

你可以...

使用JList,它旨在呈现“东西”列表。

详情请见How to use lists

【讨论】:

    【解决方案2】:

    您的问题出在您的 setPreview 方法中。您使用System.out.println,这是一条将文本打印到系统标准输出设备(在大多数情况下为终端窗口)的指令。它不返回字符串,并且您不能使用以下语法将字符串连接到变量:

    preview = for(...) { ... }
    

    因为setPreview 将返回一个String,我怀疑你想这样做:

    public static String setPreview(Member[] platoon){
        String result = "";
        for (int cntr=0;cntr<platoon.length;cntr++){
            if (result.length() > 0) result += " ";   // put a space before the next output
            result += "Member Name: " + platoon[cntr].getName() + " " + "Join Date: " + platoon[cntr].getJoinDate());
        }
        return result;
    }
    

    这将构建您需要的输出字符串,然后可以将其设置为文本字段或任何适当的内容。

    【讨论】:

    • 特别是在 Java 8 中,永远不应该有任何理由在循环中进行 String 连接(不是说您也应该在其他任何地方这样做)
    • 您的 StringJoiner 建议是否在整个参数构建过程中也使用字符串连接? joiner.add("成员姓名:" + platoon[cntr].getName() + " " + "加入日期:" + platoon[cntr].getJoinDate());
    • "Member Name: " + platoon[cntr].getName() + " " + "Join Date: " + platoon[cntr].getJoinDate()) 将由编译器优化(使用内部StringBuilder),但您的代码正在执行result += {StringBuilder}.toString() ...或多或少。研究了StringJoiner 的工作原理(因为我担心这个),它使用了StringBuilder...所以没有String 串联
    【解决方案3】:
    1. 覆盖 Member 中的toString() 方法:

      @Override
      public String toString() {
          return "Member Name: " + getName() + " Join Date: " + getJoinDate();
      }
      
    2. PrintAll() 将变为(但您不再需要它了):

      public static void printAll(Member[] platoon) {
          for (int cntr = 0; cntr < platoon.length; cntr++)
              System.out.println(platoon[cntr].toString());
      }
      
    3. setPreview() 将变为(注意:这只是为了说明原理,有关如何在循环中连接字符串的更好方法,请参阅@MadProgrammer 的答案):

      public static String getPreviewText(Member[] platoon) {
          String s = platoon.length > 0 ? platoon[0].toString() : "";
          for (int i = 1; i < platoon.length; i++)
               s += "\n" + platoon[i].toString();
          return s;
      }
      
      public static void setPreview(Member[] platoon) {
          displayText.setText(getPreviewText(platoon));
      }
      

    【讨论】:

    • 虽然我个人不喜欢重写 toString 方法以提供“显示”输出(我喜欢用于调试),但这不是主要问题,只需要小心它有它的局限性,但我会抱怨循环中的 String 连接,尤其是在 Java 8 中,根本没有理由再这样做了。
    • @MadProgrammer 好的,您可以选择另一种方法,但如果我要编写“调试”(更多是状态)输出,那么我可能会像他那样做。我不是 Java 8 专家,我只是在展示如何做并尽可能接近他的代码,这对我来说看起来很容易,你会如何改进它?不是被编译器优化了吗?
    • String 循环中的连接没有被编译器优化,它根本无法解决。你可以使用StringBuilder,但是,Java 8 引入了StringJoiner 类,这要简单得多。至于toString,这只是个人的抱怨,并没有降低解决方案的有效性,它只是在折磨我;)
    • @Darkn3ssF4lls 不客气,只是注意到我的静态可能有一些错误(与您的代码相比)我认为除了 toString() 以匹配您的代码之外的所有内容都应该是静态的,现在更正
    猜你喜欢
    • 1970-01-01
    • 2018-03-23
    • 2012-05-01
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-22
    相关资源
    最近更新 更多