2012-12-22 8 views
0

안녕하세요 모든 코드를 작성했습니다. 사용자가 파일, txt 파일을 선택할 수있게 한 다음 파일의 내용을 읽고이 내용을 프린터로 보냅니다. hp 8600, compling에서 오류가 발생합니다. - 변수 mText를 찾을 수 없습니다. 왜 txt 파일의 모든 데이터가 포함되어야하는지에 대해 위와 같이 mText를 retriving해야합니다. 왜 내가 잘못 했습니까?기호 - 변수 mText를 찾을 수 없습니다.

코드 : 현재 mText에만 main 방법의 범위 내에서 정의된다

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

변수에는 * scope *이 (가) 있습니다. 'mText'는 당신의 코드가'main' 안에서만 유효합니다. http://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html –

+1

일반적으로 오류를 처리 할 때는 일반적으로 * 전체 * 메시지를 읽고 게시해야합니다. 오류 메시지에는 대개 행 번호 및 기타 컨텍스트와 같은 항목이있어 사용자 (또는 다른 사용자)가 문제를 찾는 위치를 즉시 알 수 있습니다. –

답변

2

. 그러나 — 이유에 AttributedString를 만들 수 없습니다, 비 finalstatic 클래스 변수를 갖는

private static String mText; 

나쁜 연습 간주됩니다 당신은 static 클래스 변수는 mStyledText의 생성자에서 사용하고자하는 것입니다 mText을해야합니다 그 필요 단지 print 방법 :

AttributedString mStyledText = new AttributedString(mText); 

은 또한 당신은 main 방법에 많은 기능을 가지고있다. 나는 클래스 인스턴스으로 이동하여 static 변수를 모두 사용하는 것을 피할 수 있습니다.

+0

고마워요.이 모든 것에 매우 새로운 메신저를 말할 수 있습니다. :) – user1924104

+0

어떻게하면 그걸 AttributedString으로 만들 수 있습니까? – user1924104

+0

클래스 변수가 될 필요가없는'print' 메소드에서 사용하기 전에'AttributedString'을 생성 할 수 있습니다. – Reimeus

관련 문제