更好的Swing GUI设计?

3
我正在为我在暑假选修的在线课程上的一个项目工作,我需要构建一个 GUI 来展示哈夫曼编码算法的工作原理。算法部分很简单,不是非常复杂。然而,我不确定在每个步骤中绘制树(森林)的最佳方法。它必须从屏幕上的 n 个节点(带有字符)开始,然后您会按下“下一个”按钮,它会选择两个具有最低权重(基于字符频率)的节点,并使它们成为新节点的子节点(仅具有权重-没有字符),然后更新屏幕/面板。
我以前做过 swing gui,我的技能并不特别,但我知道该怎么做。然而,我卡在了这个实现上。我现在已经写了几百行代码,但它不起作用,而且我认为它也很糟糕,所以我想“重新开始”并更好地计划它。因此,我只想请教一下如何跟踪节点的数据结构以及如何在屏幕上绘制它们的建议。
我曾尝试使用 JPanel 的 ArrayList 作为节点,并尝试将它们绘制到 null 布局上。我确信这很糟糕,我想知道更好的方法。可能是 GridBagLayout?
注意:不要使用 JTree。

3
你的第一个错误是使用空布局。 - Moonbeam
  1. 是否只有一个 JPanels 列,还是多于一个?
  2. JPanels 的宽度和高度是否相同?
  3. 你是否将你的 JPanels 放置到了 JScrollPane 中?
- mKorbel
@mKorbel,这是一棵二叉搜索树,我不知道还有什么可以告诉你的。它可以有1个节点或1000个节点(实际上我可能会限制它)。 - Bill
@Paul Sasik Jtree可以工作,但是我只会在时间紧迫,而且没有其他可用的方案时才使用它。 - Bill
@Bill:你仍然没有说明为什么你不想使用它。你能证明这个决定吗? - Hovercraft Full Of Eels
4个回答

2
一个好的选择是使用绘制树/图形的库。我过去使用Visual Library非常成功。
另一个可能的选择是Prefuse

我想用Prefuse来完成。虽然我以前从未使用过,但它听起来比自己绘制树更好。我需要先确保教授同意。谢谢。 - Bill

1

与其纠结于不同的Swing布局,你可以尝试自定义2D绘图。点击这里查看一个简单的示例,了解如何入门。


+1 自定义绘图是一个很好的方式。以下是一个更完整的示例:http://download.oracle.com/javase/tutorial/uiswing/painting/ - Jay Askren
我想这是我必须走的路。 - Bill
这是你的工具箱/技巧袋中应该拥有的好东西。当你遇到UI不按照预期行为(或根本不存在)时,2D绘图可以非常强大。它也并不难做。只需确保保持你的代码清洁和可管理性即可。 - Paul Sasik

1

使用一张树的图片(仅一次)和一个数组或其他数据结构来包含算法使用的“数据”。思考如何使用数据来确定应该绘制图像的位置。在算法运行后使用repaint()。

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

因此,您只有一个单独的框架、一个单独的面板和一个单独的BufferedImage对象。当您必须稍微进行数学计算以知道节点应该在哪些坐标上绘制时,技巧就会出现。

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


这是与Paul Sasik答案相同的想法,但更加复杂。您无需创建面板、绘制图像,然后将图像放在面板上,而可以直接在面板上绘制。事实上,您将使用完全相同的绘制方法。 - Jay Askren
你只有一个面板吗?我想保罗和我说的是同样的事情,只是我详细说明了一下。当然,你可以直接在面板上进行绘制,但你需要一个框架来将面板添加到其中,然后直接在该面板上绘制所有图像。 - rtheunissen

0
我们都曾经拥有过你现在所拥有的那个阶段 ;-)
首先,永远不要使用 Null layout,因为这样你会使尺寸变得静态,你的应用程序将无法在其他分辨率上正常工作。
最好使用的布局管理器是:GridBagLayout!
为什么呢?非常灵活,可以让你将所有组件放置在你想要的位置上,而不考虑分辨率。虽然难以设置,但最终效果更好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接