2

こんにちは StackOverflow ユーザー!

問題があり、問題の解決策を見つけましたが、解決策が最適ではないと感じています。自分のやりたいことを達成するために力ずくを使ったような気がして、自分がやりたいことを達成するためのより良い方法があるのではないかと考えています.

基本的に私が持っているのは、GridBagLayout を使用した Java GUI アプリケーションです。レイアウトは基本的に常に中央揃えであるため、GridBagLayout を使用します。他の何かが追加されると、すべてが上下左右に移動します (新しいオブジェクトが追加された場所によって異なります)。問題は、私のプログラムでも特定のオブジェクトを削除する必要があることです (他のコード ブロックで何が起こるかによって異なります)。このように 4 つのオブジェクトが並んでいて[1] [2] [3] [4]、 を削除したいとし[3]ます。私は基本的にレイアウトを に変更し[1] [2] [3]、基本的に の後にすべてをシフトしたいと考えています[3]。これを視覚的に行うのに問題はありませんでした (GridBagLayout の仕組みのため)。ただし、ディスプレイに何か新しいものを追加する場合[4]は、視覚的な位置が重なるため、オーバーラップが発生します。[3]、GridBagPosition (他に何と呼ぶべきかわからない) は変更されませんでした。そこで、削除プロセスのために以下のコードを実装しました。

public void removeSubImagePanel (int subPanelIdx) {
    int x, y, nextX, nextY;
    this.remove(this.portraits[subPanelIdx]);

    nextX = this.portraits[subPanelIdx].getGbx();
    nextY = this.portraits[subPanelIdx].getGby();

    for (int i = subPanelIdx; i < this.numberOfPortraits; i++) {
        x = nextX;
        y = nextY;

        this.portraits[i] = this.portraits[i+1];
        if (this.portraits[i+1] != null) {
            nextX = this.portraits[i+1].getGbx();
            nextY = this.portraits[i+1].getGby();
            this.portraits[i].getObject().setSubPanelIdx(i);
            gbc.gridx = x;
            gbc.gridy = y;
            this.portraits[i].setGbLocation(x, y);
            gb.setConstraints(this.portraits[i], gbc);
        }
    }
    this.portraits[this.numberOfPortraits] = null;
    this.numberOfPortraits--;
}

基本的に、GridBagLayout の X と Y の位置を保持するために、「portraits」オブジェクトに 2 つの整数変数を追加しました。そうすれば、 position[3]を取得し、[4]set [4]s position の位置を[3]のあった場所に取得し、( があった場合は[5]、 set[5]の position を[4]の古い位置に設定し、最後の要素に到達するまで、というように繰り返すことができました。

これらの整数を追加しなければならないのは「強引すぎる」と感じます。オブジェクトごとに個別の GridBagConstraint を作成すると、さらに悪いことになると思います。私がする必要があるこのシフトを行うためのより良い方法はありますか?

申し訳ありませんが、この質問はかなり長いです。こんなに長くなるとは思いませんでした。これはまだ大丈夫だと思います。私が不明確で、説明が必要な場合は、お気軽にお尋ねください!

編集:これが CodeReview スタック交換にあった方がよいでしょうか? 実際には、そこにある方が理にかなっているようです。よくわかりませんが。

4

2 に答える 2

2

このは、コンテナーからすべてのコンポーネントを削除し、各コンポーネントを任意の順序で完全に置き換えることができることを示しています。validate()コンポーネント自体は変更されないため、コンテナを囲むのに必要な時間はごくわずかです。

于 2012-06-12T19:55:01.907 に答える
2

このプロジェクトの要件が何であるかはわかりませんが、Spring Layoutをチェックアウトします。このレイアウトでは、次のようなものを指定できます。

the left of [1] should be 10 pixels from the left of the panel
the right of [1]  should be 10 pixels from the left of [2]
etc.

あなたがここで説明しているような素敵な流動的なレイアウトを実装する方がはるかに簡単です(imo)。

編集:議論に追加しようとするだけです:

おそらく、Panel から拡張された PortraitPanel というクラスがあり、そこで画像パネルのリストを維持できます。パブリック メソッドを持つことができます: add(int index); 削除 (int インデックス);

そのため、add(2) を呼び出すと、そのパネルがそのインデックスのリストに追加されます。次に、インデックス - 1 とインデックス + 1 のパネルを取得し、これらの制約を調整するルーチンを実行して、それらを配置します。新しく追加されたパネルの両側。同様に、削除の場合は、インデックス - 1 を取得し、その制約をインデックス + 1 の隣に配置するように設定してから、インデックスの項目を削除できます。繰り返しますが、SpringLayout を使用すると、ウィンドウのサイズ変更などの際に物事が流動的になるように設定するのが非常に簡単になります。

うまくいけば、これはあなたがやろうとしていることと一致しています。

于 2012-06-12T19:21:45.650 に答える