Java - Graphics - 传递给paint()的Graphics对象与JPanel实例中的Graphics对象不同

时间:2012-12-04 22:00:37

标签: java swing jpanel graphics2d affinetransform

我有一个绘制形状的JPanel,并允许选择这些形状。我开始使用AffineTransform对象和Graphics2D对象添加转换此视图的功能。

在我的paint()方法中,当然传入了一个Graphics对象。我在该对象上设置了一个新的变换(在这种情况下,只是按2缩放),paint()方法中的所有内容都正确地绘制到我刚刚设置的AffineTransform。此时绘图形状部分效果很好!现在进行形状选择...

在mousePressed()事件中开始选择形状(My JPanel实现MouseListener接口)。当我有一个mousePressed()事件时,我调用this.getGraphics()来获取JPanel的Graphics对象。然后我把它放到Graphics2D对象上并在其上调用getTransform()来获取我当前的变换,这样我就可以将点击的点映射到变换点。但是,当我调用getTransform()时,AffineTransform将恢复为[1,0,0],[0,1,0]的默认AffineTransform。

我在想,传递给JPanel的paint()的Graphics对象可能与我在JPanel中的那个不同,但我不确定。有谁知道这里发生了什么?

2 个答案:

答案 0 :(得分:4)

是的,您无法确定是否会获得相同的Graphics对象。实际上,您不应该使用paintComponent()方法之外的Graphics对象,因为这会破坏Swing UI模型。如果你这样做,你可能会得到文物和/或不完整的绘图。正确的方法是使用一些实例变量来存储UI /小部件的状态。调用mousePressed()时,您只需更新这些变量并调用repaint()。然后在paintComponent()方法中,应用相应的变换并绘制UI。

答案 1 :(得分:0)

简单类打印对象或JPanel。

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.Chromaticity;
import javax.print.attribute.standard.DialogTypeSelection;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class TemplateDemo extends JFrame implements Printable, ActionListener {

    JButton btn;
    JTextField name_txt;
    JPanel panel;

    public TemplateDemo() {

        panel = new JPanel(null);
        panel.setBounds(0, 0, 300, 300);
        add(panel);
        name_txt = new JTextField();
        name_txt.setBounds(0, 10, 200, 20);
        panel.add(name_txt);
        btn = new JButton("Click");
        btn.setBounds(0, 240, 200, 30);
        btn.addActionListener(this);
        panel.add(btn);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(0, 0, 400, 400);
        setLayout(null);
        setVisible(true);
    }

    @Override
    public int print(Graphics g, PageFormat pageFormat, int pageIndex) {
        Graphics2D graphics = (Graphics2D) g;
        if (pageIndex == 0) {
            g.translate((int) pageFormat.getImageableX(), (int) pageFormat.getImageableY());
            panel.print(g);
            return PAGE_EXISTS;
        }
        return NO_SUCH_PAGE;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        PrinterJob pj = PrinterJob.getPrinterJob();
        pj.setPrintable(this);
        PrintRequestAttributeSet set = new HashPrintRequestAttributeSet();
        set.add(Chromaticity.COLOR);
        set.add(DialogTypeSelection.COMMON);

        if (pj.printDialog(set)) {
            try {
                pj.print(set);
            } catch (PrinterException ex) {
            }
        }
    }

    public static void main(String[] args) {
        new TemplateDemo();
    }
}