1

マウスで描いた線を認識して音楽を作るアプリを作っています。私はjava2dを初めて使用するので、ここに私が抱えている問題があります。

  • 描画してから別の描画を作成すると、前の描画の最後のポイントが新しい描画の最初のポイントに接続されます。私はこれを修正する方法を理解することができませんでした。以下はコードです。

  • もう1つの質問は、描画の各ストローク(mousePressedからmouseReleasedまで)をShapeタイプのArrayListに格納したいのですが、どうすればそれに入ることができますか?

オンラインで役立つ情報を見つけることができなかったので、正しい方向に向けてもらいたいと思います。ありがとう!

public class DrawBoard extends JPanel implements MouseListener,
        MouseMotionListener {

    public JLabel status;
    public Point pstart, pfinish;
    private Shape currentShape = null;
    private ArrayList<Point> points = new ArrayList<Point>();
    private ArrayList<Shape> lines = new ArrayList<Shape>();

    public DrawBoard() {

        Dimension size = getPreferredSize();
        size.setSize(1024, 800); // w, h
        setPreferredSize(size);
        setOpaque(false);
        status = new JLabel("default");
        add(status, BorderLayout.SOUTH);

        addMouseListener(this);
        addMouseMotionListener(this);

    }

    @Override
    public void mouseClicked(MouseEvent e) {
        status.setText(String.format("Clicked at %d,%d", e.getX(), e.getY()));
    }

    // Where the drawing happens
    @Override
    public void mousePressed(MouseEvent e) {
        status.setText("you pressed down the mouse");
        this.pstart = e.getPoint();

    }

    @Override
    public void mouseDragged(MouseEvent e) {
        status.setText("you draged the mouse");
        points.add(e.getPoint());
        repaint();
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        status.setText("you release the mouse click");
        pfinish = e.getPoint();
    }

    // End of where the drawing happens

    @Override
    public void mouseEntered(MouseEvent e) {
        status.setText("you entered the area");
    }

    @Override
    public void mouseExited(MouseEvent e) {
        status.setText("mouse exited the area");
    }

    @Override
    public void mouseMoved(MouseEvent e) {
        // throw new UnsupportedOperationException("Not supported yet.");
    }

    public void paint(Graphics g) {
        super.paint(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setColor(Color.BLACK);
        g2.setStroke(new BasicStroke(5));

        for (int i = 0; i < points.size() - 2; i++) {

            Point p1 = points.get(i);
            Point p2 = points.get(i + 1);

            g2.drawLine(p1.x, p1.y, p2.x, p2.y);
        }

    }
}

BufferedImageを使用して変更しましたが、通常の描画で機能します。現在、機能しないのはclearメソッドだけです。さまざまな方法を試しましたが、どれも機能しませんでした。私の新しいコードは以下のとおりです。

  public class DrawBoard extends JPanel implements MouseListener, MouseMotionListener{


public JLabel status;
private JLabel imgLabel;
public Point pstart, pfinish;
private Shape currentShape = null;
private List<Point> points = new ArrayList<Point>();
private List<BufferedImage> lines = new ArrayList<BufferedImage>();

private static final int BI_WIDTH = 1024;
private static final int BI_HEIGHT = 800;

private BufferedImage bImage = new BufferedImage(BI_WIDTH, BI_HEIGHT,
        BufferedImage.TYPE_INT_ARGB);

public DrawBoard(){  

   Graphics2D g2d = bImage.createGraphics();
   g2d.dispose();

    Dimension size = getPreferredSize();
    size.setSize(1024,800); //w, h
    setPreferredSize(size);
    status =  new JLabel("default");
    add(status, BorderLayout.SOUTH);
    addMouseListener(this);
    addMouseMotionListener(this);  


     imgLabel = new JLabel(new ImageIcon(bImage)) {
     @Override
     protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        paintInLabel(g);
     }
  };
     imgLabel.setOpaque(false);
     setOpaque(false);
      add(imgLabel, BorderLayout.CENTER);

}

private void paintInLabel(Graphics g) {
  Graphics2D g2d = (Graphics2D) g;
  g2d.setColor(Color.BLUE); // this colour is when mouse is pressed
  g2d.setStroke(new BasicStroke(5));
  if (points.size() < 2) {
     return;
  }
  for (int i = 1; i < points.size(); i++) {
     int x1 = points.get(i - 1).x;
     int y1 = points.get(i - 1).y;
     int x2 = points.get(i).x;
     int y2 = points.get(i).y;
     g2d.drawLine(x1, y1, x2, y2);
  }
 }



@Override
public void mouseClicked(MouseEvent e) {
    status.setText(String.format("Clicked at %d,%d", e.getX(), e.getY()));
}


// Where the drawing happens
@Override
public void mousePressed(MouseEvent e) {
    status.setText("you pressed down the mouse");
    this.pstart = e.getPoint();
    points.add(e.getPoint());

}

@Override
public void mouseDragged(MouseEvent e) {
  status.setText("you draged the mouse");
  points.add(e.getPoint());
  imgLabel.repaint();
}

@Override
public void mouseReleased(MouseEvent e) {
    status.setText("you release the mouse click");
    Graphics2D g2d = bImage.createGraphics();
    g2d.setColor(Color.blue); // this is the final colour
    g2d.setStroke(new BasicStroke(5));

     if (points.size() >= 2) {
        for (int i = 1; i < points.size(); i++) {
           int x1 = points.get(i - 1).x;
           int y1 = points.get(i - 1).y;
           int x2 = points.get(i).x;
           int y2 = points.get(i).y;
           g2d.drawLine(x1, y1, x2, y2);
        }
     }
     g2d.dispose();

     points.clear();
     imgLabel.repaint();

}
// End of where the drawing happens

@Override
public void mouseEntered(MouseEvent e) {
   status.setText("you entered the area");
}


@Override
public void mouseExited(MouseEvent e) {
   status.setText("mouse exited the area");
}

@Override
public void mouseMoved(MouseEvent e) {
    //throw new UnsupportedOperationException("Not supported yet.");
}

public void clearDrawBoard() {

    imgLabel.setIcon(null);
}

 }
4

1 に答える 1

3

いくつかの解決策と提案:

  • List<Point>ある線がどこで終わり、別の線がどこから始まるかを知る方法がないので、単一から描画しないでください。
  • 完了したら各線をBufferedImageに描画し、そのBufferedImageをJComponentのpaintComponentメソッドに表示することを検討してください。メソッドのBufferedImageに配置しmouseReleased(...)ます。
  • またはList<List<Point>>、必要に応じて各行を繰り返すことができるように、を作成することを検討してください。List<Point>メソッドの元のリストに新しいものを追加しmouseReleased(...)ます。
  • List<Shape>を使用して、描画可能なLine2Dオブジェクトで埋めることを検討してください。Line2Dはメソッドのに追加されList<Shape>ますmouseReleased(...)
  • また、オーバーライドするpaint(...)のではなく、 `paintComponent(...)をオーバーライドする必要があります。
  • また、より安全なコーディングのために@Overrideアノテーションを忘れないでください。

たとえば、私のコードを見て、ここで答えてください。

于 2013-02-24T16:30:03.503 に答える