我正在尝试创建一个程序,允许用户选择一个文本文件
从他们的目录。然后将其显示在使用Swing创建的框架内的JTextArea
中。
我用动作命令创建了一个按钮,该按钮应该允许用户一旦按下即可从文件中获取下一个文本行,并在文本区域内显示该文本行,直到到达文件末尾。
为此,我使用了sub-string命令来检查String变量并显示它。
但是它似乎不这样做,而是仅显示文件中找到的所有文本。
在下面,您将找到允许程序打开文件并显示的代码
作为创建用来帮助浏览文本的按钮。
package reader;
public class Viewer extends JFrame{
private static final long serialVersionUID = 1L;
private static JFrame Frame;
private JPanel Cpanel;
JScrollPane scrollPane;
String book = "";
int currentChar = 10;
static JTextArea textArea;
JFileChooser fileChooser;
File f;
public static void DocViewer() {
new Viewer("new document");
}
public Viewer(String s) {
Frame = new JFrame("Reader");
textArea = new JTextArea(20,60);
textArea.setFont(new Font("Calibri", Font.PLAIN, 12));
textArea.setWrapStyleWord(true);
textArea.setLineWrap(true);
textArea.setEditable(false);
scrollPane = new JScrollPane(textArea);
f = new File("C://Program Files//Java//jdk1.6.0//bin//");
fileChooser = new JFileChooser(f);
Frame.getContentPane().setBackground(Color.red);
Frame.setLayout(new GridLayout(3, 1));
Cpanel = new JPanel();
Cpanel.setLayout(new FlowLayout());
Cpanel.setBackground(Color.RED);
JButton StButton = new JButton("open");
JButton QButton = new JButton("back");
JButton TestButton = new JButton("next");
TestButton.setHorizontalTextPosition(SwingConstants.LEFT);
StButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String book = "";
// int currentChar=10;
int returnVal = fileChooser.showOpenDialog(Viewer.this);
try {
File file = fileChooser.getSelectedFile();
FileInputStream fin = new FileInputStream(file);
BufferedReader d = new BufferedReader(
new InputStreamReader(fin, "UTF-8"));
book = "";
if (returnVal == JFileChooser.APPROVE_OPTION) {
while (book != null) {
book = d.readLine();
textArea.append(book + "\n");
System.out.println(book);
}
}
System.out.println("returnVal = " + returnVal
+ " and ba.fileChooser.APPROVE_OPTION = "
+ JFileChooser.APPROVE_OPTION);
fin.close();
} catch (Exception ex) {
}
}
});
QButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// System.exit(0);
Viewer.EXIT_ON_CLOSE();
Loader.main(null);
}
});
TestButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String page = "";
for (int l = 1; l >= 10; l = l + 2) {
page += book.substring(l, l + 49);
page += "\n";
currentChar += 50;
}
}
});
Cpanel.add(StButton);
Cpanel.add(QButton);
Cpanel.add(TestButton);
Frame.add(Cpanel, BorderLayout.NORTH);
Frame.add(scrollPane, BorderLayout.CENTER);
Frame.setSize(300,300);
Frame.setVisible(true);
}
}
最佳答案
您的代码只会执行您要执行的操作。
您按钮的ActionListener具有一个while循环,该循环循环遍历整个文件,并将所有内容写入JTextArea。因此,我不确定为什么这种行为会让您感到惊讶。
如果是我,我会将整个文件读入ArrayList<String>
,并且每次添加新行一次。我会这样做一次,如果您事先知道要读取哪个文件,也许是在类构造函数中,或者如果不知道,则通过JFileChooser来获取文件。
然后在我的按钮中,使用int index变量存储此列表中的下一行,以存储索引号,并将此行附加到我的JTextArea上。
使用JList甚至比使用JTextArea更好。
做完了
编辑
您已经问了更多问题,所以我将尝试细分一些步骤:
创建一个ArrayList<String>
作为实例字段(非静态类变量)
打开文件,将其放入扫描仪对象
使用while循环,在扫描仪有下一行时循环
在循环内,使用扫描仪获取下一行并将其放入列表中。
还给该类一个int索引字段。
按下按钮时,获取与索引对应的ArrayList中的String,然后递增索引
使用其append方法在您的JTextField中发布该字符串。
如果仍然卡住,请进一步分解步骤,并尝试专门查找卡住的位置。 Google寻求解决方案,如果仍然遇到问题,请提出您的具体问题和代码。
检查java info resources。特别要看一下初学者的链接资源。
顺便说一句,您将要学习和使用Java naming conventions。变量名都应以小写字母开头,而类名应以大写字母开头。