TransWikia.com

Создание формы на java

Stack Overflow на русском Asked on December 20, 2021

Нужно создать форму с 2-мя колонками (лэйбл и поле для ввода). Для пользователя должна быть предусмотрена возможность добавлять поля (например, добавить несколько имен с одинаковым лэйблом). Далее эти данные нужно считывать и передавать в другой класс. Проблема в том, что заранее неизвестно, сколько будет этих данных. Понимаю, что это должен быть массив, но не понимаю, как добавить в него эти данные. Как это лучше реализовать (swing, javafx)? Как вводить данные, чтобы потом их можно было считывать, не зная количества изначально? Пробовала javafx с GridPane, но из него потом не достать данные по номеру ячейки.

One Answer

Не до конца понимаю правильно ли я Вас понял, но накидал на Swing простенький пример с динамическим добавлением/удалением полей и выводом результата.

Интересующая Вас обработка событий происходит в слушателе кнопки buttonShawAllText.

import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

public class TestSwing {
    private static final Logger LOG = Logger.getLogger(TestSwing.class.getName());

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            frame.add(new PanelCommon());


            frame.setSize(500, 400);
            frame.setLocationRelativeTo(null);

            frame.setVisible(true);

        });
    }
}


class PanelTextField extends JPanel {

    private JTextField textField;
    private JButton buttonRemove;
    private JPanel panelParent;

    public PanelTextField(JPanel panelParent) {
        setLayout(new BorderLayout());
        this.panelParent = panelParent;
        textField = new JTextField();
        buttonRemove = new JButton("X");
        buttonRemove.addActionListener(e -> {
            SwingUtilities.invokeLater(() -> {
                PanelTextField.this.panelParent.remove(PanelTextField.this);
                PanelTextField.this.panelParent.revalidate();
                PanelTextField.this.panelParent.repaint();
            });
        });

        add(textField, BorderLayout.CENTER);
        add(buttonRemove, BorderLayout.EAST);
    }

    public String getText() {
        return textField.getText();
    }
}

class PanelCommon extends JPanel {

    private JLabel label;

    private List<PanelTextField> panelTextFieldList = new ArrayList();

    private JPanel panelContainer;

    private JButton buttonAdd;
    private JButton buttonShawAllText;

    public PanelCommon() {
        setLayout(new BorderLayout());
        label = new JLabel("Тестовый заголовок");
        add(label, BorderLayout.NORTH);

        panelContainer = new JPanel() {
            @Override
            public void remove(Component comp) {
                panelTextFieldList.remove(comp);
                super.remove(comp);
            }
        };
        panelContainer.setLayout(new BoxLayout(panelContainer, BoxLayout.Y_AXIS));
        add(new JScrollPane(panelContainer), BorderLayout.CENTER);


        buttonAdd = new JButton("Добавить новое поле");
        buttonAdd.addActionListener(e -> {
            SwingUtilities.invokeLater(() -> {
                PanelTextField panelTextField = new PanelTextField(panelContainer);
                panelTextFieldList.add(panelTextField);
                panelContainer.add(panelTextField);
                panelContainer.revalidate();
                PanelCommon.this.revalidate();
            });
        });

        buttonShawAllText = new JButton("Показать весь текст");
        buttonShawAllText.addActionListener(e -> {
            StringBuilder stringBuilder = new StringBuilder();
            for (int i = 0; i < panelTextFieldList.size(); i++) {
                PanelTextField panelTextField = panelTextFieldList.get(i);
                String text = panelTextField.getText();
                if (text != null && !"".equals(text)) {
                    stringBuilder.append((i + 1) + " - " + panelTextField.getText());
                    stringBuilder.append("n");
                }

            }

            JOptionPane.showMessageDialog(PanelCommon.this, stringBuilder.toString());

        });

        JPanel panel = new JPanel();
        panel.add(buttonAdd);
        panel.add(buttonShawAllText);
        add(panel, BorderLayout.SOUTH);
    }
}

Answered by ezhov_da on December 20, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP