0

これが可能かどうかはわかりませんが、非常に新しいので、これに光を当てることができれば幸いです。txtファイルのすべての内容を読み取り、ターミナルウィンドウに出力する機能がありますが、テキストファイルのデータを変数に保存できるので、後で使用できます。これは可能です。

ここにコードの断片があります:

String mText; 
        while((mText = br.readLine()) != null) { 
            //Displays the contents of the file in terminal
            System.out.println(mText); 
        } 

ループが終了すると、変数mTextの内容が削除されることを理解しているので、この場合は削除されますか?

以下のコードで、そのファイルの内容をプリンターに印刷したいのですが、実行すると、ファイルの内容を問題なく表示できますが、プリンターオプションボックスが表示されないのではないかと思いました。これが問題になるでしょう、それは私のコードの他の何かのように見えます:

import java.awt.*;
import java.awt.font.*;
import java.awt.geom.*;
import java.awt.print.*;
import java.text.*;
import java.io.*;
import javax.swing.*;

public class PrintText implements Printable {
    private static String mText;

    // Below the code will allow the user to select a file and then print out the contents of the file
    public static void main(String[] args) throws IOException {

        //selects the file
        JFileChooser chooser = new JFileChooser();
        chooser.showOpenDialog(null);
        File file = chooser.getSelectedFile();
        String filename = file.getName();
        //System.out.println("You have selected: " + filename);  testing to see if file seleected was right
        String path = file.getAbsolutePath();

        //Reads contents of file into terminal 
        //FileReader fr = new FileReader("filename");
        // FileReader fr = new FileReader("D:/Documents/" + "filename")); 

        FileReader fr = new FileReader(path); 
        BufferedReader br = new BufferedReader(fr); 
        String mText; 
        while((mText = br.readLine()) != null) { 
            //Displays the contents of the file in terminal
            System.out.println(mText); 
        } 
        //fr.close(); 
    } 

    //private static final String mText = 
    //    "This is a test to see if this text will be printed "; //This works perfectly fine

    AttributedString mStyledText = new AttributedString(mText);


    /**
     * Print a single page containing some sample text.
     */
    static public void printer(String args[]) {
        /* Get the representation of the current printer and 
         * the current print job.
         */
        PrinterJob printerJob = PrinterJob.getPrinterJob();
        /* Build a book containing pairs of page painters (Printables)
         * and PageFormats. This example has a single page containing
         * text.
         */
        Book book = new Book();
        book.append(new PrintText(), new PageFormat());
        /* Set the object to be printed (the Book) into the PrinterJob.
         * Doing this before bringing up the print dialog allows the
         * print dialog to correctly display the page range to be printed
         * and to dissallow any print settings not appropriate for the
         * pages to be printed.
         */
        printerJob.setPageable(book);
        /* Show the print dialog to the user. This is an optional step
         * and need not be done if the application wants to perform
         * 'quiet' printing. If the user cancels the print dialog then false
         * is returned. If true is returned we go ahead and print.
         */
        boolean doPrint = printerJob.printDialog();
        if (doPrint) {
            try {
                printerJob.print();
            } catch (PrinterException exception) {
                System.err.println("Printing error: " + exception);
            }
        }
    }

    /**
     * Print a page of text.
     */
    public int print(Graphics g, PageFormat format, int pageIndex) {
        /* We'll assume that Jav2D is available.
         */
        Graphics2D g2d = (Graphics2D) g;
        /* Move the origin from the corner of the Paper to the corner
         * of the imageable area.
         */
        g2d.translate(format.getImageableX(), format.getImageableY());
        /* Set the text color.
         */
        g2d.setPaint(Color.black);
        /* Use a LineBreakMeasurer instance to break our text into
         * lines that fit the imageable area of the page.
         */
        Point2D.Float pen = new Point2D.Float();
        AttributedCharacterIterator charIterator = mStyledText.getIterator();
        LineBreakMeasurer measurer = new LineBreakMeasurer(charIterator, g2d.getFontRenderContext());
        float wrappingWidth = (float) format.getImageableWidth();
        while (measurer.getPosition() < charIterator.getEndIndex()) {
            TextLayout layout = measurer.nextLayout(wrappingWidth);
            pen.y += layout.getAscent();
            float dx = layout.isLeftToRight()? 0 : (wrappingWidth - layout.getAdvance());
            layout.draw(g2d, pen.x + dx, pen.y);
            pen.y += layout.getDescent() + layout.getLeading();
        }
        return Printable.PAGE_EXISTS;
    }
}

これは私が行った元のコードです。プログラムに事前に入力されたテキストを出力します。上記のようにファイルリーダーを追加しようとしましたが、機能しません。

import java.awt.*;
import java.awt.font.*;
import java.awt.geom.*;
import java.awt.print.*;
import java.text.*;
import java.io.*;
import javax.swing.*;
import java.util.List;
import java.util.ArrayList;

