2016-08-09 200 views
0

我正嘗試創建一個應用程序,以列的形式打印數據。我的問題是,job.setPrintable運行多次......這意味着,該文件成爲完全以錯誤的...打印標籤Java,循環(?)

有誰對此的一些想法?

也許你有我怎樣才能使這個代碼更好一些其他的想法(?)...

謝謝你在先進

我有例如在我的ArrayList中10項指標..當我運行應用程序,它會在我的文檔創建20列...其中10是完全以空和做只是佔用空間...

private final int PAGE_WIDTH = Math.round(MediaSize.ISO.A4.getX(MediaSize.MM)); 
private final int PAGE_HEIGHT = Math.round(MediaSize.ISO.A4.getY(MediaSize.MM)/8); 
private PrinterJob job = PrinterJob.getPrinterJob(); 
private Graphics2D column; 
private Font font = new Font("Serif", Font.BOLD, 9); 

private int writeOnRow = 0; 
private int pageRow = 0; 
private int columnSpace = 4; 
private int itemsInRow = 3; 
private int itemCurrentRow = 0; 

public Printer(final ArrayList<Customers> resultAsList) { 
    resultAsList.remove(0); 

    job.setPrintable(new Printable() { 
     public int print(Graphics g, PageFormat pf, int pageIndex) throws PrinterException { 
      if (pageIndex > 0) { 
       return NO_SUCH_PAGE; 
      } 

      column = (Graphics2D)g; 
      column.translate(pf.getImageableX(), pf.getImageableY()); 

      column.setFont(font); 

      for (Customers c : resultAsList) { 
       String line = 
         c.getName() + "\n" + 
           c.getAddress() + "\n" + 
           c.getPostcode() + " " + c.getCity(); 

       //DATA, COLUMN, ROW 
       column.drawString(c.getName(), columnSpace, writeOnRow += column.getFontMetrics().getHeight() + 2); 
       column.drawString(c.getAddress(), columnSpace, writeOnRow += column.getFontMetrics().getHeight() + 2); 
       column.drawString(c.getPostcode() + " " + c.getCity(), columnSpace, writeOnRow += column.getFontMetrics().getHeight() + 2); 


       if (itemCurrentRow == itemsInRow) { 
        pageRow += PAGE_HEIGHT; 
        itemCurrentRow = 0; 
        columnSpace = 4; 
        itemCurrentRow++; 
       } else { 
        writeOnRow = pageRow; 
        columnSpace += PAGE_WIDTH; 
        itemCurrentRow++; 
       } 

       writeOnRow += pageRow; 
       laps++; 

      } 
      return PAGE_EXISTS; 
     } 
    }); 

    boolean doPrint = job.printDialog(); 

    if (doPrint) { 
     try { 
      job.print(); 
     } catch (PrinterException ex) { 
      System.out.println(ex); 
     } 
    } 
} 
+0

'//這裏沒有什麼可以看到的'實際上,如果你面對一個異常,你必須**看到它不會忽略它! – Frakcool

回答

2

您的代碼看起來並不CL EAN。遲早會很難維持 - 實際上它已經是了。

  • 這很酷,你已經使用了所有的整數值作爲字段,但如果你把它常數private static final領域會更好。
  • 避免創建多達3個參數的方法。這是一個標誌,它可以分爲更小的部分,如方法,類別等。
  • 避免使用幻數類似columnSpace = 4;。這是什麼4?考慮讓它成爲一個常量字段。
  • 你不要燕子像你這樣的例外。這沒有意義。您可以處理它們或聲明throws

看來您的循環可能無效。爲了讓你的代碼更漂亮,我建議你閱讀Clean Code。它會讓事情變得更加清晰。