首页 > 解决方案 > 每次按下(单击)Jbutton 时如何在现有按钮组中创建一个新的 JButton 实例

问题描述

这可能是一个奇怪的问题,但我想制作一个程序,每次按下按钮(称为新按钮)时,都会在现有组中创建一个新的 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;
}

}

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

标签: javaswingjbutton

解决方案


当您单击“添加按钮”按钮时,我创建了一个添加 JButton 的 GUI。

JButton 创建者图形用户界面

随意修改这个你想要的任何方式。

主要是把JFrame的构建,JPanel的构建,以及动作监听器分开了。一次只专注于一个部分,我能够快速编写和测试这个 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();;
        }

    }

}

推荐阅读