最初隐藏的单选按钮在事件中不可见

Initially hidden radioButton dont be visible on event

我试图在单击单选按钮时使组件可见。 RadioButton 初始化隐藏在 initComponents 方法中。

我在单选按钮上放置了一个 mouseClickListener。如果我初始化隐藏的 radioButton,它就不起作用。如果我初始化它可见(默认):

我也尝试过在 post 初始化之前进行初始化。

这些是 myListeners 并且 txtMaas 已初始化隐藏:

private void rbOgretmenMouseClicked(java.awt.event.MouseEvent evt) {                                        
    // TODO add your handling code here:
    txtMaas.setVisible(true);
}                                       

private void rbOgrenciMouseClicked(java.awt.event.MouseEvent evt) {                                       
    // TODO add your handling code here:
    txtMaas.setVisible(false);
}       
  1. 在 JRadioButton 上使用 ItemListener,而不是 MouseListener。
  2. 将组件设置为可见或不可见后,请务必在父容器(通常是 JPanel)上调用 revalidate()repaint(),它包含已更改其可见性的组件。 revalidate 允许容器的布局管理器重新布局其组件,repaint 允许 Graphics 对象重新绘制容器及其所有组件。
  3. 如需更详细的帮助,请考虑创建并发布 minimal example program(请查看 link)。

例如,

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.*;

public class RadioFun extends JPanel {
    private static final int PREF_W = 300;
    private static final int PREF_H = 150;
    private JRadioButton rbOgret = new JRadioButton("Ogret");
    private JTextField txtMaas = new JTextField(10);

    public RadioFun() {
        setLayout(new FlowLayout(FlowLayout.LEADING));
        add(rbOgret);
        add(txtMaas);

        txtMaas.setVisible(false);

        rbOgret.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent e) {
                rbOgretItemStateChanged(e);
            }
        });
    }    

    // to make the GUI large enough
    @Override
    public Dimension getPreferredSize() {
        if (isPreferredSizeSet()) {
            return super.getPreferredSize();
        }
        return new Dimension(PREF_W, PREF_H);
    }

    private void rbOgretItemStateChanged(ItemEvent e) {
        boolean visible = e.getStateChange() == ItemEvent.SELECTED;
        txtMaas.setVisible(visible);

        // call repaint and revalidate on the holding JPanel:
        revalidate();
        repaint();
    }

    // the two methods below are to create the GUI on the Swing event thread
    private static void createAndShowGui() {
        JFrame frame = new JFrame("RadioFun");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new RadioFun());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }
}