如果您的面板(或任何容器,实际上)在您添加另一个组件时已经显示,那么您需要 revalidate 和 repaint 您的面板,因为组件的层次结构在 @987654323 上无效@方法调用。
另一方面,在这种特殊情况下,我会使用模式对话框来显示新项目的表单。见How to Make Dialogs教程。
编辑
基于此评论:
我的要求就是如何通过从我的数据库中获取 x 个列来动态生成 x 个表单字段。
有几种方法可以实现这一点,但您可以创建一个可重用的类来帮助您。您应该提出的主要问题是您需要多少个字段以及这些字段的标签是什么。一旦你想出了这个问题的答案,你就可以使用这样的东西:
public class FormGenerator {
private Map<String, String> data;
private JPanel panel;
public FormGenerator(List<String> formLabels) {
super();
initMap(formLabels);
initPanel(formLabels);
}
private void initMap(List<String> formLabels) {
data = new HashMap();
for (String label : formLabels) {
data.put(label, "");
}
}
private void initPanel(List<String> formLabels) {
int numberOfFields = formLabels.size();
panel = new JPanel(new GridLayout(numberOfFields, 2, 6, 6));
for (String fieldLabel : formLabels) {
JLabel label = new JLabel(fieldLabel);
label.setHorizontalAlignment(JLabel.TRAILING);
panel.add(label);
JTextField textField = new JTextField(15);
textField.putClientProperty("Textfield.For.Field", fieldLabel);
panel.add(textField);
}
}
public Map<String, String> getDataFromTextFields() {
for (Component comp : panel.getComponents()) {
if (comp instanceof JTextField) {
JTextField textField = (JTextField)comp;
String key = (String)textField.getClientProperty("Textfield.For.Field");
String value = textField.getText().trim();
data.put(key, value);
}
}
return data;
}
public JPanel getPanel() {
return panel;
}
}
请注意,底层数据结构可以是地图或任何适合您要求的结构。这个FormGenerator 类可以很容易地与JOptionPane 结合使用,如以下代码 sn-p 所示:
// You have to figure out formLabels list
// The same column identifiers in your table maybe?
FormGenerator formGenerator = new FormGenerator(formLabels);
JPanel formPanel = formGenerator.getPanel();
int option = JOptionPane.showConfirmDialog(null
, formPanel
,"Add item"
, JOptionPane.OK_CANCEL_OPTION
, JOptionPane.PLAIN_MESSAGE);
if (option == JOptionPane.OK_OPTION) {
Map<String, String> data = formGenerator.getDataFromTextFields();
for (String key : data.keySet()) {
System.out.println(String.format("%1s : %2s", key, data.get(key)));
}
}