繁体   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