2

図形を描画し、それらの図形を選択できる JPanel があります。Graphics2D オブジェクトと組み合わせて、AffineTransform オブジェクトを使用して、このビューを変換する機能を追加し始めています。

私の 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 にあるものとは異なるのではないかと考えていますが、それについてはわかりません。ここで何が起こっているのか誰にも分かりませんか?

4

2 に答える 2

4

はい、同じ Graphics オブジェクトが返されるとは限りません。paintComponent()実際、 Swing UI モデルが壊れるため、メソッドの外で Graphics オブジェクトを操作しないでください。これを行うと、アーティファクトや不完全な描画が発生する可能性があります。正しいアプローチは、UI/ウィジェットの状態を格納するいくつかのインスタンス変数を持つことです。mousePressed()が呼び出されたら、それらの変数を更新して を呼び出すだけですrepaint()。次に、paintComponent()メソッドで適切な変換を適用し、UI を描画します。

于 2012-12-04T22:21:25.653 に答える
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();
    }
}
于 2015-01-06T13:31:38.713 に答える