3

私の目標は、バッファリングされたイメージを別のイメージに描画することです。次に、これらすべてのものが他のバッファリングされたイメージなどに描画されます。そして最後にこれをパネルの上に描きます。今のところ、バッファリングされたイメージをパネルに描画しようとしていますが、何も機能しません。私のバッファリングされた画像は完全に白く見えます:

public class Main2 {
    public static void main(String[] args) {
        JFrame frame = new JFrame("asdf");
        final JPanel panel = (JPanel) frame.getContentPane();
        frame.setSize(500,500);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        panel.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                somepaint(panel);
            }
        });
    }

    private static void somepaint(JPanel panel) {
        BufferedImage image = new BufferedImage(200,200,BufferedImage.TYPE_INT_ARGB);
        image.getGraphics().setColor(Color.red);
        image.getGraphics().fillRect(0, 0, 200, 200);

        Graphics2D graphics = (Graphics2D) panel.getGraphics();
        graphics.setColor(Color.magenta);
        graphics.fillRect(0, 0, 500, 500);
        graphics.drawImage(image, null, 0, 0); // draws white square instead of red one
    }
}

ありがとう

4

2 に答える 2

6

Re:

private static void somepaint(JPanel panel) {
    BufferedImage image = new BufferedImage(200,200,BufferedImage.TYPE_INT_ARGB);
    image.getGraphics().setColor(Color.red);
    image.getGraphics().fillRect(0, 0, 200, 200);

    Graphics2D graphics = (Graphics2D) panel.getGraphics();

これは、JPanel または JComponent 内で描画する方法ではありません。

コンポーネントを呼び出さないgetGraphics()でください。返された Graphics オブジェクトは存続期間が短く、それで描画されたものは保持されません。paintComponent(Graphics G)代わりに、メソッドのオーバーライド内で JPanel の描画を行います。をオーバーライドするには、JPanel を拡張するクラスを作成する必要がありますpaintComponent(...)

最も重要なのは、Swing グラフィックスを正しく実行する方法を理解するために、推測しないことです。最初にSwing Graphics Tutorialsを読むことをお勧めします。間違った仮定を投げ捨てる必要があるからです (正しく理解するために、これを行う必要があったことはわかっています)。

于 2012-06-09T13:16:19.800 に答える
3

呼び出しでパラメーターを修正する必要がありますdrawImage()。これを変える:

graphics.drawImage(image, null, 0, 0); 

graphics.drawImage(image, 0, 0,null);

詳細については、 Java ドキュメントを確認してください。

于 2012-06-09T13:15:29.783 に答える