3

テキスト フィールドmin 1 max 12を追加できる JPanel を作成したいと考えています。(そのため、6 行 2 列で 12 個のテキスト フィールドを格納するのに十分なスペースがある JPanel を作成することにしました)。ユーザーがチェックするチェック ボックスの数によって異なります。さらに、これらのテキスト フィールドは、この JPanelで左端揃えで上から下に表示される必要があります。そして、これらのチェックボックスの 1 つがオフになるたびに、指定されたテキストフィールドが JPanel から削除され、残りはこの空のスペースに移動します (スペースをカバーするために上にシフトします)。

ということで、最初からすべて作成せず、必要に応じてテキストフィールドを作成し、setVisible(false) にします。これはより良い解決策だと思います。

例えば:

//each JTexyField have the same size

JPanel panel = new JPanel(new LayoutManager()); //in my case BoxLayout
If(checkboxEuro == chcecked) {
   JTextField fieldEuro = new JTextField(); 
   panel.add(fieldEuro);
}
else if(checkbox2 == ...) panel.add(fieldDolar);
...
If(checkboxDolar = = unchecked) panel.remove(fieldDolar);

(そして、このボタンがどこに表示されたかは気にしません。重要なことは、このボタンは、このパネルの既存のボタンの後に表示される必要があるということです)

私が得るもの

JPanel の下部に十分なスペースがない場合、LM はこのテキスト フィールドを上から次の列に追加する必要があります。この例では、別の (7 番目の) テキスト フィールドを追加しようとした 6x2 で、この列に十分なスペースがない場合、2 番目の列に表示されるはずですが、そうではありません。BoxLayout を使用すると、7 番目のテキスト フィールドが JPanel 上に半分、上半分に表示されました。

私は何をすべきか?Layout Manager を変更しますか、それとも JPanel の境界を越えることを許可しないオプションがありますか? (これが一番重要)

私はこれを取得します: パネル絵1、そしてこれが欲しい:パネル絵2

(言語については申し訳ありません - 初めてです)

- - 編集 - -

誤解がある場合:これを正しく理解させてください。TextField (この例では 7 番目) を追加するスペースがない場合に行を「スクロール」するのに役立つメソッド/オプションを別の LM で探しています。移動する必要があります。 TOPの次(列)へ。2 列は定義していませんが、この JPanel の領域は、JTextField の 2 列を保持するスペースがあったように思わせます。たとえば、12 個のフィールドすべてを追加して削除すると、残りの 2 番目のフィールドが上に移動して、このスペースをカバーする必要があります。

1 4            2 5
2 5  remove 1  3 6
3 6            4
4

1 に答える 1

0

これらのチェックボックス値がすべてわかった後、JPanelを作成しているように見えます。その場合は、最初に追加する必要のあるテキストフィールドの数を決定してから、レイアウトを作成します。コードを単純化するために、チェックボックス要素を配列に配置することをお勧めします。次に、次のようなことを行うことができます。

JCheckBox[] checkBoxes = new JCeckBox[12];
JTextField[] currencyFields = new JTextField[12];
//Then in your constructor you can initialize the Checkboxes, but not the text fields.
checkBoxes[0] = new JCheckBox("Euros");
checkBoxes[1] = new JCheckBox("Hungarian Forint");
// and so on.

//Compute how many text fields we need:
private int numberOfBoxesChecked() {
   c=0;
   for(JCheckBox cb : checkBoxes ) {
       if(cb.isSelected())
           c++;
   }
   return c;
}

これで、パネルを作成するときにnumberOfBoxesChecked()、レイアウトを初期化する方法を決定するために使用できます。

于 2013-03-09T13:19:01.657 に答える