使用链表读取Java中的图像/文本文件

使用链表读取Java中的图像/文本文件,java,swing,list,Java,Swing,List,我正在为我的编程模块做一个学生项目,在这个项目中,我们必须构建一个项目来整合许多不同的Java功能,主要是GUI设计和高级数据结构,因此我正在为学生开发一个Java培训系统,他们将在该系统中注册,学习不同的Java教程和静坐测试。我现在被困在其中一个教程上,因为我认为这是一个好主意,而不是让多个页面浏览教程,当用户点击“下一步”按钮或“上一步”按钮时,教程中的图像和内容将在该页面上更新。因此,所有图像和文本文件的名称都将存储在一个链表中(顺序正确),教程将从索引1(开始)开始,因此图像1和内容1

我正在为我的编程模块做一个学生项目,在这个项目中,我们必须构建一个项目来整合许多不同的Java功能,主要是GUI设计和高级数据结构,因此我正在为学生开发一个Java培训系统,他们将在该系统中注册,学习不同的Java教程和静坐测试。我现在被困在其中一个教程上,因为我认为这是一个好主意,而不是让多个页面浏览教程,当用户点击“下一步”按钮或“上一步”按钮时,教程中的图像和内容将在该页面上更新。因此,所有图像和文本文件的名称都将存储在一个链表中(顺序正确),教程将从索引1(开始)开始,因此图像1和内容1将显示,当用户点击下一步时,索引将增加1,图像和内容将更新。 我当前收到的错误消息是

java.lang.NullPointerException at gui.Tutorial1page1.imageSelect(Tutorial1page1.java:66)
at gui.Tutorial1page1.<init>(Tutorial1page1.java:69)
at gui.Tutorial1page1$1.run(Tutorial1page1.java:39)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
gui.Tutorial1page1.imageSelect(Tutorial1page1.java:66)中的java.lang.NullPointerException 在gui.Tutorial1page1.(Tutorial1page1.java:69) 在gui.tutorial1page$1.run(tutorial1page.java:39) 在java.awt.event.InvocationEvent.dispatch(未知源)处 位于java.awt.EventQueue.dispatchEventImpl(未知源) 位于java.awt.EventQueue.access$000(未知源) 在java.awt.EventQueue$3.run处(未知源) 在java.awt.EventQueue$3.run处(未知源) 位于java.security.AccessController.doPrivileged(本机方法) 位于java.security.ProtectionDomain$1.doIntersectionPrivilege(未知源) 位于java.awt.EventQueue.dispatchEvent(未知源) 位于java.awt.EventDispatchThread.pumpOneEventForFilters(未知源) 位于java.awt.EventDispatchThread.pumpEventsForFilter(未知源) 位于java.awt.EventDispatchThread.pumpEventsForHierarchy(未知源) 位于java.awt.EventDispatchThread.pumpEvents(未知源) 位于java.awt.EventDispatchThread.pumpEvents(未知源) 位于java.awt.EventDispatchThread.run(未知源)
任何关于从哪里开始寻找的建议,或者如果不可能,我们都将不胜感激。可能还应该提到的是,在我添加链接列表之前,整个工作就是阅读图片。谢谢:-)

