2012-03-26 67 views
1

我剛開始學習使用Java Swing進行打印,所以如果這個問題很幼稚,請耐心等待。打印一些JPanels

我有一個相當複雜的佈局,多個JPanel包含其他包含JLabel的JPanel。我想以某種方式在打印機上很好地打印。

我知道我可以在代表打印頁面的Graphics2D對象上「繪畫」,但這需要我單獨定位每個對象。我希望能夠使用Swing佈局管理器來佈局我的頁面上的項目。一種方法是調用jp.paint(g2d),其中jp是JPanel,g2d是表示打印頁面的Graphics2D對象。但是,據我所見,這隻會打印出屏幕上實際可見的JPanel。如果JPanel不可見,則不會打印。

那麼是否有任何方法來佈局一個(相當複雜的)JPanel並將其發送到打印機,而不必先在計算機屏幕上顯示JPanel?

還是我在一個完全錯誤的軌道在這裏?

+1

這將幫助你 - > http://docs.oracle.com/javase/tutorial/2d/printing/gui.html – Java42 2012-03-26 15:38:16

+0

不,據我所知,這是談論打印一個可見的對象。我想打印一個看不見的物體。 – oz1cz 2012-03-28 18:40:24

+0

構建要打印的面板時,請執行pack(),但不要設置可見(true),並且面板將打印而不顯示在屏幕上。試一試。 – Java42 2012-03-28 19:39:38

回答

1

剝離了如何在不可見的情況下打印JPanel的示例。

public class TestPrinterSmall { 
static class JPanelPrintable extends JPanel implements Printable { 
    public int print(Graphics g, PageFormat pf, int page) throws PrinterException { 
     if (page > 0) return Printable.NO_SUCH_PAGE; 
     printAll(g); 
     return Printable.PAGE_EXISTS; 
    } 
}; 
private static void printIt(Printable p) throws PrinterException { 
    PrinterJob job = PrinterJob.getPrinterJob(); 
    job.setPrintable(p); 
    if (job.printDialog()) job.print(); 
}  
public static void main(String args[]) throws PrinterException { 
    final JFrame f = new JFrame(); 
    f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    f.setSize(400,400); 
    final JPanelPrintable j = new JPanelPrintable(); 
    j.setLayout(new BorderLayout()); 
    j.add(new JButton("1111"),BorderLayout.NORTH); 
    j.add(new JButton("2222"),BorderLayout.SOUTH);    
    f.add(j);f.repaint();f.pack(); 
    //f.setVisible(true); 
    printIt(j); 
} 
} 

輸出:

(nothing) 

打印機:

enter image description here

+0

這很完美,查克。我仍然不明白爲什麼我的代碼不起作用,但現在至少我有一些可以使用的東西。非常感謝你。 – oz1cz 2012-03-29 09:48:55