0

問題: ユーザーの操作に基づいてキャンバスを新しいペイント オブジェクトで更新しようとしています。キャンバスは更新されません。

私がやったこと:ユーザーはDnDアクションと対話し、転送可能なオブジェクトがキャンバスに到達し、私が作成したグラフィックスの更新メソッドを呼び出します。そして、このメソッドは、既に作成されたグラフィックス 2D オブジェクトを使用し、それを使用して画像を描画するだけです。DnD アクションを確認しました。オブジェクトはキャンバス クラスで適切に受信され、System.out.println を使用してそれらを印刷できました。

私のものと同様の機能を持つサンプルコード、

塗装クラス:

    import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JPanel;


public class PaintPanel extends JPanel{

    private Graphics2D drawImage;

    public PaintPanel()
    {

    }

    @Override
    public void paint(Graphics g) {
         drawImage = (Graphics2D) g;
         drawImage.setColor(Color.WHITE);
         drawImage.fillRect(0, 0, getWidth(), getHeight());
    }

    public void updateGraphics(int length,int width)
    {
        drawImage.setColor(Color.black);
        drawImage.drawRect(100, 150, length, width);
        repaint();
    }

}

メインフレーム クラス:

       import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;


public class MainPaint extends JFrame{


    public MainPaint()
    {
        setTitle("test paint");
        setSize(400,400);
        setLayout(new BorderLayout());

        final PaintPanel paintPan = new PaintPanel();
        JButton testButon = new JButton("Display shape");
        add(paintPan,BorderLayout.CENTER);
        add(testButon,BorderLayout.PAGE_END);

        testButon.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                paintPan.updateGraphics(50,50);
                repaint();
            }
        });
        setVisible(true);
    }

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

}
4

2 に答える 2

9
Graphics2D drawImage;  //source of the problem!

Graphics(またはGraphics2D) インスタンスをキャッシュしようとしないでください! その代わり:

  1. 新しいオブジェクトをリストに追加します
  2. コールしrepaint()ます。
  3. paintComponent(Graphics)オブジェクトのリストを描画します。

これに代わる方法はBufferedImage、描画オブジェクトとして a を使用することです。例については、この回答を参照してください 。


更新 - 最新のコードに基づく SSCCE。

ボタンを押した後のメインペイント

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class MainPaint extends JFrame {

    public MainPaint() {
        setTitle("test paint");
        setSize(400, 400);
        setLayout(new BorderLayout());

        final PaintPanel paintPan = new PaintPanel();
        JButton testButon = new JButton("Display shape");
        add(paintPan, BorderLayout.CENTER);
        add(testButon, BorderLayout.PAGE_END);

        testButon.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                paintPan.updateGraphics(50, 50);
                repaint();
            }
        });
        setVisible(true);
    }

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

class PaintPanel extends JPanel {

    private int x, y;
    private Color color = null;

    public PaintPanel() {
        setBackground(Color.ORANGE);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D drawImage = (Graphics2D) g;
        if (color != null) {
            drawImage.setColor(color);
            drawImage.drawRect(100, 150, x, y);
        }
    }

    public void updateGraphics(int length, int width) {
        color = Color.RED;
        x = length;
        y = width;
        repaint();
    }
}

ノート

そのコードについては、変更が必要なことがまだたくさんあります。ボタンのクリック時に四角形を表示するように機能する最も初期のバリアントで停止することにしました。

于 2012-12-26T11:17:27.273 に答える
0

メソッドを呼び出す必要があると思いますvalidate()

于 2012-12-26T11:10:46.397 に答える