【问题标题】:A better swing gui design?更好的摇摆 GUI 设计?
【发布时间】:2011-07-19 17:36:14
【问题描述】:

我正在为一个在线课程做一个项目,我今年夏天犯了一个错误,我需要构建一个 gui 来展示哈夫曼代码算法的工作原理。算法部分很简单,不是很复杂。但是我不确定在每个步骤中绘制树(福雷斯特)的最佳方法是什么。它必须从屏幕上的 n 个节点(其中包含字符)开始,然后您将按下“下一步”按钮,它将选择两个加权最低的节点(基于字符频率)字符并使它们成为一个新节点(只有一个权重 - 没有字符),然后更新屏幕/面板。

我以前做过swing gui,我的技能没什么特别的,但我知道我的方法。但是我坚持这个实现。我现在写了几百行代码,但它不起作用,而且我认为它仍然很糟糕,所以我想“重新开始”并更好地计划它。所以我想对数据结构提出一些建议,以跟踪节点以及如何在屏幕上绘制它们。

我使用 JPanel 的 ArrayList 作为节点并尝试将它们绘制到空布局。我确定这很糟糕,我想知道更好的方法。可能是 GridBagLayout?

注意:不要说 JTree。

【问题讨论】:

  • 您的第一个错误是使用空布局。
  • 1) 是否只有一个库 JPanels,或者不止一个 2) JPanels 是相同的 width & height 3) 你把你的 JPanels 放到了 JScrollPane跨度>
  • @mKorbel 它是 BST,我不知道还能告诉你什么。可能有 1 个节点或 1000 个节点(不是真的很可能会限制它)。
  • @Paul Sasik Jtree 会起作用,但我只会在需要交出它并且我没有其他工作的情况下才会这样做。
  • @Bill:你还是没有说你为什么不想使用它。你能证明这个决定是正确的吗?

标签: java swing graphics binary-tree


【解决方案1】:

一个不错的选择是只使用一个库来绘制树/图。我过去在Visual Library 上取得了很好的成功。

另一种可能是Prefuse

【讨论】:

  • 我喜欢用prefuse来做。我以前从未使用过它,但它听起来比画我自己的树更好。生病必须先确保它与教授没问题。谢谢。
【解决方案2】:

您可以只进行自定义 2D 绘图,而不是与不同的 Swing 布局搏斗。请参阅此处的简单 enter link description hereexample,了解如何开始。

【讨论】:

  • +1 自定义绘图是非常好的方法。这是一个更完整的示例:download.oracle.com/javase/tutorial/uiswing/painting
  • 我想这是病得要走的路。
  • 在您的工具箱/技巧包中拥有它是一件好事。当您遇到不符合您希望的方式(或根本不存在)的 UI 时,2D 绘图会非常强大。这也不是那么难做到。只要确保您的代码保持干净和可管理。
【解决方案3】:

使用树的图像(仅一个实例)和数组或其他数据结构来包含算法使用的“数据”。考虑如何使用数据来确定应该在哪里绘制图像。算法运行后使用 repaint()。

[Next] --> 算法运行 --> 使用 repaint() 更新;

所以你有一个框架、一个面板和一个 BufferedImage 对象。 当你必须稍微用数学来知道应该在什么坐标上绘制节点时,这个技巧就会出现。

组件的布局无关紧要,因为您没有将任何组件添加到容器中,只是在其上绘制图像数据。

【讨论】:

  • 这是相同的想法,但比 Paul Sasik 的答案更复杂。无需创建面板、绘制图像然后将图像放在面板上,您可以直接在面板上进行绘制。事实上,您将使用完全相同的方法进行绘图。
  • 你只有一个面板吗?我认为保罗和我说的是同一件事,我只是更详细地介绍了一点。当然,您可以直接在面板上绘制,但您需要一个框架来将面板添加到其中,然后将所有图像直接绘制到该面板上。
【解决方案4】:

我们都拥有你曾经拥有的东西;-)

首先,永远不要使用 Null 布局,因为这样会使尺寸静态化,并且您的应用程序将无法在其他所需的分辨率下工作。

使用的最佳布局管理器:GridBagLayout!

为什么?非常灵活,您可以将所有组件完全放在您想要的位置,而放弃分辨率。设置起来更难,但最终效果会更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    相关资源
    最近更新 更多