【问题标题】:create a dynamic form in a Jtabbedpane via a Jbutton通过 Jbutton 在 Jtabbedpane 中创建动态表单
【发布时间】:2014-10-20 23:48:35
【问题描述】:

我有两个 Jtabbedpane,一个是我的 Jtable 和我的 Jbutton(添加、更新、删除),我想要的是,当我点击“添加”时,会生成一个动态表单。假设我的表中有来自我的 DB 4 列,当我单击“添加”时,必须生成 4 个标签和 4 个 Jtextfield。我试图在我的 Tabbedpane 中创建一个 Jlabel 进行测试,但这没有用

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    jTabbedPane1.setSelectedComponent(jPanel2);
    JLabel label1 = new JLabel("Test");
    jPanel2.add(label1);}     

【问题讨论】:

  • 为了尽快获得更好的帮助,请发布MCVE(最小、完整、可验证的示例)。
  • GUI 编辑器可能会阻碍您学习 Swing。
  • 注:与其动态添加标签,不如在启动时添加标签,然后动态设置文本。

标签: java mysql swing dynamic


【解决方案1】:

如果您的面板(或任何容器,实际上)在您添加另一个组件时已经显示,那么您需要 revalidaterepaint 您的面板,因为组件的层次结构在 @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)));
    }
}

【讨论】:

  • 首先谢谢你,但我认为你没有很好地解决问题。我的要求就是如何通过从我的数据库中获取 x 列数来动态生成 x 个表单字段
  • @dic19 如果我有两个 JtabbedPane,我想在第二个 JtabbedPane 中使用 FormGenerator 而不是使用 JoptionPane 怎么办?
  • 在此示例中,FormGenerator#getPanel() 返回一个JPanel 实例,您可以将其作为新选项卡添加到第二个JTabbedPane 中。返回JPanel 的最大优势是您可以在任何需要的地方添加此组件。 @杰克
猜你喜欢
  • 1970-01-01
  • 2013-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多