【问题标题】:Linking single listener to multiple buttons将单个侦听器链接到多个按钮
【发布时间】:2013-01-31 21:15:09
【问题描述】:

您好,我在将单个侦听器链接到多个按钮时遇到问题。我正在尝试使用内部类,但似乎我在某处弄错了。有人可以指出我正确的方向吗? 如果它有助于自动更正的东西( :D )指向第 59 行说:

“createChampButton 无法解析为变量”

代码:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;




public class GUI extends JApplet{



    public void init(){
        Container guiContainer = getContentPane();
        LayoutManager layout = new FlowLayout();
        guiContainer.setLayout(layout);


        //Create Championship Button
        final JButton createChampButton = new JButton("Create Championship");
        guiContainer.add(createChampButton);



        //Create Club Button
        final JButton createClubButton = new JButton ("Create Club");
        guiContainer.add(createClubButton);


        //Create Athlete Button
        final JButton createAthleteButton = new JButton ("Create Athlete");
        guiContainer.add(createAthleteButton);


        //Print Athletes Button
        final JButton printAthletesButton = new JButton ("Print all Athletes");
        guiContainer.add(printAthletesButton);


        //The quiet Listener
        ButtonListener aListener = new ButtonListener();
        printAthletesButton.addActionListener(aListener);
        createAthleteButton.addActionListener(aListener);
        createClubButton.addActionListener(aListener);
        createChampButton.addActionListener(aListener);

    }

     class ButtonListener implements ActionListener {
        public void actionPerformed(ActionEvent event){
            JButton button = (JButton) event.getSource();
            //if (button.equals(printAthletesButton)){
                //JOptionPane.showMessageDialog(null, "Athlete name is: " +anAthlete.GetAthleteName());
            //  JOptionPane.showMessageDialog(null, "Athlete age is: " + anAthlete.GetAge());
                //}
            if(button.equals(createChampButton)){
                    Championship aChampionship = new Championship("","");
                    aChampionship.champName = JOptionPane.showInputDialog("Enter Championship Name: ");
                    aChampionship.duration = JOptionPane.showInputDialog("Enter Championship Duration: ");
            }       
        }
    }
}

提前致谢, 克里斯

【问题讨论】:

  • 这个问题真的与多个按钮或 Swing 无关。这似乎只是 OP 不理解变量范围和编译器错误的情况。我建议在尝试使用 Swing 和 AWT 之前尝试学习一些更基本的 Java 编程概念。

标签: java swing variables actionlistener japplet


【解决方案1】:

createChampButtoninit()中的一个局部变量

要在其他地方访问它,您需要将其更改为类中的一个字段。

【讨论】:

    【解决方案2】:

    createChampButton 未在您的其他方法中定义,因此您无法访问该范围。我看到了三种解决方法:

    1) 您使用 component.getActionCommand() 代替 - 您可以将其与您的 JButton 包含的文本进行比较(类似于 if( evt.getSource().getActionCommand().equals("Create Championship")

    2) 你可以在你的 init 方法中定义你的 ActionListener:

    public void init(){
        Container guiContainer = getContentPane();
        LayoutManager layout = new FlowLayout();
        guiContainer.setLayout(layout);
    
    
        //Create Championship Button
        final JButton createChampButton = new JButton("Create Championship");
        guiContainer.add(createChampButton);
    
    
    
        //Create Club Button
        final JButton createClubButton = new JButton ("Create Club");
        guiContainer.add(createClubButton);
    
    
        //Create Athlete Button
        final JButton createAthleteButton = new JButton ("Create Athlete");
        guiContainer.add(createAthleteButton);
    
    
        //Print Athletes Button
        final JButton printAthletesButton = new JButton ("Print all Athletes");
        guiContainer.add(printAthletesButton);
    
    
        //The quiet Listener
        ActionListener aListener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event){
                JButton button = (JButton) event.getSource();
                //if (button.equals(printAthletesButton)){
                    //JOptionPane.showMessageDialog(null, "Athlete name is: " +anAthlete.GetAthleteName());
                //  JOptionPane.showMessageDialog(null, "Athlete age is: " + anAthlete.GetAge());
                    //}
                if(button.equals(createChampButton)){
                        Championship aChampionship = new Championship("","");
                        aChampionship.champName = JOptionPane.showInputDialog("Enter Championship Name: ");
                        aChampionship.duration = JOptionPane.showInputDialog("Enter Championship Duration: ");
                }       
            }
        };
        printAthletesButton.addActionListener(aListener);
        createAthleteButton.addActionListener(aListener);
        createClubButton.addActionListener(aListener);
        createChampButton.addActionListener(aListener);
    
    }
    

    }

    3) 您将 JComponents 定义为实例变量 - 在您的 init() 方法之外声明它们(但仍然在内部分配它们)

    问候,
    丹尼尔

    【讨论】:

    • 选项 3:为按钮使用类级字段。这在 Swing 程序中很常见。
    • 是的,没错。好吧,我想我错过了显而易见的事情。编辑了我的答案。
    • 感谢 Danyel 解决了问题!感谢杰西的投入,我将继续朝着这个方向努力:)
    猜你喜欢
    • 2011-12-02
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多