0

jlabels と jtextfields を動的に作成し、ユーザーがデータベースのテーブルにデータを挿入できる jPanel に追加しようとしています。

データベースからすべてのテーブル属性の名前を取得し、これらの名前ごとに jlabel と jtext を作成する必要があります。その結果は次のようになります (ラベル 5 は、jpanel の下部にスペースがない場合にのみ作成されます)。 期待される結果

GroupLayout と SequentialGroup を使用しようとしましたが、同様のことはできませんでした。私はそれを理解して解決できないという完全に厄介なことを達成しました。

達成結果

最初の画像のように、「ESTADO」というラベルが「SIGLA」ラベルの下にあり、「inserting table is:」テキストのラベルが画面の左側にある必要があります。

私のコードは次のとおりです。

        ArrayList<String[]> tableAtts = sql.getTableAttributeNames(table);

    javax.swing.GroupLayout jPDataInsertionLayout = new javax.swing.GroupLayout(jPDataInsertion);
    jPDataInsertion.setLayout(jPDataInsertionLayout);

    GroupLayout.SequentialGroup shgp = jPDataInsertionLayout.createSequentialGroup();
    GroupLayout.SequentialGroup svgp = jPDataInsertionLayout.createSequentialGroup();

    jPDataInsertionLayout.setHorizontalGroup(
            jPDataInsertionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
            .addGroup(shgp));

    jPDataInsertionLayout.setVerticalGroup(
            jPDataInsertionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
            .addGroup(svgp));


    //shgp.addContainerGap();
    svgp.addContainerGap().addComponent(jLInsertingTable);

    for (String[] values : tableAtts) {

        JLabel jLTableAtt = new JLabel(values[0]);
        JTextField jTFTableAtt = new JTextField();
        jTFTableAtt.setColumns(13);

        shgp.addComponent(true,jLTableAtt)
                .addGap(18, 18, 18)
                .addComponent(jTFTableAtt, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE);

        svgp.addGap(18, 18, 18)
                .addGroup(jPDataInsertionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(jLTableAtt, javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(jTFTableAtt,javax.swing.GroupLayout.Alignment.BASELINE ,javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE));
    }

    shgp.addComponent(jLInsertingTable);

編集:

#rcook が言ったことを使用して、グループを変更し、目的のものを作成することができました。これが私が作成したコードです:

ArrayList<String[]> tableAtts = sql.getTableAttributeNames(table);

    ArrayList<JLabel> attLabels = new ArrayList<>();
    ArrayList<JTextField> attFields = new ArrayList<>();

    javax.swing.GroupLayout jPDataInsertionLayout = new javax.swing.GroupLayout(jPDataInsertion);
    jPDataInsertion.setLayout(jPDataInsertionLayout);

    GroupLayout.SequentialGroup hsg = jPDataInsertionLayout.createSequentialGroup();

    ArrayList<String[]> tempTableAtt = new ArrayList<>(tableAtts);

    for(int i = 0; (!tempTableAtt.isEmpty()) && i < COLUMN_SIZE ; i++){

        GroupLayout.ParallelGroup innerhpg = jPDataInsertionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false);

        for(int j = 0; (!tempTableAtt.isEmpty()) && j < ROW_SIZE ; j++){
            String[] att = tempTableAtt.get(0);
            GroupLayout.SequentialGroup innerhsg = jPDataInsertionLayout.createSequentialGroup();

            JLabel jLTableAtt = new JLabel(att[0]);
            JTextField jTFTableAtt = new JTextField();
            jTFTableAtt.setColumns(13);

            attLabels.add(jLTableAtt);
            attFields.add(jTFTableAtt);

            innerhsg.addComponent(jLTableAtt)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(jTFTableAtt);

            innerhpg.addGroup(javax.swing.GroupLayout.Alignment.LEADING, innerhsg);

            tempTableAtt.remove(att);
        }

        hsg.addGap(18,18,18).addGroup(innerhpg);
    }

    jPDataInsertionLayout.setHorizontalGroup(
        jPDataInsertionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(jPDataInsertionLayout.createSequentialGroup()
            .addContainerGap()
            .addGroup(jPDataInsertionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(jLInsertingTable)
                .addGroup(hsg))));

    GroupLayout.SequentialGroup vsg = jPDataInsertionLayout.createSequentialGroup();

    vsg.addContainerGap()
       .addComponent(jLInsertingTable);

    for(int i = 0; i < tableAtts.size() && i < ROW_SIZE; i++){
        GroupLayout.ParallelGroup vpg = jPDataInsertionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE);

        vpg.addComponent(attLabels.get(i))
            .addComponent(attFields.get(i), javax.swing.GroupLayout.PREFERRED_SIZE,javax.swing.GroupLayout.DEFAULT_SIZE,javax.swing.GroupLayout.PREFERRED_SIZE);

        for(int j = 0; (tableAtts.size() > ROW_SIZE) && ((i+(ROW_SIZE*(j+1))) < tableAtts.size()) && j < COLUMN_SIZE; j++){
            vpg.addComponent(attLabels.get(i+(ROW_SIZE*(j+1))))
               .addComponent(attFields.get(i+(ROW_SIZE*(j+1))), javax.swing.GroupLayout.PREFERRED_SIZE,javax.swing.GroupLayout.DEFAULT_SIZE,javax.swing.GroupLayout.PREFERRED_SIZE);
        }

        vsg.addGap(18, 18, 18).addGroup(vpg);
    }

   jPDataInsertionLayout.setVerticalGroup(
           jPDataInsertionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
           .addGroup(vsg));

それが最善の解決策かどうかはわかりませんが、うまくいきます。

4

1 に答える 1

1

ラベルの最初の列を上下に並べるには、それらすべてのラベルを 1 つの並列グループに入れる必要があります。コードは、ラベル/フィールドの組み合わせごとに並列グループを作成し、それらのグループを個別に追加するため、それらは互いに同じ垂直 (または水平) 列 (または行) に表示されません。

コードでは、各列に表示するラベル/フィールドのペアの数を決定し、それらすべてを含む 1 つの並列グループを作成する必要があります。

(あるいは、ラベルとフィールドを含むパネルを作成し、それらのパネルのグループを同じ並列グループに入れることもできると思いました。ただし、すべてのラベルとフィールドを整列させる方が簡単だと思います。独自の列。)

于 2013-09-22T16:04:39.500 に答える