[英]Why is JRadioButton not being displayed on the JPanel?
我是 Java 图形设计的新手,想实现一个单选按钮菜单,但是单选按钮不可见,并且仍然以某种方式覆盖了它下面的图形。
我认为由于 setVisible 被设置为 false 而没有显示它,但即使这样也不起作用。
public class Panel extends JPanel implements ActionListener {
JFrame frame;
JRadioButton rb;
Panel() {
setLayout(null);
addMouseListener(this);
// Creating Frame
frame = new JFrame();
frame.setContentPane(this);
frame.setTitle("Testing Stuff");
frame.getContentPane().setPreferredSize(new Dimension(600, 600));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
// Creating the radio button
rb = new JRadioButton();
rb.setText("Button 1 Text");
rb.setName("Button 1 Name");
rb.setSelected(true);
rb.setVisible(true);
rb.setActionCommand("Button 1 Clicked");
rb.addActionListener(this);
// Adding the radio button
add(rb);
}
}
我的代码中的问题在哪里?
发生这种情况是因为您没有在面板上设置单选按钮的大小和位置。
尝试在行add(rb);
之前add(rb);
rb.setBounds(10, 10, 100, 100);
不过,我想就您如何布置代码提出一些建议。
第一个是您扩展 JPanel 并实现了 Action Listener。 您实际上并没有向 JPanel 添加任何新功能,您只是设置了一个面板,所以我不会这样做。 类似面板不是动作侦听器,您只想在面板中的一个组件上使用动作侦听器。 最后,每次创建 Panel 时,它实际上都会创建并打开一个 JFrame。 仅通过查看名称“面板”就很难理解这一点。 这些违反了单一职责原则,也可能违反了许多其他原则。 我建议查找 SOLID、 ITNEXT 的解释、Stackify 的解释,因为它会帮助您理解为什么不应该这样做。
我还注意到您在面板上使用了null
布局。 这通常是非常糟糕的。 我建议你阅读这个问题,因为它有助于解释为什么空布局不好。
因此,查看布局管理器, GridBagLayout
为您提供了一种设置 UI 的强大方法。
一个简短的例子可能是
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
public class Example {
private void run() {
JFrame window = createWindow();
window.setVisible(true);
}
private JFrame createWindow() {
JFrame frame = new JFrame();
frame.setTitle("Testing Stuff");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(createPanel());
frame.pack();
frame.setLocationRelativeTo(null);
return frame;
}
private JPanel createPanel() {
JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.BOTH;
constraints.weightx = 1;
constraints.weighty = 1;
String birdString = "Bird";
JRadioButton birdButton = new JRadioButton(birdString);
birdButton.setMnemonic(KeyEvent.VK_B);
birdButton.setActionCommand(birdString);
birdButton.setSelected(true);
constraints.gridy = 0;
panel.add(birdButton, constraints);
String catString = "Cat";
JRadioButton catButton = new JRadioButton(catString);
catButton.setMnemonic(KeyEvent.VK_C);
catButton.setActionCommand(catString);
constraints.gridy = 1;
panel.add(catButton, constraints);
String dogString = "Dog";
JRadioButton dogButton = new JRadioButton(dogString);
dogButton.setMnemonic(KeyEvent.VK_D);
dogButton.setActionCommand(dogString);
constraints.gridy = 2;
panel.add(dogButton, constraints);
String rabbitString = "Rabbit";
JRadioButton rabbitButton = new JRadioButton(rabbitString);
rabbitButton.setMnemonic(KeyEvent.VK_R);
rabbitButton.setActionCommand(rabbitString);
constraints.gridy = 3;
panel.add(rabbitButton, constraints);
String pigString = "Pig";
JRadioButton pigButton = new JRadioButton(pigString);
pigButton.setMnemonic(KeyEvent.VK_P);
pigButton.setActionCommand(pigString);
constraints.gridy = 4;
panel.add(pigButton, constraints);
//Group the radio buttons.
ButtonGroup group = new ButtonGroup();
group.add(birdButton);
group.add(catButton);
group.add(dogButton);
group.add(rabbitButton);
group.add(pigButton);
RadioActionListener listener = new RadioActionListener();
//Register a listener for the radio buttons.
birdButton.addActionListener(listener);
catButton.addActionListener(listener);
dogButton.addActionListener(listener);
rabbitButton.addActionListener(listener);
pigButton.addActionListener(listener);
return panel;
}
private class RadioActionListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(e.getActionCommand());
}
}
public static void main(String[] args) {
EventQueue.invokeLater(() -> new Example().run());
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.