LINUX.ORG.RU

Java Swing print JPanel


0

0

Привет, может кто подскажет, как распечатать содержимое панели(JPanel), на панели я рисую график функции, и надо распечатать, предварительно растянув на весь лист. Решение в лоб - взять да растянуть панель - криво. Должно быть что - то простое. Буду благодарен за любой совет.


Сохрани сначала в файл, а потом сторонними средствами распечатай

Примерно, где-то так:

JPanel panel = new JPanel();
BufferedImage bi = new BufferedImage(panel.getWidth(),panel.getHeight(),BufferedImage.TYPE_INT_RGB);
panel.paint((Graphics2D)bi.getGraphics());

ImageIO.write(bi, "PNG", new File("/home/user/test.png"));

lvv
()
Ответ на: комментарий от lvv

Я вот как написал, может есть вариант проще сделать?
package test;
import javax.swing.*;
import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.awt.geom.AffineTransform;
import java.awt.geom.Point2D;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.print.*;

public class MyFrame extends JFrame {
public static final double MM_TO_PAPER_UNITS = 1/25.4*72;
public static double widthA4 = 210*MM_TO_PAPER_UNITS;
public static double heightA4 = 297*MM_TO_PAPER_UNITS;
public static double leftMargin = 4.0*MM_TO_PAPER_UNITS;
public static double topMargin = 4.0*MM_TO_PAPER_UNITS;

JButton button;
MyPanel panel;
GridBagConstraints gridBagConstraints;

public void init(){
panel = new MyPanel();
button = new JButton("Print");
getContentPane().setLayout(new GridBagLayout());
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
gridBagConstraints = new GridBagConstraints();
gridBagConstraints.fill = GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;

add(panel, gridBagConstraints);
gridBagConstraints = new GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
add(button, gridBagConstraints);
setSize(500,500);
button.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e) {
PrinterJob printJob = PrinterJob.getPrinterJob();
PageFormat pf = printJob.defaultPage();
pf.setOrientation(PageFormat.LANDSCAPE);
Paper paper = pf.getPaper();
paper.setSize(widthA4, heightA4);
paper.setImageableArea(leftMargin,topMargin,widthA4-2*leftMargin,heightA4-2*top Margin);
pf.setPaper(paper);
printJob.setCopies(1);
Book book = new Book();
book.append(panel,pf,1);
printJob.setPageable(book);
if (printJob.printDialog()) {
try {

printJob.print();
}
catch (Exception PrinterExeption) {
PrinterExeption.printStackTrace();
}
}
}
});
setVisible(true);
}

public static void main(String[] args){
MyFrame myFrame = new MyFrame();
myFrame.init();
}

class MyPanel extends JPanel implements Printable {
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
paingMyGrafik(g2);
paintLabel(g2,"My Grafik on JPanel",this.getWidth()/2,this.getHeight()-20);
}

public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) {
Graphics2D g2 = (Graphics2D)graphics;
//affine transformation for grip of the panel`s content to the size A4
double W = pageFormat.getImageableWidth();
double H = pageFormat.getImageableHeight();
double minX = pageFormat.getImageableX();
double minY = pageFormat.getImageableY();
g2.transform(new AffineTransform((W)/this.getWidth(),0,0,(H)/this.getHeight(),minX,minY));
paingMyGrafik(g2);
paintLabel(g2,"My Grafik on paper",this.getWidth()/2,this.getHeight()-20);
return 0;
}
private void paintLabel(Graphics2D graphics,String label, int x, int y){
//because mirror reflection change also text
Color oldColor = graphics.getColor();
graphics.setColor(Color.black);
Font oldFont = graphics.getFont();
Font labelFont = new Font("Courier", Font.BOLD + Font.ITALIC, 15);
graphics.setFont(labelFont);
Point2D ptSrc = new Point2D.Double(x-graphics.getFontMetrics().stringWidth(label)/2,y);
Point2D ptDst = new Point2D.Double();
toUsualyCoordinate().transform(ptSrc, ptDst);
graphics.drawString(label,(int)ptDst.getX(),(int)ptDst.getY());
graphics.setFont(oldFont);
graphics.setColor(oldColor);
}
private void paingMyGrafik(Graphics2D g2){
//here paint i my grafik
AffineTransform old = g2.getTransform();
g2.transform(toUsualyCoordinate());
Rectangle2D rect = new Rectangle2D.Double();
rect.setRect(2,2,this.getWidth()-4,this.getHeight()-4);
g2.draw(rect);
g2.setColor(Color.red);
g2.drawLine(5, 10 , this.getWidth()-10, 10);
g2.drawLine(10,5, 10, this.getHeight()-10);
g2.drawLine(0,0, min(this.getWidth(),this.getHeight())-10, min(this.getWidth(),this.getHeight())-10);
g2.setTransform(old);

}
private AffineTransform toUsualyCoordinate(){
AffineTransform at = new AffineTransform();
//mirror reflection relative to ox
at.concatenate(new AffineTransform(1,0,0,-1,0,0));
//parallel shift (x,y) -> (x, y-h)
at.concatenate(AffineTransform.getTranslateInstance(0,-this.getHeight()));
return at;
}
private int min(int a, int b){
return (a<b) ? a :b;
}
}
}

sint
() автор топика
Ответ на: комментарий от sint

>Я вот как написал, может есть вариант проще сделать?

Ну проще я написал,
а тут ты обошёлся средствами только Java

lvv
()
Ответ на: комментарий от lvv

Я вот думаю, может есть какая библиотека бесплатная, которая позволяет печатать, устанавливая только какую-нибудь переменную FILL=BOTH? Должно что-то быть...

sint
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.