gpt4 book ai didi

java - Swing 外行分页

转载 作者:行者123 更新时间:2023-12-01 04:53:36 25 4
gpt4 key购买 nike

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

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

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

现在您正在以这种方式思考,我想将该概念转换为Java Swing。页面是JPanels,图片和文本块(或行)是安装在页面JPanel上的JPanels。

我已经提出了使用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/14528500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com