Java JRadioButton在鼠标悬停之前不会显示

Java JRadioButton在鼠标悬停之前不会显示,java,swing,Java,Swing,我的问题是,当我编译和运行这段代码时,会出现jFrame,但只有一个问题,3个JradioButton不会出现,直到你把鼠标放在它们上面。RMA和Williams radiobuttons出现了,中间的3个不知道,这是为什么? 您应该使用布局管理器。人们认为使用“空布局”更容易,但事实并非如此,而且代码更容易出错。布局管理器将正确定位和调整组件大小,以确保显示所有组件。有时,您甚至使用多个不同的布局管理器来实现所需的布局 在本例中,您的问题是容器中有两个组件占用相同的空间。因此,一个组件被涂到另

我的问题是,当我编译和运行这段代码时,会出现jFrame,但只有一个问题,3个JradioButton不会出现,直到你把鼠标放在它们上面。RMA和Williams radiobuttons出现了,中间的3个不知道,这是为什么?


您应该使用布局管理器。人们认为使用“空布局”更容易,但事实并非如此,而且代码更容易出错。布局管理器将正确定位和调整组件大小,以确保显示所有组件。有时,您甚至使用多个不同的布局管理器来实现所需的布局

在本例中,您的问题是容器中有两个组件占用相同的空间。因此,一个组件被涂到另一个组件之上。将鼠标悬停在单选按钮上后,由于按钮的滚动效果,将重新绘制该按钮。但是,现在尝试调整框架的大小,单选按钮将消失,因为所有组件都将重新绘制,并且组件将再次绘制在按钮顶部

以下代码行就是问题所在:

import java.awt.Frame;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.*;

public class IndicatorWindow implements ItemListener {

    JRadioButton RMA, EMA, SMA, Williams, Stochastic;
    JPanel IndPan, RadioPanel, title;
    JLabel Lab;
    JButton OK;

    public JPanel createContentPane() {
        JPanel GUI = new JPanel();
        GUI.setLayout(null);

        title = new JPanel();
        title.setLayout(null);
        title.setLocation(0, 0);
        title.setSize(500, 145);
        GUI.add(title);

        Lab = new JLabel("Please Select Indicator Type");
        Lab.setLocation(5, 0);
        Lab.setSize(200, 30);

        title.add(Lab);

        ButtonGroup bg1 = new ButtonGroup();

        RadioPanel = new JPanel();
        RadioPanel.setLayout(null);
        RadioPanel.setLocation(10, 30);
        RadioPanel.setSize(190, 220);
        GUI.add(RadioPanel);

        RMA = new JRadioButton("RMA");
        RMA.setLocation(0, 0);
        RMA.addItemListener(this);
        RMA.setSize(110, 20);
        bg1.add(RMA);
        RadioPanel.add(RMA);

        EMA = new JRadioButton("EMA");
        EMA.setLocation(0, 30);
        EMA.addItemListener(this);
        EMA.setSize(110, 20);
        bg1.add(EMA);
        RadioPanel.add(EMA);

        SMA = new JRadioButton("SMA");
        SMA.setLocation(0, 60);
        SMA.addItemListener(this);
        SMA.setSize(110, 20);
        bg1.add(SMA);
        RadioPanel.add(SMA);

        Stochastic = new JRadioButton("Stochastic");
        Stochastic.setLocation(0, 90);
        Stochastic.addItemListener(this);
        Stochastic.setSize(110, 20);
        bg1.add(Stochastic);
        RadioPanel.add(Stochastic);

        Williams = new JRadioButton("Williams");
        Williams.setLocation(0, 120);
        Williams.addItemListener(this);
        Williams.setSize(110, 20);
        bg1.add(Williams);
        RadioPanel.add(Williams);

        OK = new JButton();
        OK.setText("Confirm");
        OK.setLocation(45, 150);
        OK.addItemListener(this);
        OK.setSize(90, 30);
        RadioPanel.add(OK);

        //GUI.setOpaque(true);
        return GUI;

    }

