Stack Overflow на русском Asked on December 20, 2021
Нужно создать форму с 2-мя колонками (лэйбл и поле для ввода). Для пользователя должна быть предусмотрена возможность добавлять поля (например, добавить несколько имен с одинаковым лэйблом). Далее эти данные нужно считывать и передавать в другой класс. Проблема в том, что заранее неизвестно, сколько будет этих данных. Понимаю, что это должен быть массив, но не понимаю, как добавить в него эти данные. Как это лучше реализовать (swing, javafx)? Как вводить данные, чтобы потом их можно было считывать, не зная количества изначально? Пробовала javafx с GridPane, но из него потом не достать данные по номеру ячейки.
Не до конца понимаю правильно ли я Вас понял, но накидал на 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
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP