1

我目前正在尝试将 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 。它应该逐行打印,而不是全部打印为一行。上面的代码已被更正以反映这一点。

4

3 回答 3

2

JTable如果您使用 a而不是尝试直接输出文本,也许会更有意义(并且更易于阅读) 。这是它可能看起来的示例。您将TableModel在每个刻度上更新,而不必担心清除屏幕。

另一件非常重要的事情是,当您更新 时TableModel,必须根据Swing 的线程策略来完成。这意味着您可能必须从正在执行更新的任何线程执行以下操作:

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        // Update row/rows of table model here
    }
});
于 2013-01-05T16:11:55.777 回答
1

If you just want the text to appear in the gui, first you need to construct the string to be displayed. So you would concatenate the strings you were earlier printing to the console to one single string.

Then you could use JTextArea to display it. You can even use JLabel or directly draw over the JPanel.

To update the display you would again set the new text in the TextArea.

于 2013-01-05T16:03:31.100 回答
1

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

1)文本控件:

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

2)纯文本编辑器:

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

3)样式文本区域:

样式化的文本组件可以使用一种以上的字体显示可编辑的文本。一些样式化的文本组件允许嵌入图像甚至嵌入组件。样式化文本组件是适用于高端需求的强大且多方面的组件,并且提供了比其他文本组件更多的定制途径。

3)JLabel

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

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

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

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

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

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

有关更多信息,请参阅在容器中布置组件

至于:

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

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

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

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

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

于 2013-01-05T17:24:19.993 回答