2016-08-09 10 views
0

データを列に印刷するアプリケーションを作成しようとしています。私の問題は、これは、文書はば完全に間違っているなることを意味...ラベルを印刷するJava、ループ(?)

誰もがこのことについていくつかのアイデアを持っていますか?... job.setPrintableが複数回実行されることですか

たぶん、あなたは、私はこのコードを改善することができますどのように(?)の他のいくつかのアイデアを持っている...

は私が私の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?それをconstフィールドにすることを検討してください。
  • 飲み込んだのような例外はありませんでした。それは意味をなさない。どちらかを処理するか、throwsと宣言してください。

ループが無効である可能性があります。あなたのコードをより美しくするために、Clean Codeを読むことをお勧めします。物事をもっとはっきりさせるでしょう。

関連する問題