Java 使用GridBagLayout单击按钮后添加组件的新行

Java 使用GridBagLayout单击按钮后添加组件的新行,java,swing,layout-manager,gridbaglayout,Java,Swing,Layout Manager,Gridbaglayout,我试图在单击前一行中的按钮后添加新行组件 这一数字: 显示单击“添加”按钮后要在下一行复制的行 我试图做的事情给了我这个结果: 但只有在我第一次单击“添加”按钮,然后完成项目选择之后 如何使“添加”按钮独立于其他组件,以及如何调整可视化 代码如下: ////// First row // First Column gbc.weightx = 0.5; gbc.gridx = 1; gbc.gridy = 0; this.add(this.field,

我试图在单击前一行中的按钮后添加新行组件

这一数字:

显示单击“添加”按钮后要在下一行复制的行

我试图做的事情给了我这个结果:

但只有在我第一次单击“添加”按钮,然后完成项目选择之后

如何使“添加”按钮独立于其他组件,以及如何调整可视化

代码如下:

////// First row
    // First Column
    gbc.weightx = 0.5;
    gbc.gridx = 1;
    gbc.gridy = 0;
    this.add(this.field, gbc);

    // Second Column
    gbc.gridx++;
    this.add(this.operator, gbc);

    // Third Column
    gbc.gridx++;
    this.add(this.value, gbc);

    ////// Second row
    gbc.gridx = 0;
    gbc.gridy = 1;
    this.add(rowNumber, gbc);

    // First Column
    gbc.gridx = 1;
    //////////////////////////////////////////////////// SET DIMENSION
    attrList.setPrototypeDisplayValue("XXXXXXXXXXXXXXXXXXXXXX");
    this.add(attrList, gbc);

    // Second Column
    gbc.gridx = 2;
    //////////////////////////////////////////////////// SET DIMENSION
    opListString.setPrototypeDisplayValue("XXXXXXX");
    this.add(opListString, gbc);

    // Third Column (Hidden)
    gbc.gridx = 3;
    ////////////////////////////////////////////////////SET DIMENSION
    sessoBox.setPrototypeDisplayValue("XXXXXXXXXXXXXX");
    this.add(sessoBox, gbc);
    sessoBox.setVisible(false);
    ////////////////////////////////////////////////////SET DIMENSION
    titoloBox.setPrototypeDisplayValue("XXXXXXXXXXXXXXXXXXXXXXXXXXX");
    this.add(titoloBox, gbc);
    titoloBox.setVisible(false);


    // Fourth Column
    gbc.gridx = 4;
    remButton = new JButton("Rem");
    this.add(remButton, gbc);

    // Add row JButton
    gbc.gridx = 5;
    gbc.gridy = 1;
    this.add(addRow, gbc);

    // Add empty JLabel to positioning components at the top
    gbc.weighty = 10;
    gbc.gridx = 1;
    gbc.gridy = 2;
    gbc.anchor = GridBagConstraints.FIRST_LINE_START;
    this.add(emptyLabel, gbc);

    // Add Action Listener on Attributes to choose
    // Display Value Components based on item selected
    attrList.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e) {
            String choose = attrList.getSelectedItem().toString();

            switch(choose) {
            case "----------------": {
                removeItem();
                break;
            }
            case "Sex": {
                removeItem();
                addOpsString();
                addValueComp2(sessoBox);
            }
            }
        }
        });

    // Remove row
    /*remButton.addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent e) {
            remButton.remove((addRow));
        }
    });
    */

    // Add row
    addRow.addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent e) {
            gbc.gridy = ++rowNum;
            gbc.gridx = 0;
            panel.remove(emptyLabel);
            panel.add(new JLabel(Integer.toString(rowNum)), gbc);
            gbc.gridx++;
            panel.add(attrList);
            gbc.gridx++;
            panel.add(opListString);
            gbc.gridx++;
            gbc.gridx++;
            panel.add(remButton);
            gbc.gridx++;
            panel.add(addRow);

            // Add empty JLabel to positioning components at the top
            gbc.weighty = 10;
            gbc.gridx = 1;
            gbc.gridy = rowNum + 1;
            gbc.anchor = GridBagConstraints.FIRST_LINE_START;
            panel.add(emptyLabel, gbc);
        }
    });

如果您希望复制整行,那么您可能应该将每一行设置为一个组件,例如JTable或JPanel,然后将这些组件中的每一个放置在另一个JPanel或JFrame中。然后可以使用Object.clone()方法创建每个新组件(行)。添加行时,可能需要打包()或验证()新的外部组件,特别是在外部窗口的大小发生更改时


或者,如果对象数量有限,则可以在初始化时创建所有对象,并在需要时使用setVisible()显示每个对象。

1)该任务似乎更适合
JTable
。2) 为了更快地获得更好的帮助,请添加or。这不是一个直接的答案-但对于任何Swing布局任务,我只使用MigLayout: