Java JRadioButton在鼠标悬停之前不会显示
我的问题是,当我编译和运行这段代码时,会出现jFrame,但只有一个问题,3个JradioButton不会出现,直到你把鼠标放在它们上面。RMA和Williams radiobuttons出现了,中间的3个不知道,这是为什么?Java JRadioButton在鼠标悬停之前不会显示,java,swing,Java,Swing,我的问题是,当我编译和运行这段代码时,会出现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 + " ");
}