Java 另一个 class 中的 actionListener 不会打开 window
Java actionListener in another class won't open the window
我是 java 的新手,我想用 3 个单选按钮制作一个简单的程序,一次只选择一个按钮。
我用相同的 class 中的 actionListener 创建了相同的程序并且它有效,但是当我将 actionListener 移动到不同的 class 时我卡住了。
这是我创建 window 的 class:
import javax.swing.JRadioButton;
import javax.swing.JFrame;
import java.awt.FlowLayout;;
public class window extends JFrame{
public JRadioButton radio1= new JRadioButton("Salam1");
public JRadioButton radio2= new JRadioButton("Salam2");
public JRadioButton radio3= new JRadioButton("Salam3");
public window(){
super("Title");
setLayout(new FlowLayout());
add(radio1);
add(radio2);
add(radio3);
action acc = new action();
radio1.addActionListener(acc);
radio2.addActionListener(acc);
radio3.addActionListener(acc);
}
}
这是我的 ActionListener Class:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class action implements ActionListener{
window sarma = new window();
public void actionPerformed(ActionEvent event){
if(sarma.radio1.isSelected()){
sarma.radio2.setSelected(false);
sarma.radio3.setSelected(false);
}
if(sarma.radio2.isSelected()){
sarma.radio1.setSelected(false);
sarma.radio3.setSelected(false);
}
if(sarma.radio3.isSelected()){
sarma.radio2.setSelected(false);
sarma.radio1.setSelected(false);
}
}
}
主要class
import javax.swing.JFrame;
public class first{
public static void main(String args[]) {
window salam = new window();
salam.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
salam.setSize(500,150);
salam.setResizable(false);
salam.setVisible(true);
}
}
在 class 操作中创建 window 对象(名为 sarma)后,当我尝试 运行 程序时,window 无法打开。
那么,我怎样才能让这个程序工作呢?
代码的当前问题归结为以下事实:动作侦听器没有引用原始 window,而是创建了一个永远不可见的完全独立的实例。 (详见 D.G)。
但是不需要动作侦听器。使用一个ButtonGroup
就可以实现效果,像这样:
import javax.swing.*;
import java.awt.*;
public class RadioButtonWindow extends JFrame{
public JRadioButton radio1= new JRadioButton("Salam1");
public JRadioButton radio2= new JRadioButton("Salam2");
public JRadioButton radio3= new JRadioButton("Salam3");
public RadioButtonWindow(){
super("Title");
setLayout(new FlowLayout());
add(radio1);
add(radio2);
add(radio3);
// Only one button in this group can be selected at a time!
ButtonGroup bg = new ButtonGroup();
bg.add(radio1);
bg.add(radio2);
bg.add(radio3);
}
public static void main(String args[]) {
RadioButtonWindow salam = new RadioButtonWindow ();
salam.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Wrong way to size a GUI!
//salam.setSize(500,150);
salam.setResizable(false);
// Correct way to size a GUI
salam.pack();
salam.setVisible(true);
}
}
我是 java 的新手,我想用 3 个单选按钮制作一个简单的程序,一次只选择一个按钮。 我用相同的 class 中的 actionListener 创建了相同的程序并且它有效,但是当我将 actionListener 移动到不同的 class 时我卡住了。
这是我创建 window 的 class:
import javax.swing.JRadioButton;
import javax.swing.JFrame;
import java.awt.FlowLayout;;
public class window extends JFrame{
public JRadioButton radio1= new JRadioButton("Salam1");
public JRadioButton radio2= new JRadioButton("Salam2");
public JRadioButton radio3= new JRadioButton("Salam3");
public window(){
super("Title");
setLayout(new FlowLayout());
add(radio1);
add(radio2);
add(radio3);
action acc = new action();
radio1.addActionListener(acc);
radio2.addActionListener(acc);
radio3.addActionListener(acc);
}
}
这是我的 ActionListener Class:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class action implements ActionListener{
window sarma = new window();
public void actionPerformed(ActionEvent event){
if(sarma.radio1.isSelected()){
sarma.radio2.setSelected(false);
sarma.radio3.setSelected(false);
}
if(sarma.radio2.isSelected()){
sarma.radio1.setSelected(false);
sarma.radio3.setSelected(false);
}
if(sarma.radio3.isSelected()){
sarma.radio2.setSelected(false);
sarma.radio1.setSelected(false);
}
}
}
主要class
import javax.swing.JFrame;
public class first{
public static void main(String args[]) {
window salam = new window();
salam.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
salam.setSize(500,150);
salam.setResizable(false);
salam.setVisible(true);
}
}
在 class 操作中创建 window 对象(名为 sarma)后,当我尝试 运行 程序时,window 无法打开。 那么,我怎样才能让这个程序工作呢?
代码的当前问题归结为以下事实:动作侦听器没有引用原始 window,而是创建了一个永远不可见的完全独立的实例。 (详见 D.G)。
但是不需要动作侦听器。使用一个ButtonGroup
就可以实现效果,像这样:
import javax.swing.*;
import java.awt.*;
public class RadioButtonWindow extends JFrame{
public JRadioButton radio1= new JRadioButton("Salam1");
public JRadioButton radio2= new JRadioButton("Salam2");
public JRadioButton radio3= new JRadioButton("Salam3");
public RadioButtonWindow(){
super("Title");
setLayout(new FlowLayout());
add(radio1);
add(radio2);
add(radio3);
// Only one button in this group can be selected at a time!
ButtonGroup bg = new ButtonGroup();
bg.add(radio1);
bg.add(radio2);
bg.add(radio3);
}
public static void main(String args[]) {
RadioButtonWindow salam = new RadioButtonWindow ();
salam.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Wrong way to size a GUI!
//salam.setSize(500,150);
salam.setResizable(false);
// Correct way to size a GUI
salam.pack();
salam.setVisible(true);
}
}