【问题标题】:Swing layman pagination摇摆外行分页
【发布时间】: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


【解决方案1】:

让布局完成工作:JPaneladd() 实例,每个实例都有基于内容的首选大小,Box 具有垂直布局。将Box 放入JScrollPane,可选择实现Scrolable。根据需要使用滚动窗格的行和列标题; JTable 就是一个例子。您可以根据需要从Boxrevalidate()repaint()remove() 一个面板。

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

【讨论】:

  • 你们都没有抓住重点......我不想创建一个漂亮的布局,我已经做到了。如果它对我的问题有帮助,我可以潜在地改变它的创建方式,而无需真正从视觉上改变它。我想要的类似于 MS Word 如何管理它的文本行或任何其他组件。如果您继续添加到页面,它会将所有内容向下推,如果您删除某些内容,则会将所有内容拉上来......问题是我不希望它作为一个视觉实体,而是作为视觉上分离的实体(页)...
  • 喜欢 Word 的页面视图?将框背景设置为灰色并为面板添加边框。
  • 对不起,我以为你又错过了这一点,我在添加附录之前对答案投了反对票(或者我设法错过了它)......好吧,我可以每次重绘所有内容进行了更改,但确实效率不高,如果我仅在需要时尝试重绘,我会再次遇到相同的问题...我会再考虑一下,我可能会想出一个使用此的解决方案.. .
  • 没问题;我很感激反馈。作为参考,JTable 使用 flyweight 模式 解决渲染效率问题,如图here。我没有仔细检查文本组件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-30
  • 2017-10-11
相关资源
最近更新 更多