2

3つのJPanelを含むJFrameがあります。オプション、メニュー、キャンバス。オプションには、形状を表す多数のJButtonがあります。目的は、長方形などの図形のJButtonをクリックしてから、キャンバス上の任意の場所をクリックすると、図形がそこに描画されることです。何らかの理由で、シェイプが常に描画されるとは限りません。キャンバスの左上の領域のどこかをクリックしたときにのみ描画されます。また、クリックした場所によって形がランダムに変化しているようです。

これが私のコードスニペットの一部です。おそらく小さなエラーですが、見つからないようです。

形:

public class Shape extends JPanel {

    protected int xLocation;
    protected int yLocation;
    protected int numberOfSides; 
    protected String areaInfo; 
    protected String perimeterInfo; 

    public int getXLocation() {
        return xLocation;
    }

    public void setXLocation(int xLocation) {
        this.xLocation = xLocation;
    }

    public int getYLocation() {
        return yLocation;
    }

    public void setYLocation(int yLocation) {
        this.yLocation = yLocation;
    }

    public int getNumberOfSides() {
        return numberOfSides;
    }

    public Shape(int xLocation, int yLocation, int numberOfSides) {
        this.xLocation = xLocation;
        this.yLocation = yLocation;
        this.numberOfSides = numberOfSides;
    }
}

矩形:

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


public class Rectangle extends Shape {

    private int width;
    private int height;

    public int getWidth() {
        return width;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public Rectangle(int xLocation, int yLocation, int width, int height ) {
        super(xLocation, yLocation, 4);
        this.width = width;
        this.height = height;
        this.areaInfo = "Multiply width * height";
        this.perimeterInfo = "Add the lengths of each side";
    }

    public void paint(Graphics g){
        g.setColor(Color.BLACK);        
        g.fillRect(xLocation, yLocation, width, height);
    }
}

キャンバス:

public class DrawingCanvas extends JPanel implements Serializable{

    private ArrayList<Shape> shapeList;
    OptionsPanel options;

    public void addShape(Shape shape){
        shapeList.add(shape);
        this.add(shape);
        this.repaint();
    }

    public DrawingCanvas(){
        shapeList = new ArrayList<Shape>();
    }

}

フレーム:

public class DrawingFrame extends JFrame implements MouseListener, MouseMotionListener {

    private OptionsPanel options;
    private DrawingCanvas canvas;
    private MenuBar menu;
    Shape s; //shape to be manipulated

    public DrawingFrame(){
        options = new OptionsPanel();
        canvas = new DrawingCanvas();
        menu = new MenuBar();

        //options.setBounds(0, 0, 100, 500);
        options.setBackground(Color.GREEN);
        canvas.setBackground(Color.yellow);
        menu.setSize(1000,200);
        menu.setBackground(Color.magenta);

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(1000,500);
        this.setTitle("Drawing Application");

        this.setLayout(new BorderLayout());
        this.getContentPane().add(options, BorderLayout.WEST);
        this.getContentPane().add(canvas, BorderLayout.CENTER);
        this.getContentPane().add(menu, BorderLayout.PAGE_START);
        this.setVisible(true);

        options.createRectangleButton.addMouseListener(this);
        options.createSquareButton.addMouseListener(this);
        options.createCircleButton.addMouseListener(this);
        options.createTriangleButton.addMouseListener(this);
        options.clearButton.addMouseListener(this);
        canvas.addMouseListener(this);
        canvas.addMouseMotionListener(this);

    }




    @Override
    public void mouseClicked(MouseEvent e) {
        boolean createShape = true;

        if(e.getSource().equals(options.createRectangleButton)){
            createShape = true;
            s = new Rectangle(50,50,400,200);
            s.addMouseListener(this);
            s.addMouseMotionListener(this); 
        }

        if (e.getSource().equals(canvas) && createShape == true){
            s.setXLocation(e.getX());
            s.setYLocation(e.getY());
            createShape = false;
            canvas.addShape(s);
        }
4

3 に答える 3

2

提供したコードは完全ではありませんが、2番目を次のようなものに変更した場合、とにかく問題はmouseClickedメソッドにあります。if

    if (e.getSource().equals(canvas) && createShape == true){
        int x = e.getX();
        int y = e.getY();
        s = new Rectangle(x,y,x+50,y+50);
        canvas.addShape(s);
    }

次に、x、yの位置に応じて、キャンバスをクリックするたびに幅と高さ50の長方形がペイントされます(ユーザー入力に基づいて変数を使用して、固定の幅/高さを変更できます)。ifまた、キャンバスに追加されていない新しく作成されたシェイプにを追加する最初のセクションで何をしようとしているMouseListenerのかわかりません。他にやりたいことがあると思います...

于 2012-10-18T18:26:45.020 に答える
2

完全な例がなければ、なんとも言えません。で蓄積されたインスタンスをレンダリングするためDrawingCanvasにオーバーライドすることを期待しています。あなたのアプローチを、ここで引用されている に示されているアプローチと比較することができます。paintComponent()ShapeshapeListGaphPanel

画像

于 2012-10-18T17:49:41.213 に答える
0

キャンバスクラスのpaintメソッドを上書きする必要がありました。キャンバスクラスでsuper.paintを呼び出し、各シェイプを個別に再ペイントします

public void paint(Graphics g){
            super.paint(g);
            for(int i=0;i<shapeList.size();i++){
                ((Shape)shapeList.get(i)).paint(g);
            }
        }
于 2012-11-02T14:06:18.670 に答える