【问题标题】:ActionListener in a separate ClassActionListener 在一个单独的类中
【发布时间】:2015-04-07 04:23:54
【问题描述】:

首先,这是一项家庭作业,因此解释和指示优于平面解决方案。我们正在学习摇摆,并且正在练习单独的类 ActionListeners(额外的问题,你为什么要在内部类上使用单独的类,看起来内部类更简单,更不容易出错,而不会失去任何真正的能力)。我遇到的问题是将 Frame 作为参数传递,以便单独的类可以访问它需要的工具,然后使用单独的类来实际更改显示。该项目应该像幻灯片一样工作,有一个计时器作为默认开关,但也实现了手动移动的按钮。

import javax.swing.*;

import java.awt.BorderLayout;
import java.awt.Image;
import java.awt.event.*;
import java.io.File;

public class SliderFrame extends JFrame{

    public SliderFrame(){
        File file1 = new File("images");  //change as necessary
        File file = new File("images\\CMU");
        File[] paths;
        paths = file.listFiles();

        //file1
        ImageIcon left = new ImageIcon("backward.png");
        ImageIcon right = new ImageIcon("forward.png");

        JButton btnLeft = new JButton(left);
        btnLeft.addActionListener(new MyActionListener(this));

        JButton btnRight = new JButton(right);
        btnRight.addActionListener(new MyActionListener(this));

        JTextField jtfTitle = new JTextField("Welcome to CMU!");
        JLabel jlbMain = new JLabel();

        new Timer(2000, new MyActionListener(this)).start();

        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());
        panel.add("PAGE_START", jtfTitle);
        panel.add("Center", jlbMain);
        panel.add("LINE_START", btnLeft);
        panel.add("LINE_END", btnRight);

        add(panel);

        setTitle("CPS240 SlideShow");
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setVisible(true);

    }
    public static void main(String[] args) {
        JFrame frame = new SliderFrame();
        btnRight.addActionListener(new MyActionListener(frame));
    }

}

然后是我的 ActionListener 类

import java.awt.event.*;

import javax.swing.*;
//does it need to extend SliderFrame?  Originally I thought it would help with some of my errors
public class MyActionListener extends SliderFrame implements ActionListener {
JFrame frame;

    public MyActionListener(JFrame frame) {
        this.frame = frame;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() instanceof Timer){
            //here's where I need to be able to change the 'main' label in the frame
        } else if(e.getSource() == btnRight){
            //trying to figure out if the left or right button was pushed
        } else{

        }
    }

}

我不确定我的错误的根源在于我如何设置开始的格式,或者我只是没有得到任何东西。任何帮助或意见将不胜感激。

【问题讨论】:

    标签: java swing class


    【解决方案1】:

    额外的问题,你为什么要使用一个单独的类而不是一个内部类,看起来内部类更简单,更不容易出错,而不会失去任何真正的能力

    最初,您别无选择,因为您不能拥有内部类,但是,在某些情况下,功能很常见并且可以很容易地重复,例如,“打开文件”操作,由工具栏按钮、菜单项和键盘快捷键...


    首先您的ActionListener 不需要从SliderFrame 扩展,而是可能想要引用SliderFrame 的实例...

    这个

    public class MyActionListener extends SliderFrame implements ActionListener {
    

    应该更像

    public class MyActionListener implements ActionListener {
    

    您需要传递SliderFrame 的引用,而不是传递JFrame 的引用。话虽如此,我不知道btnRight 在哪里,但我很确定它不应该在main 方法内维护,而是在SliderFrame 本身内维护......

    public class SliderFrame extends JFrame{
        public SliderFrame(){
            //...
            btnRight.addActionListener(new MyActionListener(this));
    

    ActionListener 也应该期待SliderFrame 的实例

    public class MyActionListener extends SliderFrame implements ActionListener {
        private SliderFrame frame;
    
        public MyActionListener(SliderFrame frame) {
    

    这允许您的ActionListener 使用由SliderFrame 定义的功能,而JFrame 的实例将无法使用这些功能

    接下来,您想在 SliderFrame 中提供可用于更新幻灯片状态的功能...

    public class SliderFrame extends JFrame{
        //...
        public void nextSlide() {
            //...
        }
    
        public void previousSlide() {
            //...
        }
    

    然后当您的ActionListener 被触发时,您只需在SliderFrame 上调用适当的方法

    public class NextSlideActionListener extends SliderFrame implements ActionListener {
        //...    
        @Override
        public void actionPerformed(ActionEvent e) {
            frame.nextSlide();
        }
    
    }
    

    (ps-上面的例子可以被Timer和“next”按钮使用,因为两者的功能是一样的)

    【讨论】:

    • 这大部分是有道理的并且已经实现,但是我在尝试实现从 SliderFrame 类到 MyActionListener 类的各种组件以发送回 SliderFrame 类时仍然遇到错误。前任。我需要 MAL 能够使用 paths[] 发送到 SF 类中的下一个/上一个幻灯片方法,以了解它在哪里以及它要去哪里。这仅仅是错误引入SF的问题吗?
    • 所以,paths 应该是一个实例字段。当前幻灯片的索引也应该是一个实例字段。更多详情请见Understanding Class Members
    猜你喜欢
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 2013-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多