こんにちは 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 スタック交換にあった方がよいでしょうか? 実際には、そこにある方が理にかなっているようです。よくわかりませんが。