-1

因此,我的数据存储在一个名为 log.txt 的文件中,我想在 GUI 中查看它的内容。所以我有这两个我正在使用的类,一个是 Engine,我在其中读取 log.txt 文件,另一个是 GUI,用于应用 Engine 中使用的方法。

所以,在我的引擎中,我有这些代码:

public void loadLog()
    {
        try
        {
            java.io.File cpFile = new java.io.File( "log.txt" );

            if ( cpFile.exists() == true )
            {
                File file = cpFile;

                FileInputStream fis = null;
                BufferedInputStream bis = null;
                DataInputStream dis = null;

                String strLine="";
                String logPrint="";

                fis = new FileInputStream ( file );

                // Here is BufferedInputStream added for fast reading
                bis = new BufferedInputStream ( fis );
                dis = new DataInputStream ( bis );

                // New Buffer Reader
                BufferedReader br = new BufferedReader( new InputStreamReader( fis ) );

                while ( ( strLine = br.readLine() ) != null )
                {
                    StringTokenizer st = new StringTokenizer ( strLine, ";" );

                    while ( st.hasMoreTokens() )
                    {
                        logPrint       = st.nextToken();
                        System.out.println(logPrint);

                    }

                    log = new Log();
                    //regis.addLog( log );




                }
            }

        }
        catch ( Exception e ){
        }
    }

然后,在我的 GUI 中,我会尝试应用在我的引擎中使用的代码:

                    // create exit menu
        Logout = new JMenu("Exit");

        // create JMenuItem for about menu
        reportItem   = new JMenuItem ( "Report" );

        // add about menu to menuBar
        menuBar.add ( Logout );
        menuBar.setBorder ( new BevelBorder(BevelBorder.RAISED) );

        Logout.add ( reportItem );

    /* --------------------------------- ACTION LISTENER FOR ABOUT MENU ------------------------------------------ */

        reportItem.addActionListener ( new ActionListener()
        {
            public void actionPerformed ( ActionEvent e )
            {

                    engine.loadLog();
                    mainPanel.setVisible (false);
                    mainPanel = home();
                    toolBar.setVisible(false);
                    vasToolBar.setVisible(false);
                    cpToolBar.setVisible(false);
                    add ( mainPanel, BorderLayout.CENTER );
                    add ( toolBar, BorderLayout.NORTH );
                    toolBar.setVisible(false);
                    mainPanel.setVisible ( true );
                    pack();
                    setSize(500, 500);
            }
        });

现在,

我的问题是,如何在 GUI 部分中打印出引擎方法中读取的任何内容?我希望它们位于 JLabel 或 JTextArea 内。我该怎么做?

4

3 回答 3

2

也许您希望您的 loadLog 方法返回一个包含从文件中读取的文本的字符串,然后在 GUI 中调用该方法并根据需要显示返回的字符串。此外,在执行 I&O 时,永远不要有一个空的 catch 块。

于 2012-11-03T19:30:30.803 回答
2

文件 IO 操作被认为是阻塞/耗时的。

您应该避免在事件调度线程中运行它们,因为这将阻止 UI 开始更新,使您的应用程序看起来像挂起/崩溃

您可以使用 aSwingWorker来执行文件加载部分,将每一行传递给该publish方法并通过该方法将这些行添加到文本区域process...

public class FileReaderWorker extends SwingWorker<List<String>, String> {

    private final File inFile;
    private final JTextArea output;

    public FileReaderWorker(File file, JTextArea output) {
        inFile = file;
        this.output = output;
    }

    public File getInFile() {
        return inFile;
    }

    public JTextArea getOutput() {
        return output;
    }

    @Override
    protected void process(List<String> chunks) {
        for (String line : chunks) {
            output.append(line);
        }
    }

    @Override
    protected List<String> doInBackground() throws Exception {
        List<String> lines = new ArrayList<String>(25);
        java.io.File cpFile = getInFile();
        if (cpFile != null && cpFile.exists() == true) {
            File file = cpFile;

            BufferedReader br = null;

            String strLine = "";
            String logPrint = "";
            try {
                // New Buffer Reader
                br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
                while ((strLine = br.readLine()) != null) {
                    StringTokenizer st = new StringTokenizer(strLine, ";");
                    while (st.hasMoreTokens()) {
                        logPrint = st.nextToken();
                        publish(logPrint);
                    }
                }
            } catch (Exception e) {
                publish("Failed read in file: " + e);
                e.printStackTrace();
            } finally {
                try {
                    if (br != null) {
                        br.close();
                    }
                } catch (Exception e) {
                }
            }
        } else {
            publish("Input file does not exist/hasn't not begin specified");
        }            
        return lines;
    }
}

查看课程:Swing 中的并发以获取更多信息

于 2012-11-03T19:38:04.250 回答
0

如果我误解了你的问题,请原谅我,但这里什么都没有:

您将要逐行读取文本文件,并将每一行添加到 JTextArea。

        BufferedReader reader = new BufferedReader(new FileReader("pathToFile"));  //This code creates a new buffered reader with the specified file input.  Replace pathToFile with the path to your text file.
        String text = reader.readLine();
        while(text != null) {
        myTextArea.append("\n" + text);  //Replace myTextArea with your JTextArea
        text = reader.readLine();
        }
于 2012-11-03T19:36:11.620 回答