单击添加GUI元素仅一次

时间:2019-04-05 17:50:51

标签: java user-interface

问题很简单。单击一个按钮将添加另一个按钮。这也有效。但是只有一次,我希望每次单击时在上一个按钮的下方添加另一个按钮。

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

这是我已经尝试过的: 不同的布局,因为我假设按钮彼此重叠。 “ 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

1 个答案:

答案 0 :(得分:2)

我认为问题在于您尝试错误地使用BorderLayout

边界布局可对容器进行布局,并对其组件进行调整并调整其大小以适合五个区域:北,南,东,西和中部。 每个区域最多只能包含一个组成部分,并由相应的常数标识:NORTH,SOUTH,EAST,WEST和CENTER。

您的代码在这里:

@Override
    public void actionPerformed(ActionEvent e) {

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

    }

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