public class PrintText implements Printable {
   /** private static String mText;

    // Below the code will allow the user to select a file and then print out the contents of the file
    public static void main(String[] args) throws IOException {

        //selects the file
        JFileChooser chooser = new JFileChooser();
        chooser.showOpenDialog(null);
        File file = chooser.getSelectedFile();
        String filename = file.getName();
        //System.out.println("You have selected: " + filename);  testing to see if file seleected was right
        String path = file.getAbsolutePath();

        //Reads contents of file into terminal 
        //FileReader fr = new FileReader("filename");
        // FileReader fr = new FileReader("D:/Documents/" + "filename")); 

        FileReader fr = new FileReader(path); 
        BufferedReader br = new BufferedReader(fr); 
        List<String> list = new ArrayList<String>();
        while((mText = br.readLine()) != null) { 
            //Displays the contents of the file in terminal
            System.out.println(mText);
            list.add(mText); 
        } 
        //fr.close(); 
    } 
*/
    private static final String mText = 
        "This is a test to see if this text will be printed "; //This works perfectly fine

    AttributedString mStyledText = new AttributedString(mText);

    /**
     * Print a single page containing some sample text.
     */
    static public void main(String args[]) {
        /* Get the representation of the current printer and 
         * the current print job.
         */
        PrinterJob printerJob = PrinterJob.getPrinterJob();
        /* Build a book containing pairs of page painters (Printables)
         * and PageFormats. This example has a single page containing
         * text.
         */
        Book book = new Book();
        book.append(new PrintText(), new PageFormat());
        /* Set the object to be printed (the Book) into the PrinterJob.
         * Doing this before bringing up the print dialog allows the
         * print dialog to correctly display the page range to be printed
         * and to dissallow any print settings not appropriate for the
         * pages to be printed.
         */
        printerJob.setPageable(book);
        /* Show the print dialog to the user. This is an optional step
         * and need not be done if the application wants to perform
         * 'quiet' printing. If the user cancels the print dialog then false
         * is returned. If true is returned we go ahead and print.
         */
        boolean doPrint = printerJob.printDialog();
        if (doPrint) {
            try {
                printerJob.print();
            } catch (PrinterException exception) {
                System.err.println("Printing error: " + exception);
            }
        }
    }

    /**
     * Print a page of text.
     */
    public int print(Graphics g, PageFormat format, int pageIndex) {
        /* We'll assume that Jav2D is available.
         */
        Graphics2D g2d = (Graphics2D) g;
        /* Move the origin from the corner of the Paper to the corner
         * of the imageable area.
         */
        g2d.translate(format.getImageableX(), format.getImageableY());
        /* Set the text color.
         */
        g2d.setPaint(Color.black);
        /* Use a LineBreakMeasurer instance to break our text into
         * lines that fit the imageable area of the page.
         */
        Point2D.Float pen = new Point2D.Float();
        AttributedCharacterIterator charIterator = mStyledText.getIterator();
        LineBreakMeasurer measurer = new LineBreakMeasurer(charIterator, g2d.getFontRenderContext());
        float wrappingWidth = (float) format.getImageableWidth();
        while (measurer.getPosition() < charIterator.getEndIndex()) {
            TextLayout layout = measurer.nextLayout(wrappingWidth);
            pen.y += layout.getAscent();
            float dx = layout.isLeftToRight()? 0 : (wrappingWidth - layout.getAdvance());
            layout.draw(g2d, pen.x + dx, pen.y);
            pen.y += layout.getDescent() + layout.getLeading();
        }
        return Printable.PAGE_EXISTS;
    }
}
4

3 に答える 3

2

ループが終了すると、この場合は変数mTextの内容が削除されることを理解していますか?

テキストファイルから複数の行を読み取っている場合、以前のすべての書き込みは次の書き込みによって上書きされます。したがって、変数mTextには最後に読み取られた行のみが含まれます。

ループの終了後にすべての行の読み取りにアクセスできるようにする場合は、それらの行をいくつかのコレクションに保存できます。

理想的にはList<String>、この状況でを作成し、そこにデータを保存できます。-

List<String> list = new ArrayList<String>();
while((mText = br.readLine()) != null) { 
        //Displays the contents of the file in terminal
        System.out.println(mText);
        list.add(mText); 
} 

これで、whileループの外で、リストからデータにアクセスできます。

于 2012-12-22T21:00:37.207 に答える
0

いいえ。変数はメソッドのスコープで定義されているため、その値は、宣言されて値が指定された後、メソッド内のどこでも使用できます。

ただし、readline()がIOExceptionをスローする可能性があるため、コードに値が割り当てられていない可能性があります。そのため、このループの後で変数を使用できなくなります。「割り当てられていない可能性のある変数」が発生します。コンパイルエラー。この問題を修正するには、宣言するときに変数を初期化します。

String mText = null;
于 2012-12-22T20:59:26.933 に答える
0

すべての行を保持する場合は、次のように保存する必要があります。

    StringBuilder sb= new StringBuilder();
    String mText;
    while ((mText = br.readLine()) != null) {
        //Displays the contents of the file in terminal
        System.out.println(mText);
        sb.append(mText).append('\n');
    }
    // now the whole content of the BufferedReader is stored in sb.
于 2012-12-22T21:05:15.343 に答える