    public void itemStateChanged(ItemEvent e) {
        Object source = e.getItemSelectable();
        if (source == RMA) {
            System.out.print("Browse");
        } else if (source == EMA) {
            System.out.print("EMA");
        } else if (source == SMA) {
            System.out.print("SMA");
        } else if (source == Williams) {
            System.out.print("Williams");
        } else if (source == Stochastic) {
            System.out.print("Stochastic");
        }
    }

    private static void createAndShowGUI() {
        JFrame frame = new JFrame("Indicators");

        IndicatorWindow ind = new IndicatorWindow();
        frame.setContentPane(ind.createContentPane());

        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setSize(200, 250);
        frame.setLayout(null);
        frame.setResizable(true);
        frame.setLocationRelativeTo(null);

        frame.setVisible(true);
        frame.setAlwaysOnTop(true);
        frame.setState(Frame.NORMAL);
    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                createAndShowGUI();
            }
        });
    }
}

但真正的解决方案是重写代码并使用布局管理器。在使用时,请使用适当的Java命名约定。变量名不以大写字母开头。你的“头衔”和“bg1”是对的。所以修正“EMA”、“RMA”等。

@camickr是正确的。请注意,使用布局管理器(以及一些重新分解)实际上可以简化代码。另外,相关的建议是使用动作监听器,而不是项目监听器

// title.setSize(500, 145);
title.setSize(500, 20);

您应该使用以下方法添加JRadioButtons:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/** @see http://stackoverflow.com/questions/5255337 */
public class IndicatorWindow implements ActionListener {

    JPanel radioPanel = new JPanel(new GridLayout(0, 1));
    JRadioButton rma, ema, sma, stochastic, williams;
    ButtonGroup bg = new ButtonGroup();

    public JPanel createContentPane() {
        JPanel gui = new JPanel(new BorderLayout());

        JPanel title = new JPanel();
        JLabel lab = new JLabel("Please Select Indicator Type");
        title.add(lab);
        gui.add(title, BorderLayout.NORTH);

        createRadioButton(rma, "RMA");
        createRadioButton(ema, "EMA");
        createRadioButton(sma, "SMA");
        createRadioButton(stochastic, "Stochastic");
        createRadioButton(williams, "Williams");
        gui.add(radioPanel, BorderLayout.CENTER);

        JButton ok = new JButton();
        ok.setText("Confirm");
        ok.addActionListener(this);
        radioPanel.add(ok);

        return gui;
    }

    private void createRadioButton(JRadioButton jrb, String name) {
        jrb = new JRadioButton(name);
        bg.add(jrb);
        jrb.addActionListener(this);
        radioPanel.add(jrb);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println(e.getActionCommand());
    }

    private static void createAndShowGUI() {
        JFrame frame = new JFrame("Indicators");

        frame.add(new IndicatorWindow().createContentPane());
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setAlwaysOnTop(true);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }
}
呼叫代码:

private void bgAdd (String name, int y)
{
    JRadioButton rb = new JRadioButton (name);
    rb.setLocation (0, y);
    rb.addItemListener (this);
    rb.setSize (110, 19);
    bg1.add (rb);
    radioPanel.add (rb);    
}
行动:

    bgAdd ("RMA", 0);
    bgAdd ("EMA", 30);
    bgAdd ("SMA", 60);
    bgAdd ("Stochastic", 90);
    bgAdd ("Williams",  120);

然后将BoxLayout添加到页面,例如

重新格式化的代码;如果不正确,请还原。我按原样开始代码。我不知道他为什么要找一个变化。在大多数情况下,当按下普通按钮时,您会评估RB的状态。这似乎是实验代码,不是吗?在哪里使用setAlwaysOnTop(true);?
public void itemStateChanged (ItemEvent e) {
    Object button = e.getItemSelectable ();
    String source = ((JRadioButton) button).getText ();
    System.out.print (source + " ");
}