2

レイアウト プロパティが GridBagLayout である JPanel から拡張するクラスを作成しました。私は基本的に JLabels (グリッド) の配列を表示する必要がありますが、一度作成されたコンポーネントを置き換えることはできません。変更したいコンポーネントを削除してから、新しいコンポーネントを配置しようとしましたが、結果は奇妙です。たとえば、10x10 JLabels の配列を作成し、position[0][0] と position[9][9] を次のコードに置き換えたいとします。

//At first i have the jpanel layout completely filled

this.remove(0);
this.add((JLabel) start, 0);  //This was created with GridBagLayout.gridx = 0 and GridBagLayout.gridy = 0 and it's fine

this.remove(99);
this.add((JLabel) end, 99); //This was created with GridBagLayout.gridx = 9 and GridBagLayout.gridy = 9 and it's out of grid
this.revalidate();

しかし、position[0][0] だけは問題ないように見えます。コンポーネントを交換するにはどうすればよいですか?

ここに画像の説明を入力

4

2 に答える 2

6

ではGridBagLayout、各コンポーネントは に関連付けられていGridBagConstraintsます。新しいコンポーネントは新しいGridBagConstraints

ただし、特定のコンポーネントに関連付けられた制約を取得することはできます。

Component toRemove = getComponent(0);
GridBagLayout layout = (GridBagLayout)getLayout();
GridBagConstraints gbc = layout.getConstraints();
remove(toRemove);
add(new JLabel("Happy"), gbc, 0);

これにより、削除するコンポーネントで使用されているものと同じ制約を使用してコンポーネントが追加されます。

gridxもちろん、これはすべて/gridy制約を割り当てていることを前提としています...

于 2013-03-07T05:35:59.513 に答える
1

私は以下を使用して問題を解決します:

this.setComponentZOrder(newItem, 0);

そのため、実際にはJpanelでオブジェクトを削除しませんでしたが、古いオブジェクトの上に新しいオブジェクトを配置しました。

于 2013-03-07T19:52:12.970 に答える