在开始之前,存在类似的问题(我的),我希望删除该问题,因为我在那儿并没有很好地解释我的观点,但我对此并没有解释。谢谢。
首先,我没有代码,这只是我不知道的概念。但这很有趣(至少对我而言)。
你们都知道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的组件。它将具有固定的高度部分,可以填充其他组件,并且它们之间的固定的高度部分是不可填充的(?)或“实心”。
它的工作方式是,每次将某些内容添加到可填充(?)部件时,它们都会自动重新排列。如果某项不适合当前的可填充部分,则将其移至下一个(类似于Verticall Box布局的工作原理,将一件事添加到一个点会将所有其他部分向下推),但会跳过实心部分。
由于我还必须能够确定某个组件位于哪个可填充部分中,因此我不知道在Java swing中是否可以创建这样的结构。
好吧,欢迎您提供任何建议,包括外部库。
请记住,整个文档是带有页面的文档,这些页面将在JScrollPane的视口中一个接一个地放置,这是对其外观的唯一限制。
最佳答案
让布局完成工作:将add()
的JPanel
实例(根据内容分别具有自己的首选大小)更改为具有垂直布局的Box
。将Box
放在JScrollPane
中,可以选择实现Scrolable
。根据需要使用滚动窗格的行和列标题; JTable
是一个示例。您可以根据需要从remove()
,Box
和revalidate()
中repaint()
一个面板。
附录:最初的答案仅解决了问题的观点。像text components一样,它可能有助于分离模型并更严格地查看。从模型中删除内容并向视图发送信号以进行相应的更新。为了实现这一点,here提到了几种用于实现观察者模式的常见方法。
关于java - Swing 外行分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14532560/