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