Java 单击时添加GUI元素只能工作一次
问题很简单。单击一个按钮将添加另一个按钮。这也行得通。但只有一次,我希望每次点击都会在上一个按钮的下方添加另一个按钮 你能告诉我问题出在哪里吗 以下是我已经尝试过的: 不同的布局,因为我假设按钮在彼此的顶部。 一个“GUI刷新”,因为我认为界面应该在点击后更新。。。但它不起作用。 在我上次的尝试中,每次单击时,我都创建了该类的一个新对象。。。不幸的是,它也不起作用Java 单击时添加GUI元素只能工作一次,java,user-interface,Java,User Interface,问题很简单。单击一个按钮将添加另一个按钮。这也行得通。但只有一次,我希望每次点击都会在上一个按钮的下方添加另一个按钮 你能告诉我问题出在哪里吗 以下是我已经尝试过的: 不同的布局,因为我假设按钮在彼此的顶部。 一个“GUI刷新”,因为我认为界面应该在点击后更新。。。但它不起作用。 在我上次的尝试中,每次单击时,我都创建了该类的一个新对象。。。不幸的是,它也不起作用 public class Main { public static void main(String[] args) {
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”添加到该面板中。如果没有可运行代码,则该面板无效--我们需要一个主方法,即可以编译和运行的代码。此外,您还希望摆脱“我是初学者…”、“我在谷歌上搜索…”的废话,而只发布有助于我们理解问题本身的信息。此外,您的代码看起来不必要地复杂?你到底想实现什么?如果没有可运行的代码,这是无效的——我们需要一个主方法,一个可以编译和运行的代码。此外,您还希望摆脱“我是初学者…”、“我在谷歌上搜索…”的废话,而只发布有助于我们理解问题本身的信息。此外,您的代码看起来不必要地复杂?你到底想达到什么目的?谢谢你,这就是解决办法。:)祝你周末愉快谢谢,这就是解决办法。:)有一个愉快的周末