[英]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.