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

239
28 февраля 2018, 08:58

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

Answer 1

Не до конца понимаю правильно ли я Вас понял, но накидал на 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);
        }
    }
READ ALSO
Использование своего профиля Firefox в Selenium+Java

Использование своего профиля Firefox в Selenium+Java

Как вытащить свой профиль firefox и запустить тест, используя этот профиль, при условии, что тест запускается на разных машинах и везде имя профиля...

239
Firebase post запрос

Firebase post запрос

Добрые деньФормирую запрос в Firebase API через okhttp либу кодом:

234
Ошибка в запуске jar файла

Ошибка в запуске jar файла

Имеется maven проект с плагином компиляции comzenjava

253