0

我正在尝试动态创建 jlabels 和 jtextfields,然后添加到 jPanel 中,用户可以在其中将数据插入到数据库中的表中。

我从数据库中检索所有表属性的名称,然后我必须为每个名称创建一个 jlabel 和一个 jtext。它的结果应该如下所示(只有在 jpanel 底部没有更多空间时才应该创建标签 5): 预期结果

我尝试使用 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

为了使您的第一列标签位于另一列之下,所有这些标签都需要位于一个平行组中。您的代码为每个标签/字段组合创建并行组,并分别添加这些组,因此它们不会出现在彼此相同的垂直(或水平)列(或行)中。

您的代码将需要确定要在每一列中显示多少标签/字段对,并创建一个包含所有标签/字段的并行组。

(或者,我想你可以有一个包含标签和字段的面板,并将这些面板中的一组放在同一个平行组中。我认为对齐所有标签和字段会更容易,但是,如果它们在他们自己的专栏。)

于 2013-09-22T16:04:39.500 回答