Java - Графика - Графический объект, переданный в paint (), отличается от объекта Graphics в экземпляре JPanel

У меня есть JPanel, который рисует формы и позволяет выбирать эти формы. Я начинаю добавлять возможность преобразования этого представления с помощью объекта AffineTransform в сочетании с объектом Graphics2D.

В моем методе paint (), конечно, передается объект Graphics. Я устанавливаю новое преобразование для этого объекта (в данном случае просто масштабирую объекты на 2), и все в методе paint () отрисовывается правильно в соответствии с AffineTransform Я только что установил. На данный момент часть рисования фигур отлично работает! Теперь перейдем к выбору формы ...

Выбор формы начинается в событии mousePressed () (My JPanel реализует интерфейс MouseListener). Когда у меня есть событие mousePressed (), я вызываю this.getGraphics (), чтобы получить объект Graphics JPanel. Затем я прикрепляю его к объекту Graphics2D и вызываю для него getTransform (), чтобы получить текущее преобразование, чтобы я мог сопоставить выбранную точку с преобразованной точкой. Однако, когда я вызываю getTransform (), AffineTransform возвращается к AffineTransform по умолчанию [1, 0, 0], [0, 1, 0].

Я думаю, что, возможно, объект Graphics, переданный в Paint () JPanel, отличается от того, который есть у меня в JPanel, но я не уверен в этом. Кто-нибудь знает, что здесь происходит?


person dsw88    schedule 04.12.2012    source источник


Ответы (2)


Да, вы не можете быть уверены, что получите обратно тот же объект Graphics. Фактически, вы не должны работать с объектом Graphics вне метода paintComponent(), поскольку это нарушает модель пользовательского интерфейса Swing. Если вы это сделаете, вы, вероятно, получите артефакты и / или неполный рисунок. Правильный подход - иметь несколько переменных экземпляра, которые хранят состояние вашего пользовательского интерфейса / виджета. Когда вызывается mousePressed(), вы просто обновляете эти переменные и вызываете repaint(). Затем в вашем paintComponent() методе примените соответствующие преобразования и нарисуйте свой пользовательский интерфейс.

person pents90    schedule 04.12.2012
comment
+1, кроме paintComponent(), а не paint() - person JB Nizet; 05.12.2012

Простой класс: печать объекта ИЛИ панели инструментов.

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();
    }
}
person Pankaj Bansal    schedule 06.01.2015