Java 单击时添加GUI元素只能工作一次

Java 单击时添加GUI元素只能工作一次,java,user-interface,Java,User Interface,问题很简单。单击一个按钮将添加另一个按钮。这也行得通。但只有一次,我希望每次点击都会在上一个按钮的下方添加另一个按钮 你能告诉我问题出在哪里吗 以下是我已经尝试过的: 不同的布局,因为我假设按钮在彼此的顶部。 一个“GUI刷新”,因为我认为界面应该在点击后更新。。。但它不起作用。 在我上次的尝试中,每次单击时,我都创建了该类的一个新对象。。。不幸的是,它也不起作用 public class Main { public static void main(String[] args) {

问题很简单。单击一个按钮将添加另一个按钮。这也行得通。但只有一次,我希望每次点击都会在上一个按钮的下方添加另一个按钮

你能告诉我问题出在哪里吗

以下是我已经尝试过的: 不同的布局,因为我假设按钮在彼此的顶部。 一个“GUI刷新”,因为我认为界面应该在点击后更新。。。但它不起作用。 在我上次的尝试中,每次单击时,我都创建了该类的一个新对象。。。不幸的是,它也不起作用

public class Main {

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

    }
}

public class MVCView extends JFrame {

    private static final long serialVersionUID = 1L;

    public MVCView() {

        init();
    }

    private void init() {

        BorderLayout bl = new BorderLayout();
        setLayout(bl);
        this.setTitle("Test");
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setExtendedState(this.MAXIMIZED_BOTH);

        this.getContentPane().add(addNewRow(), BorderLayout.SOUTH);

        this.pack();
        this.setVisible(true);
    }

    public JComponent addNewRow() {

        JPanel getSouthPanel = new JPanel();
        getSouthPanel.setLayout(new BorderLayout());

        JButton plus = new JButton("Add new Row");

        plus.addActionListener(new MVCControllerAddLine(this));

        getSouthPanel.add(plus, BorderLayout.SOUTH);


        return getSouthPanel;
    }

}

public class MVCControllerAddLine implements ActionListener{

    private MVCView view;
    MVCViewNodeContainer mvcViewNodeContainer = new MVCViewNodeContainer();

    public MVCControllerAddLine(MVCView view) {
        this.view = view;
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        view.getContentPane().add(mvcViewNodeContainer.addNewNodeContainer());
        view.revalidate();
        view.validate();
        view.repaint();

    }

}

public class MVCViewNodeContainer{

    private JPanel panel;

    MVCView view;

    public MVCViewNodeContainer() {
        addNewNodeContainer();
    }


    public JComponent addNewNodeContainer() {

        panel = new JPanel();
        panel.setLayout(new GridBagLayout());

        JButton addNode = new JButton("Add Node");
        addNode.setPreferredSize(new Dimension(100, 120));

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.insets = new Insets(4, 4, 4, 4);

        gbc.gridwidth = 1;
        gbc.gridheight = 1;
        gbc.fill = GridBagConstraints.EAST;
        gbc.anchor = GridBagConstraints.NORTHEAST;
        gbc.weighty = 1;
        gbc.weightx = 1;
        panel.add(addNode, gbc);

        panel.setMaximumSize(new Dimension(150, 100));

        return panel;
    }

}
如果您需要更多代码,请告诉我。我试着省去不必要的事

非常感谢你的帮助

祝你节日愉快,万事如意


A456B123

我认为问题在于您试图错误地使用一个

边界布局布局容器,排列和调整其组件的大小以适应五个区域:北、南、东、西和中心每个区域最多只能包含一个组件,并由相应的常量标识:北、南、东、西和中心

您的代码在这里:

@Override
    public void actionPerformed(ActionEvent e) {

        view.getContentPane().add(mvcViewNodeContainer.addNewNodeContainer());
        view.revalidate();
        view.validate();
        view.repaint();

    }

每次都将“节点容器”添加到BorderLayout的同一区域。您需要将一个具有不同布局的面板放置在其中一个区域中,然后将按钮或“节点容器”添加到该面板中。

我认为问题在于您试图错误地使用一个节点

边界布局布局容器,排列和调整其组件的大小以适应五个区域:北、南、东、西和中心每个区域最多只能包含一个组件,并由相应的常量标识:北、南、东、西和中心

您的代码在这里:

@Override
    public void actionPerformed(ActionEvent e) {

        view.getContentPane().add(mvcViewNodeContainer.addNewNodeContainer());
        view.revalidate();
        view.validate();
        view.repaint();

    }

每次都将“节点容器”添加到BorderLayout的同一区域。您需要有一个具有不同布局的面板,将其放置在其中一个区域中,然后将按钮或“NodeContainers”添加到该面板中。

如果没有可运行代码,则该面板无效--我们需要一个主方法,即可以编译和运行的代码。此外,您还希望摆脱“我是初学者…”、“我在谷歌上搜索…”的废话,而只发布有助于我们理解问题本身的信息。此外,您的代码看起来不必要地复杂?你到底想实现什么?如果没有可运行的代码,这是无效的——我们需要一个主方法,一个可以编译和运行的代码。此外,您还希望摆脱“我是初学者…”、“我在谷歌上搜索…”的废话,而只发布有助于我们理解问题本身的信息。此外,您的代码看起来不必要地复杂?你到底想达到什么目的?谢谢你,这就是解决办法。:)祝你周末愉快谢谢,这就是解决办法。:)有一个愉快的周末