Java 将StringBuilder附加到JTextArea

Java 将StringBuilder附加到JTextArea,java,jframe,stringbuilder,jfilechooser,Java,Jframe,Stringbuilder,Jfilechooser,我正在努力使自己成为文字处理机。我只熟悉JFileChooser的概念,并将其实现到我的代码中。我希望能够使用JFileChooser打开文本文件,并将文本文件的内容附加到JTextArea。为了尽我最大的努力分离我的功能,我实现了MVC(模型视图控制器),所以我有3个类。视图名为WordFrame.java,模型名为DataStuff.java,控制器名为ProcessEvents.java。我的问题很简单,我可以将文本文件的内容打印到控制台,但尝试将所述内容附加到文本区域只会产生空白,下图显

我正在努力使自己成为文字处理机。我只熟悉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,我相信这就是它的名称。我会看一看,谢谢,非常感谢。