【问题标题】:Printing a 2d char array to a Swing Gui (Java)将二维字符数组打印到 Swing Gui (Java)
【发布时间】:2013-01-07 01:04:26
【问题描述】:

我目前正在尝试将 Java 应用程序(也是我制作的)从基于控制台的一对一转换为使用基于 Swing 的 GUI。一切都很好,但我不太了解 Swing,所以这有点困难。

我当前的问题是在输出中打印一个字符数组。最初,我能够通过明智地使用 for 循环和 System.out.print(theworld[j][i]); 直接打印到控制台; (其中 i 和 j 遍历循环,而 theworld 是有问题的数组),但我不知道如何获得类似于用于 Swing GUI 的东西。

具体来说,它是这样打印到控制台的:

for (int i = 0; i < ydimension; i++){
  for (int j = 0; j < xdimension; j++){
    System.out.print(theworld [j][i]);
  }
System.out.println();
}

目前,我有一个附加了 JMenuBar 的 JFrame,这一切都按预期工作。我想要的是阵列显示在框架上(或附加面板上)以响应刺激,无论是按下按钮还是计时器滴答声。

另一件事是,数组将在每个滴答声中更新,这应该反映在最终打印的数组中,所以我是否应该在打印数组之前清除屏幕或类似的东西?

谢谢。

编辑:再次查看我的代码后,我意识到在问题中我省略了外部 for 循环中的 println。它应该逐行打印,而不是全部打印为一行。上面的代码已被更正以反映这一点。

【问题讨论】:

  • 使用JTable 进行显示。要更新这些值,请更新 TableModel。

标签: java swing


【解决方案1】:

如果您使用JTable 而不是尝试直接输出文本,也许会更有意义(并且更易于阅读)。 Here's an example of what it might look like。您将在每次滴答时更新TableModel,而不必担心清除屏幕。

另外一件很重要的事情就是你更新TableModel的时候,一定要按照Swing's threading policy来做。这意味着您可能必须从正在执行更新的任何线程执行以下操作:

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        // Update row/rows of table model here
    }
});

【讨论】:

    【解决方案2】:

    如果你只是想让文本出现在 gui 中,首先你需要构造要显示的字符串。因此,您可以将之前打印到控制台的字符串连接成一个字符串。

    然后你可以使用 JTextArea 来显示它。您甚至可以使用 JLabel 或直接在 JPanel 上绘图。

    要更新显示,您需要在 TextArea 中再次设置新文本。

    【讨论】:

      【解决方案3】:

      嗯,有很多方法可以显示文本数据,每种方法在不同的情况下都有优点和缺点:

      1) 文本控件:

      也简称为文本字段,文本控件只能显示一个 可编辑文本行。像按钮一样,它们生成动作事件。利用 他们从用户那里获取少量的文本信息 文本输入完成后执行操作。

      2) 纯文本编辑器:

      JTextArea 可以显示多行可编辑文本。虽然有文字 区域可以显示任何字体的文本,所有的文本都是相同的 字体。使用文本区域允许用户输入无格式文本 任何长度或显示未格式化的帮助信息。

      3) 样式化文本区域:

      样式文本组件可以使用多个显示可编辑文本 字体。一些样式化的文本组件允许嵌入图像,甚至 嵌入式组件。样式化的文本组件功能强大且 适合高端需求的多面组件,并提供更多 比其他文本组件的自定义途径。

      3) JLabel

      使用 JLabel 类,您可以显示不可选择的文本和图像。 如果您需要创建一个显示字符串、图像或 两者,您都可以通过使用或扩展 JLabel 来实现。如果组件是 交互并具有一定的状态,使用按钮而不是标签。

      4) JTable(+1 到 @AndrewThompsons 评论)

      使用 JTable 类,您可以选择显示数据表 允许用户编辑数据。 JTable 不包含或不缓存 数据;它只是您的数据的一个视图。

      以上所有内容都与来自 oracle 的相关示例/信息相关联。

      下一个问题是将组件放置在您想要的位置:

      对于这个 Swing 有各种内置的LayoutManagers。

      有关更多信息,请参阅Laying Out Components Within a Container。

      至于:

      另一件事是,数组将在每个刻度上更新,并且 这应该反映在最终打印的数组中,所以我会去 关于在打印阵列或其他东西之前清除屏幕 类似的

      使用 Swing Timer 确保您的 Gui 是从 EDT 更新的。

      除了JTable 之外,上述大多数组件都有一个简单的setText(String s) 和getText() 方法。

      在其中一个实例上调用setText 将使旧文本被新文本覆盖。因此,您无需清除它,只需调用添加新文本的相同方法即可。要附加文本,您可以使用getText() 和setText(String s) 的组合,或者在使用JTextArea 时使用append(String s)。

      如果这不是您想要的,请尝试更具体地说明预期的输出,可能会发布 SSCCE 显示您拥有和正在努力实现的目标。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-29
        • 1970-01-01
        • 1970-01-01
        • 2016-02-15
        • 1970-01-01
        • 2017-12-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多