摇摆外行的分页

时间:2013-01-26 00:43:08

标签: java swing pagination

在我开始之前,存在类似的问题(我的),我希望删除一个,因为我没有在那里解释我的观点,但不是这一点。谢谢。

首先,我没有代码,这只是一个我无法弄清楚的概念。但它很有趣(至少对我而言)。

你们都知道MSWord是如何工作的。你写东西。然后,当您填写页面时,它将创建一个新页面并开始在该页面上书写。如果您将更多文本粘贴到第一页,则所有内容都将被下推。如果删除页面上的大块文本,它将会吸收上一页上的一些文本。如果您正在处理例如图片,你有一个在页面顶部,减少它的大小我的原因它被吸到上一页,如果有足够的空间缩小版本的图片。

既然你正在考虑这种方式,我想将这个概念转移到Java Swing中。页面是JPanels,文本的图片和块(或行)是安装在页面JPanel上的JPanel。

我已经出现了(好吧,我撒谎,我有一些代码,但它是一团糟,但它无论如何都不起作用)使用填充方法,这在所有情况下都不起作用。如果你想知道原因,请在两行之间进行读取,否则只需跳过它。


因此,结构本身很容易复制,但保持它是一个痛苦的脖子。你看,有两种主要类型的事件可以发生:

a) height of the page content has increased
b) height of the page content has decreased

通过使用Filler作为页面的最后一个组件,并附加了componentAdapter(componentResized),您可以监视这些更改。

这些变化可以进一步分为:

a) element is added/removed to/from page
b) height of the element has increased/decreased 

考虑到这些事件,很多事情都可能发生。跳过简单的案例,请看这个例子:

Page 1:
{element 1
blabla
blabla}
{element 2
blabla}
{element 3}
{element 4
blabla
blabla
blabla
blabla}
{free space
---
---
---}

/

Page 2:
{element 1
blabla
blabla
blabla
blabla}
{element 2
blabla
blabla
blabla
blabla}
{element 3}
{element 4
blabla
blabla
blabla}

/

Page 3:
{element 1}
{element 2}
{element 3}
{element 4}
{element 5}
{free space
---
---
---
---
---
---
---
---
---}

每个页面的高度为15行。现在看看如果将第二页的元素1的高度减少一行会发生什么。它将变为4行高,使其适合上一页,被吸起来。这将在第二页上创建5行(1个删除的行+ 4个被吸入的行)值的可用空间。这将吸收第三页上的所有五个元素,并将第三页留空(现在应删除)。

这不起作用的原因是因为在删除时,会触发第二页的侦听器,并且必须同时按下顶部元素,并从上一页中吸取元素。因为它都是在一个监听器中完成的,所以我必须等待它执行才能在我的程序中注册视觉变化。因为它必须在页面上改变两件事,所以它会引起一些听众的混乱。页面高度减少了两次,但只注册了一次,最后我只能完全移动顶部或底部,或每侧只有一个组件。这不是一个很好的表达,但如果你了解挥杆的工作原理,你应该能够自己连接点。

正如我之前提到的,我已经为此编写了代码,但它很长很难以遵循,如果有人表示希望看到它,我可以在此发布。我在谈论SSCCE本身。它实际上不能缩短为几行代码。


我想要的是跳过编写一个算法来维护“文档”的结构并移动所有元素,因为这是一件非常复杂的事情,需要处理所有案例。

我想要的是另一种选择,我问你是否有任何想法。我想到的一件事就是拥有一个类似于JPanel的组件。它有固定的高度部分,可以填充其他组件,并在它们之间固定高度 - 不可用(?)或“固体”的部分。

它的工作方式是每当你向普及(?)部分添加东西时,它们会自动重新排列。如果某些东西不适合当前的populable部分,它只是移动到下一个部分(类似于verticall box布局的工作原理,向一个点添加一个东西将所有其他东西向下推),但是滑动实体部分。

由于我还必须能够告诉某个组件在哪个可以容纳的部分,我不知道在Java swing中是否可以创建这样的结构。

嗯,欢迎任何建议,包括外部图书馆。

请记住,整个文档都是包含页面的文档,这些页面将在JScrollPane的视口中一个接一个地放置,这是它应该看起来的唯一限制。

1 个答案:

答案 0 :(得分:3)

让布局完成工作:add()JPanel个实例,每个实例都有自己喜欢的基于内容的大小,到具有垂直布局的Box。将Box放入JScrollPane,可选择实施Scrolable。根据需要使用滚动窗格的行和列标题; JTable就是一个例子。您可以根据需要remove() Boxrevalidate()repaint()添加{{1}}面板。

附录:最初的答案仅涉及问题的观点方面。正如text components所做的那样,可能有助于更严格地分离模型和视图;从模型中删除内容并通知视图以相应地更新自身。为实现这一目标,提到了几种实现观察者模式的常用方法here