java - 通过 Jbutton 在 Jtabbed Pane 中创建动态表单

标签 java mysql swing dynamic

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

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

最佳答案

如果您的面板(或任何容器,实际上)在您向其添加另一个组件时已经显示,那么您需要 revalidaterepaint您的面板,因为组件的层次结构在 add 上无效方法调用。

另一方面,在这种特殊情况下,我会使用模态对话框来显示新项目的表单。参见 How to Make Dialogs教程。


编辑

基于此评论:

My request is just how i can generate dynamicaly a number x of form fields by getting x number of columns from my DB.

有几种方法可以实现这一点,但您可以制作一个可重用的类来帮助您。您应该提出的主要问题是您需要多少字段以及这些字段的标签是什么。一旦你找到了这个问题的答案,你就可以使用这样的东西:

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;
    }
}

请注意,底层数据结构可以是 map 或满足您要求的任何内容。这个 FormGenerator 类可以很容易地与 JOptionPane 结合使用。如以下代码片段所示:

// 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)));
    }
}

关于java - 通过 Jbutton 在 Jtabbed Pane 中创建动态表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25526374/

相关文章:

java - DFA 字符串验证

java - Hibernate 一对一单向更新

Java Swing : Approach for dynamically appending text in text area, 有滚动条更新

mysql - 仅执行今天尚未运行的 MySQL 存储过程

java - JFrame(全屏显示)背景颜色不变

java - 在单个 Java 语句中创建 JTextField 对象时设置其对象

java - 为什么我的简单 springmvc Web 应用程序会关闭 Jetty?

php - 向查询添加第二个更新的格式

php - 使用 Y/m/d 按月组织帖子列表

java - 使用 java/sqlite 登录表单