4

イベントに基づいてコンポーネントを動的に挿入できるパネルを作成しようとしています。パネルは行ベースで、行ごとに可変量のコンポーネントがあります。ただし、既存のコンポーネントの間にコンポーネントを挿入するのに問題があります。

たとえば、次のレイアウトがある場合(線は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);です。ただし、これには、先​​行するコンポーネントの総数を知っている必要があります。

4

5 に答える 5

1

「セル」の概念を使用する代わりに、migLayout でセルに「絶対」配置を使用し、隣接するセルの座標を参照してセルを接着することができます。migLayout でセルを参照するには、セルに名前を付ける必要があります。

次に、セルの座標の名前参照を変更することで、いつでもセルを再配置できます。影響を受けるセルに対して setComponentConstraints(...) を呼び出すだけです。

fi you for insertige cell Z, you

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

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");

Y1 の y 参照を X1.y2 から Z.y2 に変更するだけです。

私はそうしました。一種のマルチスプリットペインを作成するのと似ており、うまく機能しているようです。

于 2011-02-02T06:22:20.813 に答える
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);
于 2011-01-15T00:16:54.657 に答える
0

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

インデックスを使用するという独自の提案も機能する場合は、それを使用します。モデル内の先行する行を追跡することは非常に簡単に実装でき、コンポーネントの再構築は少し速くなりますが、そうなる可能性は低いです。何百ものサブ要素がない限り、違いを感じるでしょう。

于 2010-12-15T12:25:22.950 に答える
0

これが最善の解決策かどうかはわかりませんが、新しいコンポーネントを含め、コンテナー全体を再度配置することができます。コンポーネントを思い通りに挿入する方法はないと思います。

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

しかし、これを行うのに大きなオーバーヘッドは発生しないはずであり、ユーザーが気付くために高速化する可能性があります!

于 2010-11-25T21:21:30.647 に答える