packagegui;
导入java.awt.EventQueue;
导入java.awt.TextArea;
导入javax.imageio.imageio;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入java.awt.Color;
导入javax.swing.JButton;
导入java.awt.Font;
导入javax.swing.BorderFactory;
导入javax.swing.JLabel;
导入javax.swing.ImageIcon;
导入javax.swing.JProgressBar;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.image.buffereImage;
导入java.io.FileReader;
导入java.io.IOException;
导入java.util.LinkedList;
导入java.util.Scanner;
公共类教程1Page1扩展了JFrame{
/**
* 
*/
私有静态最终长serialVersionUID=1L;
私有JPanel内容窗格;
/**
*启动应用程序。
*/
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
公开募捐{
试一试{
Tutorial1page1 frame=新Tutorial1page1();
frame.setVisible(true);
}捕获(例外e){
e、 printStackTrace();
}
}
});
}
//声明图像的linkedlist
私有链接列表图像内容;
//为要选择的图像的索引声明int
//当用户点击“下一步”按钮时,该值将增加一个,而“后退”按钮将减少一个
int指数=1;
//按顺序存储文件名,最后添加将把它们添加到列表的末尾
公共图像()
{
imageContent=新建链接列表();
imageContent.addLast(“\”IfStatement.png\”);
imageContent.addLast(“\”ifelstatement.png\”);
}
//选择图像
公共字符串imageSelect(整数索引)
{
返回imageContent.get(索引);
}
字符串图像=图像选择(索引);
/**
*创建框架。
*@抛出异常
*/
公共教程1Page 1()引发IOException{
//创建、格式化和定位jframe
可设置大小(假);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//框架关闭时退出程序
立根(300,75,800,600);
contentPane=newjpanel();
contentPane.setBackground(颜色:白色);
setContentPane(contentPane);
contentPane.setLayout(null);
//创建、格式化和定位按钮,用于返回教程页面
//是否应在第一页禁用此功能??
JButton btnBack=新JButton(“”);
设置前景(颜色为白色);
setFont(新字体(“Tahoma”,Font.PLAIN,20));
btnNext.setBackground(蓝色);
b下一个立根(550500120,30);
contentPane.add(
package gui;

import java.awt.EventQueue;
import java.awt.TextArea;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Color;
 import javax.swing.JButton;
import java.awt.Font;
import javax.swing.BorderFactory;
 import javax.swing.JLabel;
import javax.swing.ImageIcon;
import javax.swing.JProgressBar;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.FileReader;
import java.io.IOException;
import java.util.LinkedList;
import java.util.Scanner;


public class Tutorial1page1 extends JFrame {

/**
 * 
 */
private static final long serialVersionUID = 1L;
private JPanel contentPane;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Tutorial1page1 frame = new Tutorial1page1();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

//declare the linkedlist for the images
private LinkedList<String> imageContent;

//declare int for the index of what image to select
//this will increase by one when user hits next button & decrease for back button
int index = 1;

//store the names of the files in order, add last will add them to end of list
public void Images()
{
    imageContent = new LinkedList<String>();
    imageContent.addLast("\"IfStatement.png\"");
    imageContent.addLast("\"IfElseStatement.png\"");
}

//select image
public String imageSelect(int index)
{
return imageContent.get(index);
}

String image = imageSelect(index);
/**
 * Create the frame.
 * @throws IOException 
 */
public Tutorial1page1() throws IOException {

    //create, format and locate jframe
    setResizable(false);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//exit program when framed closed
    setBounds(300, 75, 800, 600);
    contentPane = new JPanel();
    contentPane.setBackground(Color.WHITE);
    setContentPane(contentPane);
    contentPane.setLayout(null);

    //create, format and position button for going back through pages of tutorial
    //should this be disabled on first page??
    JButton btnBack = new JButton(" < Back ");
    btnBack.setForeground(Color.WHITE);
    btnBack.setFont(new Font("Tahoma", Font.PLAIN, 20));
    btnBack.setBackground(Color.BLUE);
    btnBack.setBounds(150,500,120,30);
    contentPane.add(btnBack);

    //create, format and position button for quitting the tutorial
    JButton btnQuit = new JButton("Quit");
    btnQuit.setForeground(Color.WHITE);
    btnQuit.setFont(new Font("Tahoma", Font.PLAIN, 20));
    btnQuit.setBackground(Color.BLUE);
    btnQuit.setBounds(350,500,120,30);
    contentPane.add(btnQuit);

    //add button listener for Next button
    btnQuit.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {

            dispose();//close current screen
            //open main screen
            try {
                Main frame = new Main(); 
                //open last page of tutorial, in this case main module page
                frame.setVisible(true);
                //open in centre of screen
                frame.setLocationRelativeTo(null);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });

    //create, format and position button for going forward through pages of tutorial
    JButton btnNext = new JButton("Next > ");
    btnNext.setForeground(Color.WHITE);
    btnNext.setFont(new Font("Tahoma", Font.PLAIN, 20));
    btnNext.setBackground(Color.BLUE);
    btnNext.setBounds(550,500,120,30);
    contentPane.add(btnNext);

    //add button listener for Next button
    btnNext.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {

            dispose();//close current screen
            //open main screen
            try {
                Tutorial1page2 frame = new Tutorial1page2(); //open next page of tutorial
                frame.setVisible(true);
                //open in centre of screen
                frame.setLocationRelativeTo(null);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });

    //create, format and position help button on each page of tutorial
    //uses label appearance method to look like linked text
    JButton btnHelp = new JButton("Help");
    btnHelp.setForeground(Color.WHITE);
    btnHelp.setBackground(Color.BLUE);
    btnHelp.setFont(new Font("Tahoma", Font.BOLD, 15));
    btnHelp.setBounds(740,0,50,50);
    contentPane.add(btnHelp);
    Login.labelAppearance(btnHelp);

    //import and position resized icon
    BufferedImage iconresized = ImageIO.read(this.getClass().getResource("/gui/iconresized.png"));
    JLabel picLabel = new JLabel(new ImageIcon(iconresized));
    contentPane.add(picLabel);
    picLabel.setBounds(5,10,50,80);

    //create, format and position label for the Tutorial description
    //this will remain the same on all pages of this tutorial
    JLabel lblTutorial1 = new JLabel("TUTORIAL 1 - Composition : If, switch, while & for statements");
    lblTutorial1.setFont(new Font("Gisha", Font.BOLD, 22));
    lblTutorial1.setForeground(Color.BLUE);
    lblTutorial1.setBounds(60, 40, 675, 44);
    lblTutorial1.setBorder(BorderFactory.createLineBorder(Color.BLUE));
    contentPane.add(lblTutorial1);

    //create, format and position label for the title of this page
    //this changes on each page of each tutorial
    JLabel lblIntroductionT1 = new JLabel("Introduction - Select Statements");
    lblIntroductionT1.setFont(new Font("Gisha", Font.ITALIC, 15));
    lblIntroductionT1.setForeground(Color.RED);
    lblIntroductionT1.setBounds(20, 125, 300, 26);
    contentPane.add(lblIntroductionT1);


    //create new text field for displaying notes on the page
    //this will wrap text to the text field horizontally, but allow a vertical scroll bar
    //if the text goes on too long to fit the field vertically
    TextArea Content1 = new TextArea("", 4, 30, TextArea.SCROLLBARS_VERTICAL_ONLY);
    Content1.setBounds(20, 155, 400, 300);
    contentPane.add(Content1);
    //add(textField, BorderLayout.NORTH);
    Content1.setEditable(false);

    //read in text file for content
    FileReader readtextfile = new FileReader("src/gui/Tutorial1content.txt");

    //open scanner
    Scanner FileReaderScan = new Scanner(readtextfile);

    //create sting Tut1content to store what is read in
    String Tut1content ="";

    //while there is another line in text file add it to string
    while(FileReaderScan.hasNextLine()){
        String temp = FileReaderScan.nextLine() + "\n";
        Tut1content = Tut1content + temp;

    }

    //add contents of string to the text area
    Content1.append(Tut1content);

    //close scanner
    FileReaderScan.close();


    //import and position the diagram to go with text
    //both should be parallel to each other

    //read in image
    BufferedImage IfState = ImageIO.read(this.getClass().getResource(imageSelect(index)));

    //set image in JLabel
    JLabel picLabel2 = new JLabel(new ImageIcon(IfState));
    //add border to picture
    picLabel2.setBorder(BorderFactory.createLineBorder(Color.black));
    //add to frame
    contentPane.add(picLabel2);
    //set bounds, location
    picLabel2.setBounds(450,155,300,300);

    //create and position progress bar so user can track where they are in tutorial

    JProgressBar tut1progressBar = new JProgressBar(0,5);
    tut1progressBar.setValue(1); //page 1 of 5
    tut1progressBar.setBounds(220, 550, 380, 14);
    contentPane.add(tut1progressBar);

    //add label to progress bar to show page number currently on
    JLabel lblProgress1 = new JLabel("Page 1/5");
    lblProgress1.setFont(new Font("Gisha", Font.ITALIC, 10));
    lblProgress1.setForeground(Color.RED);
    lblProgress1.setBounds(690, 540, 80, 26);
    contentPane.add(lblProgress1);
}
}