单击 JButton 创建 JButton
Creating a JButton with the click of a JButton
我正在做一个项目,我需要点击一个按钮来制作另一个按钮。最终,我希望能够更好地控制新按钮的定位并能够多次创建新按钮,但是现在......我只想让一个 JButton 创建另一个 JButton。
使用下面的代码,我的目标是让白色 B1 创建红色 B3 按钮。我还想让蓝色 B2 按钮创建一个绿色 B4 按钮。
最终,我还希望 B3 和 B4(从按钮生成的按钮)让用户能够单击它们并使其消失。
这两个按钮似乎都不起作用,我不明白为什么。我有 3 个 class 个文件。知道我可能哪里出错了吗?
Window.Java
package gui;
import javax.swing.JFrame;
public class Window {
public static void main(String[] args) {
//frame creation
JFrame frame = new MainFrame("Button Create Button Test");
//frame size
frame.setSize(800, 800);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
DetailsPanel.Java
package gui;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class DetailsPanel extends JPanel {
public DetailsPanel() {
Dimension size = getPreferredSize();
size.width = 400;
setPreferredSize(size);
///Buttons
JButton button1 = new JButton("B1");
button1.setPreferredSize(new Dimension (72, 73));
button1.setBackground(Color.WHITE);
button1.setBorderPainted(true);
JButton button2 = new JButton("B2");
button2.setPreferredSize(new Dimension (72, 73));
button2.setBackground(Color.BLUE);
button2.setBorderPainted(true);
setLayout (new GridBagLayout());
GridBagConstraints gc = new GridBagConstraints();
/// Layout ///
/// Row 1 ///
gc.anchor = GridBagConstraints.NORTH;
gc.weightx = 0.5;
gc.weighty = 0.5;
gc.gridx = 1;
gc.gridy = 1;
add(button1, gc);
gc.gridx = 1;
gc.gridy = 2;
add(button2, gc);
button1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JButton button3 = new JButton("B3");
button3.setPreferredSize(new Dimension (72, 73));
button3.setBackground(Color.RED);
button3.setBorderPainted(true);
gc.gridx = 1;
gc.gridy = 3;
add(button3, gc);
}
});
button2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JButton button4 = new JButton("B3");
button4.setPreferredSize(new Dimension (72, 73));
button4.setBackground(Color.GREEN);
button4.setBorderPainted(true);
gc.gridx = 1;
gc.gridy = 4;
add(button4, gc);
}
});
}
}
MainFrame.Java
package gui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
public class MainFrame extends JFrame {
private DetailsPanel detailsPanel;
public MainFrame(String title) {
super(title);
// set layout manager
setLayout (new BorderLayout());
// Create Swing Component
detailsPanel = new DetailsPanel();
detailsPanel.setBackground(Color.BLACK);
// Add swing components to content pane
Container container = getContentPane();
container.add(detailsPanel, BorderLayout.WEST);
}
}
您必须在添加按钮后触发布局管理器的重绘。
之后
add(button3, gc);
添加
invalidate();
validate();
有关详细信息,请参阅 Swing 文档和 invalidate() 和 validate() 的 javadoc。
为了在点击按钮 B1 后显示按钮 B3,您需要添加...
revalidate();
repaint();
行后...
add(button3, gc);
在文件 DetailsPanel.java
.
中
同样适用于按钮 B2。
我正在做一个项目,我需要点击一个按钮来制作另一个按钮。最终,我希望能够更好地控制新按钮的定位并能够多次创建新按钮,但是现在......我只想让一个 JButton 创建另一个 JButton。
使用下面的代码,我的目标是让白色 B1 创建红色 B3 按钮。我还想让蓝色 B2 按钮创建一个绿色 B4 按钮。
最终,我还希望 B3 和 B4(从按钮生成的按钮)让用户能够单击它们并使其消失。
这两个按钮似乎都不起作用,我不明白为什么。我有 3 个 class 个文件。知道我可能哪里出错了吗?
Window.Java
package gui;
import javax.swing.JFrame;
public class Window {
public static void main(String[] args) {
//frame creation
JFrame frame = new MainFrame("Button Create Button Test");
//frame size
frame.setSize(800, 800);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
DetailsPanel.Java
package gui;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class DetailsPanel extends JPanel {
public DetailsPanel() {
Dimension size = getPreferredSize();
size.width = 400;
setPreferredSize(size);
///Buttons
JButton button1 = new JButton("B1");
button1.setPreferredSize(new Dimension (72, 73));
button1.setBackground(Color.WHITE);
button1.setBorderPainted(true);
JButton button2 = new JButton("B2");
button2.setPreferredSize(new Dimension (72, 73));
button2.setBackground(Color.BLUE);
button2.setBorderPainted(true);
setLayout (new GridBagLayout());
GridBagConstraints gc = new GridBagConstraints();
/// Layout ///
/// Row 1 ///
gc.anchor = GridBagConstraints.NORTH;
gc.weightx = 0.5;
gc.weighty = 0.5;
gc.gridx = 1;
gc.gridy = 1;
add(button1, gc);
gc.gridx = 1;
gc.gridy = 2;
add(button2, gc);
button1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JButton button3 = new JButton("B3");
button3.setPreferredSize(new Dimension (72, 73));
button3.setBackground(Color.RED);
button3.setBorderPainted(true);
gc.gridx = 1;
gc.gridy = 3;
add(button3, gc);
}
});
button2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JButton button4 = new JButton("B3");
button4.setPreferredSize(new Dimension (72, 73));
button4.setBackground(Color.GREEN);
button4.setBorderPainted(true);
gc.gridx = 1;
gc.gridy = 4;
add(button4, gc);
}
});
}
}
MainFrame.Java
package gui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
public class MainFrame extends JFrame {
private DetailsPanel detailsPanel;
public MainFrame(String title) {
super(title);
// set layout manager
setLayout (new BorderLayout());
// Create Swing Component
detailsPanel = new DetailsPanel();
detailsPanel.setBackground(Color.BLACK);
// Add swing components to content pane
Container container = getContentPane();
container.add(detailsPanel, BorderLayout.WEST);
}
}
您必须在添加按钮后触发布局管理器的重绘。
之后
add(button3, gc);
添加
invalidate();
validate();
有关详细信息,请参阅 Swing 文档和 invalidate() 和 validate() 的 javadoc。
为了在点击按钮 B1 后显示按钮 B3,您需要添加...
revalidate();
repaint();
行后...
add(button3, gc);
在文件 DetailsPanel.java
.
中
同样适用于按钮 B2。