2010-11-22 38 views
4

イベントに基づいてコンポーネントを動的に挿入できるパネルを作成しようとしています。パネルは、行ごとに可変量のコンポーネントを使用する行ベースです。しかし、既存のコンポーネント間にコンポーネントを挿入する際に問題があります。例えばMigLayoutに「セル」を挿入する方法はありますか?

、私は(ラインがMigLayout細胞を表す)のレイアウトを以下している場合:

+----+----+----+ 
| X1 | X2 | X3 | 
+----+----+----+----+ 
| Y1 | Y2 | Y3 | Y4 | 
+----+----+----+----+ 

は、それが取得するために、行XとYの間でセルを作成することが可能です:

+----+----+----+ 
| X1 | X2 | X3 | 
+----+----+----+ 
| Z1 | 
+----+----+----+----+ 
| Y1 | Y2 | Y3 | Y4 | 
+----+----+----+----+ 

私はcontent.add(component, "cell 1 0, wrap");を試しましたが、コンポーネントをセルのY1に挿入します。

私が今までに持っていた唯一の解決策は、content.add(component, "wrap", index);です。しかし、これには前のコンポーネントの合計数がわかっている必要があります。

答えて

1

代わりの「セル」という概念を使って、あなたはmigLayoutであなたの細胞のために「絶対」位置を使用し、隣接セルの座標を参照することで一緒に細胞を接着できます。 migLayoutで名前を参照するには、セルに名前を付ける必要があります。

次に、セルの座標の名前参照を変更することによっていつでもセルを並べ替えることができます。影響を受けたセルに対してsetComponentConstraints(...)を呼び出すだけで済みます。

f.i.あなたはセルZを挿入しています。

miglayoutデモアプリケーションを参照してください。 一部のコードは次のようになります。

myPanel.add(createCell("X1"), "pos 0 0 100 100"); 
myPanel.add(createCell("X2"), "pos X1.x2 0 200 X1.y2"); 

などです。あなたは、セル "Z" を挿入

myPanel.add(createCell("Z"), "pos 0 X1.z2 200 100"); 

は、あなただけのZ.y2へX1.y2からY1のY基準を変更する必要があります。

私はsthしました。マルチスプリットペインのようなものを作成するのに似ており、うまくいくようです。

+0

には、セル「Y1」を再挿入する以外に、参照を更新する別の方法がありますか? –

+0

はい、MigLayoutにsetConstraints()のようなものがあります – Philippp

0

これが最適な解決策であるかわかりませんが、新しいコンポーネントを含めて、コンテナ全体を再度レイアウトすることができます。私はあなたが望むようにコンポーネントを挿入する方法はないと思います。

うまくいけば間違っています。

これを行うにはあまりオーバーヘッドではありません。ユーザーが気付くのが早いでしょう。

0

一般的に、パネルとスイングコンポーネントは動的再構成のために設計されていないため、psantonのソリューションはおそらく最も安全かつ簡単な方法です。既存のコードを使用して要素を再追加する前に、removeAll()を呼び出してパネルを再利用することができます。

インデックスを使用するという自分の提案がうまくいくならば、モデル内の先行する行を追跡することは非常に簡単に行うことができ、コンポーネントのリストラは少し速くなります。何百ものサブ要素がなければ、違いを感じることはまずありません。

+0

私は再びすべてのコンポーネントを中継して持っている問題は、スクロール可能な領域内のビューのシフトは、コンポーネントを削除して、再度追加されたときということです。私は同じ目に見える範囲にスクロールする信頼できる方法を見つけることができないようです。 –

+0

私はあなたがビュー矩形の値を保存することでこれを行うことができることを発見しました。 Rectangle savedViewport = pane.getViewport()。getViewRect();.後でもう一度ロードするには、text.scrollRectToVisible(savedViewport)を呼び出します。 (この場合の 'text'は、ペイン内のコンポーネントであるJTextAreaです)。 – BoffinbraiN

1

新しいコンポーネントを直接挿入する方法はありませんが、コピーパスタなしで既存のコンポーネントをすべて削除して再追加するのは簡単です。これの重要な点は、元のコンポーネントのレイアウトが完了していてもアクセス可能である必要がなく、複数の場所にすべてのレイアウトコードを持つ必要がないことです。

Map<Component,Object> constraintMap = migLayout.getConstraintMap(); 
    Component[] allComps = jPanel.getComponents(); 
    jPanel.removeAll(); 
    for (Component c : allComps) { 
    if (condition_to_insert) { 
     jPanel.add(insertComponent, new CC()); 
    } 
    jPanel.add(c, constraintMap.get(c)); 

    } 
    migLayout.invalidateLayout(jPanel); 
2

「hidemode」助けにあなたを制約:

new MigLayout("hidemode 3","","[][][]") 
関連する問題