【问题标题】:Java actionListener in another class won't open the window另一个类中的 Java actionListener 不会打开窗口
【发布时间】:2019-05-31 01:53:48
【问题描述】:

我是 java 新手,我想用 3 个单选按钮制作一个简单的程序,一次只选择一个按钮。 我在同一个类中使用 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) 请学习常见的 Java 命名法(命名约定 - 例如EachWordUpperCaseClassfirstWordLowerCaseMethod()firstWordLowerCaseAttribute,除非它是 UPPER_CASE_CONSTANT)并始终如一地使用它。 2) 研究ButtonGroup 替换ActionListener。它将实现动作侦听器实际尝试实现的一切。

标签: java swing awt actionlistener


【解决方案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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多