簡體   English   中英

為什么 JRadioButton 沒有顯示在 JPanel 上?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM