1

始める前に、同様の質問 (私のもの) が存在します。私はそこで私の要点をうまく説明していないので削除してほしいのですが、この質問は削除してください。ありがとうございました。

まず第一に、私にはコードがありません。これは私が理解できない概念にすぎません。でも面白いです(少なくとも私にとっては)。

MSWord がどのように機能するかは皆さんご存知でしょう。あなたはものを書きます。次に、ページを埋めると、新しいページが作成され、そのページに書き込みが開始されます。最初のページにさらにテキストを貼り付けると、すべてが押し下げられます。ページ上の大量のテキストを削除すると、前のページのテキストの一部が吸い上げられます。たとえば、写真を扱っていて、ページの上に写真がある場合、サイズを縮小すると、写真の縮小版に十分なスペースがある場合、前のページに吸い込まれてしまいます。

このように考えるようになったので、その概念を Java Swing に移したいと思います。ページは JPanel であり、画像とテキストのチャンク (または行) は、ページ JPanel に取り付けられた JPanel です。

私は、すべての場合に機能するとは限らない、フィラーを使用する方法を思いつきました(うそをつきました、コードがありますが、それは混乱していて、とにかく機能しません)。理由を知りたい場合は、2 行間を読んでください。それ以外の場合はスキップしてください。


そのため、構造自体は簡単に複製できますが、それを維持するのは首の痛みです。発生する可能性のあるイベントには、主に 2 つのタイプがあります。

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 行です。2 ページ目の要素 1 の高さを 1 行減らすとどうなるか見てみましょう。4行の高さになり、吸い込まれて前のページに収まります。これにより、2 ページ目に 5 (削除された 1 行 + 吸い上げられた 4 行) 行分の空き領域が作成されます。これにより、3 ページ目の 5 つの要素がすべて吸い上げられ、3 ページ目が空白のままになります (これは削除されます)。

これが機能しない理由は、削除時に 2 番目のページのリスナーがトリガーされ、最上位の要素を押し上げ、前のページから要素を吸い上げる必要があるためです。すべてがリスナーで行われるため、視覚的な変化をプログラムに登録するには、リスナーが実行されるのを待つ必要があります。ページ上の 2 つのことを変更する必要があるため、ある種のリスナーの混乱が生じます。ページの高さは 2 回縮小されますが、登録されるのは 1 回だけです。最終的には、上部または下部、または両側の 1 つのコンポーネントのみを完全に移動できます。これはあまり良い説明ではありませんが、swing がどのように機能するかを理解していれば、点と点を自分で接続できるはずです。

前に述べたように、私はそのためのコードを書きましたが、それは長くて理解するのが難しいので、誰かが見たいと思っている場合は、ここに投稿できます. そして、私はSSCCE自体について話している. 数十行のコードに短縮することはできません。


私が望むのは、「ドキュメント」の構造を維持し、すべての要素を移動するアルゴリズムを書くことをスキップすることです。これは、非常に複雑なことであり、多数のケースをすべて取り上げることです。

私が欲しいのは代替案であり、何かアイデアがあるかどうか尋ねています. 私の頭に浮かんだことの 1 つは、JPanel に似たコンポーネントを持つことです。他のコンポーネントを配置できる固定の高さ部分と、それらの間に配置できない(?)または「ソリッド」な固定の高さ部分があります。

機能する方法は、populable (?) パーツに何かを追加するたびに、それらが自動的に再配置されることです。何かが現在の配置可能な部分に収まらない場合は、次の部分に移動されます (垂直のボックス レイアウトが機能する方法と同様に、スポットに 1 つ追加すると他のすべてが押し下げられます) が、固体部分はスキップされます。

特定のコンポーネントがどの部分にあるのかを知ることもできる必要があるため、そのような構造を Java Swing で作成できるかどうかはわかりません。

外部ライブラリも含めて、どんなアドバイスでも大歓迎です。

このドキュメント全体は、JScrollPane のビューポートに次々と配置されるページを含むドキュメントであり、それがどのように見えるべきかについての唯一の制限であることに注意してください。

4

1 に答える 1

3

レイアウトに作業を任せます。それぞれがコンテンツに基づいて独自の優先サイズを持つadd()インスタンスから、垂直レイアウトを持つインスタンスまで。を、オプションで実装します。必要に応じて、スクロールペインの行ヘッダーと列ヘッダーを使用します。例です。、および必要に応じて、からパネルを作成できます。JPanelBoxBoxJScrollPaneScrolableJTableremove()Boxrevalidate()repaint()

補遺:最初の回答は、問題のビューの側面のみを対象としていました。テキストコンポーネントのように、モデルを分離してより厳密に表示すると役立つ場合があります。モデルからコンテンツを削除し、それに応じてそれ自体を更新するようにビューに通知します。これを実現するために、オブザーバーパターンを実装するためのいくつかの一般的なアプローチをここで説明します。

于 2013-01-25T19:55:55.373 に答える