Добавить новую строку компонента после нажатия кнопки, используя GridBagLayout - PullRequest
0 голосов
/ 22 апреля 2019

Я пытаюсь добавить новую строку компонентов после нажатия кнопки, расположенной в предыдущей строке.

Эта цифра:

https://i.stack.imgur.com/TkbZf.png

показывает строку, которую я хочу скопировать в следующую строку после нажатия кнопки «Добавить».

То, что я пытался сделать, дает мне такой результат:

https://i.stack.imgur.com/1zgWR.png

но только после того, как я впервые нажал кнопку «Добавить», после чего выбор элемента был сделан.

Как сделать кнопку «Добавить» независимой от других компонентов и как настроить визуализацию?

Вот код:

////// 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);
        }
    });

1 Ответ

0 голосов
/ 22 апреля 2019

Если вы хотите повторить всю строку, вам, вероятно, следует настроить каждую строку как компонент, такой как JTable или JPanel, а затем поместить каждый из этих компонентов в другой JPanel или JFrame.Затем вы можете использовать метод Object.clone () для создания каждого нового компонента (строки).Возможно, вам понадобится упаковать () или проверить () новый внешний компонент при добавлении строки, особенно если изменяется размер внешнего окна.

В качестве альтернативы, если у вас есть конечное число объектов, выможете создать их все, когда вы инициализируете и используете setVisible (), чтобы показать каждый из них, когда это необходимо.

...