Как создать новый экземпляр JButton в существующей группе кнопок каждый раз при нажатии (нажатии) Jbutton - PullRequest
0 голосов
/ 06 мая 2020

Это может показаться странным вопросом, но я хотел бы создать программу, которая создает новый экземпляр 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» изменяет эту первую созданную кнопку вместо создания новой под

1 Ответ

0 голосов
/ 06 мая 2020

Я создал 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();;
        }

    }

}
...