【发布时间】:2013-01-10 01:14:24
【问题描述】:
在我开始之前,存在(我的)类似的问题,我希望删除那个问题,因为我没有很好地解释我的观点,但不是这个问题。谢谢。
首先,我没有代码,这只是一个我想不通的概念。但这很有趣(至少对我而言)。
你们都知道 MSWord 是如何工作的。你写东西。然后,当您填写一个页面时,它将创建一个新页面并开始在该页面上书写。如果您将更多文本粘贴到第一页,所有内容都将被下推。如果您删除页面上的一大块文本,它会吸收前一页上的一些文本。如果你正在处理例如图片并且您在页面顶部有一个,如果有足够的空间放置图片的缩小版本,则缩小它的大小会导致它被吸到上一页。
既然您是这样想的,我想将这个概念转移到 Java Swing 中。页面是 JPanel,图片和文本块(或行)是适合页面 JPanel 的 JPanel。
我想出了一个使用 Filler 的方法(好吧,我撒谎了,我有一些代码,但它是一团糟,而且无论如何它都不起作用),这在所有情况下都不起作用。如果您想知道原因,请阅读两行之间的内容,否则请跳过它。
因此,结构本身很容易复制,但维护它是一件令人头疼的事情。你看,有两种主要类型的事件可能发生:
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 的组件。它会有固定的高度部分,可以用其他组件填充,并且在它们之间有固定的高度部分是不可填充的(?)或“实心”。
它的工作方式是每次您向可填充(?)部分添加一些东西时,它们会自动重新排列。如果某些内容不适合当前可填充的部分,则只是将其移至下一个(类似于垂直框布局的工作原理,将一个内容添加到一个点会推动所有其他内容向下),但会跳过实体部分。
由于我还必须能够判断某个组件在哪个可填充部分中,我不知道在 Java swing 中是否可以创建这样的结构。
欢迎任何建议,包括外部库。
请记住,整个文档是包含页面的文档,这些页面将一个接一个地放置在 JScrollPane 的视口中,这是对其外观的唯一限制。
【问题讨论】:
-
发布一些代码,发布SSCCE。用文字描述代码会阻止人们阅读您的帖子并且只会带来混乱,而显示代码将有助于其他人理解您的问题并消除任何可能的歧义。
-
如果我发布我所拥有的,即使删除了所有不必要的内容,如果您不熟悉它,仍然会有很多代码难以阅读。
-
然而 5 小时后,您得到了一个似乎并不让您满意的答案(尽管它是我非常亲爱的朋友之一@trashgod)。我不会太担心代码的复杂性:这里真正的专家对此非常熟悉。我看不出重现一个问题的代码必须很长(您几乎总是可以将大问题拆分为较小的问题并一次解决一个问题)。我把这个留给你......,我不是那个有问题的人;-)
-
要复制问题,我必须按照一组规则移动一堆东西。我还必须创建一堆东西,或者,由于问题的性质,让你可以创建/删除一堆东西。所有这些代码,再加上规则的复杂性,占用了相当多的空间。此外,我知道我的代码有什么问题,我知道我将如何修复它,但解决方案是编码的痛苦(并且以后难以维护),所以真正的问题是提出一个替代方案到我的填充侦听器方法。
-
听起来更像是您需要自定义布局管理器(或两个)。一个负责在页面上布局组件,另一个负责确定需要哪些页面组件
标签: java swing pagination