Java 将StringBuilder附加到JTextArea
我正在努力使自己成为文字处理机。我只熟悉JFileChooser的概念,并将其实现到我的代码中。我希望能够使用JFileChooser打开文本文件,并将文本文件的内容附加到JTextArea。为了尽我最大的努力分离我的功能,我实现了MVC(模型视图控制器),所以我有3个类。视图名为WordFrame.java,模型名为DataStuff.java,控制器名为ProcessEvents.java。我的问题很简单,我可以将文本文件的内容打印到控制台,但尝试将所述内容附加到文本区域只会产生空白,下图显示了文本区域上的位置,表示其字符间距,这是在加载文件之后。如上所述,控制台完美地打印出来 此外,下面是模型和控制器的代码Java 将StringBuilder附加到JTextArea,java,jframe,stringbuilder,jfilechooser,Java,Jframe,Stringbuilder,Jfilechooser,我正在努力使自己成为文字处理机。我只熟悉JFileChooser的概念,并将其实现到我的代码中。我希望能够使用JFileChooser打开文本文件,并将文本文件的内容附加到JTextArea。为了尽我最大的努力分离我的功能,我实现了MVC(模型视图控制器),所以我有3个类。视图名为WordFrame.java,模型名为DataStuff.java,控制器名为ProcessEvents.java。我的问题很简单,我可以将文本文件的内容打印到控制台,但尝试将所述内容附加到文本区域只会产生空白,下图显
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.Scanner;
public class ProcessEvents {
private WordFrame frame = new WordFrame();
private DataStuff data = new DataStuff();
private DialogBoxes dialogs = new DialogBoxes();
private boolean fileSaved;
String fileName = "";
int fontSize = 0;
public ProcessEvents(WordFrame frame, DataStuff data){
this.frame = frame;
this.data = data;
this.frame.addListener(new wordProcessListener());
}
class wordProcessListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource().equals(frame.openMenuItem)){
frame.fileChooser.showOpenDialog(frame);
File f = frame.fileChooser.getSelectedFile();
System.out.println("Command Executed: open");
data.loadFile(f.getAbsoluteFile());
if(data.showText() != null){
String texts = data.showText().toString();
System.out.println(data.showText());
frame.textArea.append(data.showText().toString());
}
}
if(e.getSource().equals(frame.FontMenuItem)){
System.out.println("font");
}
if(e.getSource().equals(frame.exitMenuItem)){
dialogs.getConfirmDialog("exitWithoutSave");
}
if(e.getSource().equals(frame.saveMenuItem)){
dialogs.getSaveFileDialog();
data.saveFile("Bingo");
fileSaved = true;
}
if(e.getSource().equals(dialogs.close)){
if(!fileSaved){
}
}
}
}
}
这是模型
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class DataStuff {
private String fileName = "";
private File file;
String text;
String name;
private File saveFile;
int counter = 0;
FileInputStream fis = null;
FileOutputStream fout = null;
StringBuilder sb;
char[] charArray;
int count = 0;
public void loadFile(File fileName){
this.file = fileName;
try{
fis = new FileInputStream(file);
charArray = new char[fis.read()];
while ((counter = fis.read()) != -1) {
System.out.print((char) counter);
sb = new StringBuilder();
sb.append(charArray);
}
}
catch(IOException ex){
ex.printStackTrace();
}
finally {
try {
if (fis != null)
fis.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
public StringBuilder showText(){
return sb;
}
public void saveFile(String name) {
this.name = name;
try{
fout = new FileOutputStream(saveFile+"/"+name+".txt");
}
catch(IOException e){
System.out.println("File failed to save or something went horribly wrong");
}
}
}
一如既往,我们感谢您的帮助
编辑:所以我在下面的人的帮助下修复了这个解决方案,我决定我不想替换上面的代码,以防其他人遇到同样的问题并看到差异,这里是视图类再次调整
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class DataStuff {
private String fileName = "";
private File file;
String text;
String name;
private File saveFile;
int counter = 0;
FileInputStream fis = null;
FileOutputStream fout = null;
StringBuilder sb = new StringBuilder(4096);
//char[] charArray = new char[4096];
int count = 0;
public void loadFile(File fileName){
this.file = fileName;
try{
fis = new FileInputStream(file);
// charArray = Character.toChars(fis.read());
while ((counter = fis.read()) != -1) {
System.out.print((char) counter);
sb.append((char) counter);
}
}
catch(IOException ex){
ex.printStackTrace();
}
finally {
try {
if (fis != null)
fis.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
public StringBuilder showText(){
return sb;
}
public void saveFile(String name) {
this.name = name;
try{
fout = new FileOutputStream(saveFile+"/"+name+".txt");
}
catch(IOException e){
System.out.println("File failed to save or something went horribly wrong");
}
}
}
在第一次回顾中,您似乎在每个循环迭代中创建一个新的字符串生成器,而不是重用它。您应该在启动while循环之前创建stringbuilder,并且在每次迭代中只添加读取字符。您还将丢失文件的前几个字节,其中包含“new char[fis.read()”。您应该创建固定大小的字符数组和StringBuilder-4096或8192通常是很好的大小。好的,哇,两个很好的响应,让您可以同时使用AngerClown和vbazaga86。我将在上面调整我的代码以向您显示更改,但我让它工作了,但是我发现我实际上根本不需要一个char字段,我只需将counter的int值键入一个char,并将其附加到一个StringBuilder,它按照AngerClown的建议被指定了一个固定大小。话虽如此,请仔细查看我的解决方案并指出任何错误,我将非常感激。这个新代码的唯一问题是,您正在逐字节读取文件,这在性能方面不是一个好方法。如果使用阵列,可以减少磁盘访问次数,从而提高性能。是的,我在某个地方读到过,我应该使用BufferedReader,我相信这就是它的名称。我会看一看,谢谢,非常感谢。