【问题标题】:Java - Graphics - Graphics object passed to paint() is different from Graphics object in JPanel instanceJava - 图形 - 传递给 paint() 的图形对象与 JPanel 实例中的图形对象不同
【发布时间】:2012-12-04 22:00:36
【问题描述】:

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

在我的 paint() 方法中,当然传入了一个 Graphics 对象。我在该对象上设置了一个新的变换(在这种情况下,只是将事物缩放 2),并且 paint() 方法中的所有内容都根据到我刚刚设置的 AffineTransform。在这一点上,绘图形状部分效果很好!现在开始选择形状...

形状选择在 mousePressed() 事件中开始(我的 JPanel 实现了 MouseListener 接口)。当我有一个 mousePressed() 事件时,我调用 this.getGraphics() 来获取 JPanel 的 Graphics 对象。然后我将它转换为 Graphics2D 对象并在其上调用 getTransform() 以获取我当前的变换,以便我可以将单击的点映射到变换的点。然而,当我调用 getTransform() 时,AffineTransform 又回到了 [1, 0, 0], [0, 1, 0] 的默认 AffineTransform。

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

【问题讨论】:

    标签: java swing jpanel graphics2d affinetransform


    【解决方案1】:

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

    【讨论】:

    • +1,除了 paintComponent() 应该被覆盖而不是 paint()
    【解决方案2】:

    简单类打印一个对象或 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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-26
      • 1970-01-01
      相关资源
      最近更新 更多