java - Swing 外行分页

标签 java swing pagination

在开始之前,存在类似的问题(我的),我希望删除该问题,因为我在那儿并没有很好地解释我的观点,但我对此并没有解释。谢谢。

首先,我没有代码,这只是我不知道的概念。但这很有趣(至少对我而言)。

你们都知道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()Boxrevalidate()repaint()一个面板。

附录:最初的答案仅解决了问题的观点。像text components一样,它可能有助于分离模型并更严格地查看。从模型中删除内容并向视图发送信号以进行相应的更新。为了实现这一点,here提到了几种用于实现观察者模式的常见方法。

关于java - Swing 外行分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14532560/

相关文章:

java - 使用 Java 为某种信使应用程序创建动态 JLabel

javascript - 如何使用偏移量在 Sequelize 中正确获取分页结果?

javascript - JQuery1.8 数据表点击按钮保存状态

java - 如何将数据持久保存到磁盘,随机更新数据,并将其有效地流回 RAM?

java - 我们如何使用mockito来获取对象

java - 在java应用程序中使用js和css(嵌入式浏览器功能)

java - 更新分页。是否可以?

java - 动态下拉从 jsp 返回空值

java - 访问匿名类方法的问题

Java GUI 线程和更新