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

问题描述 投票:0回答:1

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

}

它添加了第一个按钮实例,但按 "新建 "只能改变第一个创建的按钮,而不是在下面创建一个新的按钮。

java jbutton
1个回答
0
投票

我创建了一个GUI,当你点击 "添加按钮 "按钮时,会添加一个JButton。

JButton Creator GUI

你可以随意修改它。

主要是,我把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();;
        }

    }

}
© www.soinside.com 2019 - 2024. All rights reserved.