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