另一个类中的Java actionListener无法打开窗口

时间:2019-01-04 13:26:34

标签: java swing awt actionlistener

我是Java的新手,我想制作一个具有3个radioButtons的简单程序,一次仅选择一个按钮。 我在同一类中使用actionListener编写了相同的程序,并且可以正常工作,但是当我将actionListener移到另一个卡住的类中时。

这是我创建窗口的类:

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类:

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);
        }
    }
}

主要班级

    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);
    }
}

在动作类中创建窗口对象(名为sarma)后,尝试运行程序时窗口不会打开。 那么,如何使该程序正常工作?

1 个答案:

答案 0 :(得分:1)

当前的代码问题归结为以下事实:动作侦听器没有对原始窗口的引用,而是创建了一个完全独立的实例,该实例从未设置为可见。 (如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);
    }
}