Добрый день. Может кто-нибудь встречался с такой проблемой. После применения аффинного преобразования AffineTransform изменяется размер пера BasicStroke. Я хочу построить график функции, посчитал параметры этого преобразования, а, как оказалось, размер пера тоже меняется, я, наверно, что-то делаю не так.
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 * topMargin);
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 {
final int leftPadding = 20;
final int rightPadding = 10;
final int topPadding = 10;
final int bottomPadding = 20;
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
paingMyGrafik(g2);
}
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);
return 0;
}
private void paingMyGrafik(Graphics2D g2) {
// here paint i my grafik
AffineTransform old = g2.getTransform();
g2.transform(toEndCoordinate());
BasicStroke stroke = new BasicStroke(0.2f, BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER);
g2.setStroke(stroke);
g2.drawLine(1899, 20, 1901, 20);
g2.drawLine(1901, 20, 1901, 25);
g2.drawLine(1901, 25, 1905, 26);
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 AffineTransform toEndCoordinate(){
AffineTransform at = new AffineTransform();
at.concatenate(toUsualyCoordinate());
at.concatenate((new AffineTransform((double)(this.getWidth()-leftPadding-rightPadding)/this.getWidt h(),0,0,(double)(this.getHeight()-topPadding-bottomPadding )/this.getHeight(),leftPadding,bottomPadding)));
at.concatenate(new AffineTransform(-this.getWidth()/(getMinX()-getMaxX()-2),0,0,this.getHeight()/( getMaxY()-getMinY()+10),this.getWidth()*(getMinX()-1)/(getMinX()-getMaxX()-2),- t his.getHeight()*(getMinY()-5)/(getMaxY()-getMinY()+10)));
return at;
}
private int min(int a, int b) {
return (a < b) ? a : b;
}
private double getMinX(){
return 1900;
}
private double getMaxX(){
return 2000;
}
private double getMinY(){
return 20;
}
private double getMaxY(){
return 30;
}
}
}
Ответ на:
комментарий
от anonymous
Ответ на:
комментарий
от sint
Ответ на:
комментарий
от sint
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум backgroundcolor (2012)
- Форум Декораторы в Java для listener'ов (2015)
- Форум Тестовое задание, где я ошибся? (2014)
- Форум LibGDX не рисует Actor-ов на Scene (2018)
- Форум Нужно добавить новые глубины цвета в кастомный X сервер (2019)
- Форум Перемещение Polygon. relocate (2016)
- Форум Graphics2D.drawString рендерит разные результаты на разных машинах (2016)
- Форум Почему такое использование выдает null pointer exception? (2020)
- Форум неработает обновление данных в таблице [java] (2012)
- Форум C++ уступает java (2006)