如何制作将在 java Swing 中创建其他按钮的 JButton?

How to make a JButton that will create other buttons in java Swing?

我正在创建一个用户系统来保存多个用户的多个详细信息,因此我想创建一个能够创建另一个按钮的按钮。当按下第二个按钮时,将打开一个表单供用户填写。我已经创建了供用户填写的表单,但我无法设法让按钮创建更多按钮来工作。我已经对此进行了编码,但它没有显示 JPanel.

上的按钮

我创建了以下代码:

private void mainButtonActionPerformed(java.awt.event.ActionEvent evt) {    
    JButton b=new JButton("Click Here"); 
    b.setBounds(50,100,95,30);  
    jPanel3.add(b); 
    b.setVisible(true); 
}

我想知道在按钮的事件/鼠标点击中编写的正确代码是什么。

当您在 JPanel 中添加或删除组件时,您需要使 JPanel 重绘自身。仅仅添加或删除一个组件并不能使这种情况发生。因此,在 JPanel 中添加或删除组件后,您需要调用方法 revalidate,然后调用 repaint.

参考Java Swing revalidate() vs repaint()

另请注意,以下代码行不是必需的,因为 visible 属性 默认为真。

b.setVisible(true);

此外,建议使用 layout manager,这意味着您不需要像在这行代码中那样调用方法 setBounds

b.setBounds(50,100,95,30);

编辑

根据要求,示例应用程序。单击 Add 按钮将添加另一个按钮。请注意 ActionListener for the Add button is implemented as a method reference.

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ButtonAd {
    private static final String  ADD = "Add";

    private JFrame  frame;
    private JPanel  buttonsPanel;

    private void addButton(ActionEvent event) {
        JButton button = new JButton("Added");
        buttonsPanel.add(button);
        buttonsPanel.revalidate();
        buttonsPanel.repaint();
    }

    private JPanel createAddButton() {
        JPanel addButtonPanel = new JPanel();
        JButton addButton = new JButton(ADD);
        addButton.addActionListener(this::addButton);
        addButtonPanel.add(addButton);
        return addButtonPanel;
    }

    private void createAndDisplayGui() {
        frame = new JFrame("Add Buttons");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(createButtonsPanel(), BorderLayout.CENTER);
        frame.add(createAddButton(), BorderLayout.PAGE_END);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private JPanel createButtonsPanel() {
        buttonsPanel = new JPanel(new FlowLayout(FlowLayout.LEADING));
        buttonsPanel.setPreferredSize(new Dimension(450, 350));
        return buttonsPanel;
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> new ButtonAd().createAndDisplayGui());
    }
}