2012-12-22 62 views
0

嘿,我一直在寫一些代碼,它允許用戶選擇一個文件,一個txt文件,然後它讀取文件的內容,然後將內容發送到打印機這種情況下惠普8600,但在編譯我得到一個錯誤,無法找到符號 - 變量mText,爲什麼是這樣的,它應該從上面回顧mText,因爲這現在應該包含來自txt文件的所有數據,我做錯了什麼?找不到符號 - 變量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 { 


    // 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 

     private static final 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; 
    } 
} 
+6

因爲變量有*範圍*。 'mText'是你的代碼只在'main'裏面有效。 http://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html –

+1

作爲處理錯誤的一般規則,您通常應該閱讀併發布* whole *消息。錯誤消息通常包含行號和其他上下文,這些信息可以幫助您(或其他人)立即知道在哪裏查找問題。 –

回答

2

目前mText僅在main方法的範圍內限定。 你需要做一個mTextstatic變量是你希望在mStyledText構造函數中使用它:

private static String mText; 

有非finalstatic類變量被認爲是不好的做法,但—爲什麼不能在創建AttributedStringprint方法其需要的只是當:

AttributedString mStyledText = new AttributedString(mText); 

你也需要在main方法很多功能。我會將它移動到實例方法中,您可以完全避免使用任何static變量。

+0

謝謝,因爲你可以告訴即時通訊非常新的:) – user1924104

+0

我如何使它成爲一個AttributedString? – user1924104

+0

在你需要在'print'方法中使用'AttributedString'之前,你可以創建'AttributedString',不需要成爲類變量。 – Reimeus