如何制作将在 java Swing 中创建其他按钮的 JButton?
How to make a JButton that will create other buttons in java Swing?
我正在创建一个用户系统来保存多个用户的多个详细信息,因此我想创建一个能够创建另一个按钮的按钮。当按下第二个按钮时,将打开一个表单供用户填写。我已经创建了供用户填写的表单,但我无法设法让按钮创建更多按钮来工作。我已经对此进行了编码,但它没有显示 JPanel
.
上的按钮
我创建了以下代码:
private void mainButtonActionPerformed(java.awt.event.ActionEvent evt) {
JButton b=new JButton("Click Here");
b.setBounds(50,100,95,30);
jPanel3.add(b);
b.setVisible(true);
}
我想知道在按钮的事件/鼠标点击中编写的正确代码是什么。
当您在 JPanel
中添加或删除组件时,您需要使 JPanel
重绘自身。仅仅添加或删除一个组件并不能使这种情况发生。因此,在 JPanel
中添加或删除组件后,您需要调用方法 revalidate
,然后调用 repaint
.
参考Java Swing revalidate() vs repaint()
另请注意,以下代码行不是必需的,因为 visible
属性 默认为真。
b.setVisible(true);
此外,建议使用 layout manager,这意味着您不需要像在这行代码中那样调用方法 setBounds
。
b.setBounds(50,100,95,30);
编辑
根据要求,示例应用程序。单击 Add
按钮将添加另一个按钮。请注意 ActionListener for the Add
button is implemented as a method reference.
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ButtonAd {
private static final String ADD = "Add";
private JFrame frame;
private JPanel buttonsPanel;
private void addButton(ActionEvent event) {
JButton button = new JButton("Added");
buttonsPanel.add(button);
buttonsPanel.revalidate();
buttonsPanel.repaint();
}
private JPanel createAddButton() {
JPanel addButtonPanel = new JPanel();
JButton addButton = new JButton(ADD);
addButton.addActionListener(this::addButton);
addButtonPanel.add(addButton);
return addButtonPanel;
}
private void createAndDisplayGui() {
frame = new JFrame("Add Buttons");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(createButtonsPanel(), BorderLayout.CENTER);
frame.add(createAddButton(), BorderLayout.PAGE_END);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
private JPanel createButtonsPanel() {
buttonsPanel = new JPanel(new FlowLayout(FlowLayout.LEADING));
buttonsPanel.setPreferredSize(new Dimension(450, 350));
return buttonsPanel;
}
public static void main(String[] args) {
EventQueue.invokeLater(() -> new ButtonAd().createAndDisplayGui());
}
}
我正在创建一个用户系统来保存多个用户的多个详细信息,因此我想创建一个能够创建另一个按钮的按钮。当按下第二个按钮时,将打开一个表单供用户填写。我已经创建了供用户填写的表单,但我无法设法让按钮创建更多按钮来工作。我已经对此进行了编码,但它没有显示 JPanel
.
我创建了以下代码:
private void mainButtonActionPerformed(java.awt.event.ActionEvent evt) {
JButton b=new JButton("Click Here");
b.setBounds(50,100,95,30);
jPanel3.add(b);
b.setVisible(true);
}
我想知道在按钮的事件/鼠标点击中编写的正确代码是什么。
当您在 JPanel
中添加或删除组件时,您需要使 JPanel
重绘自身。仅仅添加或删除一个组件并不能使这种情况发生。因此,在 JPanel
中添加或删除组件后,您需要调用方法 revalidate
,然后调用 repaint
.
参考Java Swing revalidate() vs repaint()
另请注意,以下代码行不是必需的,因为 visible
属性 默认为真。
b.setVisible(true);
此外,建议使用 layout manager,这意味着您不需要像在这行代码中那样调用方法 setBounds
。
b.setBounds(50,100,95,30);
编辑
根据要求,示例应用程序。单击 Add
按钮将添加另一个按钮。请注意 ActionListener for the Add
button is implemented as a method reference.
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ButtonAd {
private static final String ADD = "Add";
private JFrame frame;
private JPanel buttonsPanel;
private void addButton(ActionEvent event) {
JButton button = new JButton("Added");
buttonsPanel.add(button);
buttonsPanel.revalidate();
buttonsPanel.repaint();
}
private JPanel createAddButton() {
JPanel addButtonPanel = new JPanel();
JButton addButton = new JButton(ADD);
addButton.addActionListener(this::addButton);
addButtonPanel.add(addButton);
return addButtonPanel;
}
private void createAndDisplayGui() {
frame = new JFrame("Add Buttons");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(createButtonsPanel(), BorderLayout.CENTER);
frame.add(createAddButton(), BorderLayout.PAGE_END);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
private JPanel createButtonsPanel() {
buttonsPanel = new JPanel(new FlowLayout(FlowLayout.LEADING));
buttonsPanel.setPreferredSize(new Dimension(450, 350));
return buttonsPanel;
}
public static void main(String[] args) {
EventQueue.invokeLater(() -> new ButtonAd().createAndDisplayGui());
}
}