每次按下(单击)Jbutton 时,如何在现有按钮组中创建新的 JButton 实例

How to make a new JButton instance in a existing button group everytime a Jbutton is pressed(clicked)

这可能是一个奇怪的问题,但我想制作一个程序,每次按下一个按钮(称为新按钮)时,它都会在现有组中创建一个新的 Jbutton 实例。它将被添加到先前添加的按钮下,所有按钮必须是一个组的一部分(因此当按下一个按钮时,如果按下组中的按钮,它将取消选择先前选择的按钮)并且应该能够制作无限数量的给定 n 次点击的按钮。这是我目前所知道的,但老实说,我什至不知道如何处理这个。

public static void makebuttonpane() {
    buttonpane.setLayout(new GridBagLayout());
    GridBagConstraints d = new GridBagConstraints();

    nbutton = new JButton("New");

    d.insets = new Insets(10, 10, 0, 10);
    d.anchor = GridBagConstraints.PAGE_START;
    buttonpane.add(nbutton,d);
    nbutton.addActionListener(new ButtonMaker());
    //d.anchor = GridBagConstraints.CENTER;

}

public static void addbutton(JButton button) {
    System.out.println("button made");
    buttonpane.removeAll();
    nbutton = new JButton("New");

    d.insets = new Insets(10, 10, 0, 10);
    d.anchor = GridBagConstraints.PAGE_START;
    buttonpane.add(nbutton,d);
    nbutton.addActionListener(new ButtonMaker());

    d.gridx=0;
    System.out.println(ButtonMaker.getNumb());
    d.gridy= ButtonMaker.getNumb();

    buttonpane.add(button,d);
    frame.setVisible(true);
    buttonpane.validate();
}

public static void makebuttonpane() {
    buttonpane.setLayout(new GridBagLayout());
    GridBagConstraints d = new GridBagConstraints();

    nbutton = new JButton("New");

    d.insets = new Insets(10, 10, 0, 10);
    d.anchor = GridBagConstraints.PAGE_START;
    buttonpane.add(nbutton,d);
    nbutton.addActionListener(new ButtonMaker());
    //d.anchor = GridBagConstraints.CENTER;

}

public static void addbutton(JButton button) {
    System.out.println("button made");
    buttonpane.removeAll();
    nbutton = new JButton("New");

    d.insets = new Insets(10, 10, 0, 10);
    d.anchor = GridBagConstraints.PAGE_START;
    buttonpane.add(nbutton,d);
    nbutton.addActionListener(new ButtonMaker());

    d.gridx=0;
    System.out.println(ButtonMaker.getNumb());
    d.gridy= ButtonMaker.getNumb();

    buttonpane.add(button,d);
    frame.setVisible(true);
    buttonpane.validate();
}

class ButtonMaker implements ActionListener{
public static int i=1;
public void actionPerformed(ActionEvent e) {
    //System.out.println("I hear you");
    //System.out.println(i);
    JButton button = new JButton("Button "+i);
    MultiListener.addbutton(button);
    i++;

}
public static int getNumb() {
    return i;
}

}

它添加了第一个按钮实例,但按下 'New' 只会更改第一个创建的按钮,而不是在下面创建一个新按钮

我创建了一个 GUI,它会在您单击 "Add Button" 按钮时添加一个 JButton。

您可以随意修改它。

主要是我把JFrame的构造,JPanel的构造,action listener分开了。一次专注于一个部分,我能够快速编写和测试这个 GUI。

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class JButtonCreator implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new JButtonCreator());
    }

    private static int buttonCount = 0;

    private JButtonPanel buttonPanel;

    @Override
    public void run() {
        JFrame frame = new JFrame("JButton Creator");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        buttonPanel = new JButtonPanel();
        JScrollPane scrollPane = new JScrollPane(
                buttonPanel.getPanel());

        frame.add(scrollPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public class JButtonPanel {

        private ButtonGroup buttonGroup;

        private JPanel buttonPanel;
        private JPanel panel;

        public JButtonPanel() {
            createPartControl();
        }

        private void createPartControl() {
            panel = new JPanel();
            panel.setPreferredSize(new Dimension(640, 480));
            panel.setLayout(new BorderLayout());

            buttonPanel = new JPanel();
            buttonPanel.setLayout(new GridLayout(0, 5));

            buttonGroup = new ButtonGroup();

            panel.add(buttonPanel, BorderLayout.CENTER);

            JButton newButton = new JButton("Add Button");
            newButton.addActionListener(new ButtonListener(this));
            panel.add(newButton, BorderLayout.AFTER_LAST_LINE);
        }

        public void addJButton() {
            String text = "Button " + ++buttonCount;
            JButton button = new JButton(text);
            buttonPanel.add(button);
            buttonGroup.add(button);
        }

        public JPanel getPanel() {
            return panel;
        }

    }

    public class ButtonListener implements ActionListener {

        private JButtonPanel buttonPanel;

        public ButtonListener(JButtonPanel buttonPanel) {
            this.buttonPanel = buttonPanel;
        }

        @Override
        public void actionPerformed(ActionEvent event) {
            buttonPanel.addJButton();
            buttonPanel.getPanel().revalidate();;
        }

    }

}