首先,这是一项家庭作业,因此,相对于固定解决方案而言,更喜欢解释和指示。我们正在学习挥杆动作,并且正在练习单独的类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{

        }
    }

}


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

最佳答案

额外的问题,为什么您要在内部类上使用一个单独的类,看来内部类更简单且错误更少,而又不会损失任何实际能力


最初,您没有选择,因为您没有内部类,但是,有时功能是通用的并且可以轻松重复,例如,“打开文件”操作,该操作由工具栏按钮进行管理,菜单项和键盘快捷键...



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

这个

public class MyActionListener extends SliderFrame implements ActionListener {


应该可能更像

public class MyActionListener implements ActionListener {


而不是传递JFrame的引用,您将要传递SliderFrame的引用。话虽如此,我不知道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”按钮使用,因为两者的功能相同)

09-11 04:52