我遵循了一些关于如何使其工作的不同教程,我似乎无法通过我的按钮来更新JLabel。你能告诉我哪个部分不正确,并引导我走上正确的道路。这一直困扰着我好几个小时。
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.SwingConstants;
public class CoinApp extends JFrame {
private JLabel label;
private JRadioButton rdbtnNewRadioButton_3, rdbtnNewRadioButton, rdbtnNewRadioButton_1, rdbtnNewRadioButton_2;
public CoinApp() {
setBounds(50, 50, 500, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
ButtonGroup buttonGroup = new ButtonGroup();
JPanel panel = new JPanel();
getContentPane().add(panel);
JRadioButton rdbtnNewRadioButton_3 = new JRadioButton("");
buttonGroup.add(rdbtnNewRadioButton_3);
rdbtnNewRadioButton_3.setIcon(new ImageIcon(getClass().getResource("UsCent.png")));
panel.add(rdbtnNewRadioButton_3);
JRadioButton rdbtnNewRadioButton = new JRadioButton("");
buttonGroup.add(rdbtnNewRadioButton);
rdbtnNewRadioButton.setIcon(new ImageIcon(getClass().getResource("UsNickel.png")));
panel.add(rdbtnNewRadioButton);
JRadioButton rdbtnNewRadioButton_1 = new JRadioButton("");
buttonGroup.add(rdbtnNewRadioButton_1);
rdbtnNewRadioButton_1.setIcon(new ImageIcon(getClass().getResource("UsDime.png")));
panel.add(rdbtnNewRadioButton_1);
JRadioButton rdbtnNewRadioButton_2 = new JRadioButton("");
buttonGroup.add(rdbtnNewRadioButton_2);
rdbtnNewRadioButton_2.setVerticalAlignment(SwingConstants.TOP);
rdbtnNewRadioButton_2.setIcon(new ImageIcon(getClass().getResource("UsQuarter.png")));
panel.add(rdbtnNewRadioButton_2);
rdbtnNewRadioButton_3.setSelected(true);
label = new JLabel("CENT w:2.5 d:19.1", JLabel.CENTER);
add(label);
}
**
public void actionPerformed(ActionEvent evt) {
if ( rdbtnNewRadioButton_3.isSelected() ) {
label.setText("CENT w:2.5 d:19.1");
}
else if ( rdbtnNewRadioButton.isSelected() ) {
label.setText("NICKEL w:5.0 d:21.2");
}
else if ( rdbtnNewRadioButton_1.isSelected() ) {
label.setText("DIME w:2.3 d:17.9");
}
else if ( rdbtnNewRadioButton_2.isSelected() ) {
label.setText("QUARTER w:5.7 d:24.3");
}
} // end actionPerformed()
**
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
CoinApp frame = new CoinApp();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
for( Coin el : Coin.values())
{
System.out.println(el);
}
}
}
答案 0 :(得分:2)
首先看一下How to Write an Action Listeners
为了让您的按钮提供通知,您必须在其中注册ActionListener
。
然而,为了让您的按钮调用actionPerformed
方法,您需要实现ActionListener
界面......
public class CoinApp extends JFrame implements ActionListener {
//...
@Override
public void actionPerformed(ActionEvent evt) {
您应该将@Override
注释添加到您认为从父类或接口覆盖的方法中,如果您做错了,它会给您一个编译器警告,例如拼错它。 / p>
现在您可以使用按钮注册ActionListener
...
rdbtnNewRadioButton_3.addActioinListener(this);
<强>更新... 强>
另外,请注意,您正在隐藏变量......
我的意思是,您将变量声明为实例/类变量......
private JRadioButton rdbtnNewRadioButton_3, rdbtnNewRadioButton, rdbtnNewRadioButton_1, rdbtnNewRadioButton_2;
哪个好,但在你的构造函数中,你重新声明它们......
public CoinApp() {
//...
JRadioButton rdbtnNewRadioButton_3 = new JRadioButton("");
这意味着当您在程序中的其他位置引用rdbtnNewRadioButton_3
时,它将是null
。
你应该使用像...这样的东西。
public CoinApp() {
//...
rdbtnNewRadioButton_3 = new JRadioButton("");
答案 1 :(得分:2)
您需要将事件处理程序方法(actionPerformed
)连接到每个单选按钮。为此,您需要为每个单选按钮注册ActionListener
。最方便的方法是让主类实现ActionListener
界面,然后在每个单选按钮上调用addActionListener
,引用this
另请注意,您的事件处理程序方法当前会导致问题,因为您实际上从未设置类级别成员(字段)(rdbtnNewRadioButton_3
等)。实际上,您正在构造函数中创建新的局部变量,其名称与“隐藏”类级别字段相同,当它们超出范围时变为不可访问,使类级别变量保持为空。
您的构造函数代码应如下所示:
rdbtnNewRadioButton_3 = new JRadioButton("");
而不是
JRadioButton rdbtnNewRadioButton_3 = new JRadioButton("");
祝你好运!