私はまだJavaの基礎を学んでいます。私がしようとしたのは、ポイントと行をArrayLists
に格納してから、paintComponent()
メソッドにそれらを通し、呼び出されるたびにそれらを描画させることです。私は自分のポイントに同じArrayList
を使用しているので、マウスを押すたびにクリアして、新しいラインは前のラインとつながりません。スイング:マウスドラッグで描く線は、マウスをドラッグしたときに表示されます。
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.BorderFactory;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;
import java.util.ArrayList;
public class SwingPaintDemo2 {
public static void main(String[] args) {
JFrame f = new JFrame("Swing Paint Demo");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(300,300);
f.add(new MyPanel());
f.setBackground(Color.WHITE);
f.setVisible(true);
}
}
class MyPanel extends JPanel {
private int x;
private int y;
private int x2;
private int y2;
private ArrayList<Point> points = new ArrayList<Point>();
private ArrayList<Curves> curvedLines = new ArrayList<Curves>();
public MyPanel() {
setBorder(BorderFactory.createLineBorder(Color.black));
addMouseMotionListener(new MouseAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
points.add(new Point(e.getX(), e.getY()));
repaint();
}
});
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
points.clear();
points.add(new Point(e.getX(), e.getY()));
}
@Override
public void mouseReleased(MouseEvent e) {
ArrayList<Point> newPoints = new ArrayList<Point>();
for (int i = 0; i < points.size(); i++) {
newPoints.add(points.get(i));
}
curvedLines.add(new Curves(newPoints));
}
});
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLACK);
for (int c = 0; c < points.size() - 1; c++) {
x = (int) points.get(c).getX();
y = (int) points.get(c).getY();
x2 = (int) points.get(c + 1).getX();
y2 = (int) points.get(c + 1).getY();
g.drawLine(x, y, x2, y2);
}
for (int t = 0; t < curvedLines.size(); t++) {
ArrayList<Point> iterator = curvedLines.get(t).points;
for (int c = 0; c < iterator.size() - 1; c++) {
x = (int) iterator.get(c).getX();
y = (int) iterator.get(c).getY();
x2 = (int) iterator.get(c + 1).getX();
y2 = (int) iterator.get(c + 1).getY();
g.drawLine(x, y, x2, y2);
}
}
}
class Curves {
private ArrayList<Point> points;
public Curves(ArrayList<Point> points) {
this.points = new ArrayList<Point>();
this.points = points;
}
}
}
問題は、私は、マウスをドラッグしながら、何のラインが描かれていないが、私は再び、マウスをドラッグすると行が表示されますので、その点はまだ保存されていることです。この明らかな遅延の原因は何ですか?
のためだけで正常に動作しますが、同様の質問をするときには、昨日の答えを与えられました。あなたのコードはあなたが与えたコードとどう違うのですか?要点は、コードを作業コードと比較して違いを見つけることです。独自のコードをデバッグする方法を学ぶ必要があります。私はペイントコードのif/else文は必要ないと答えていると思います。 – camickr
この質問を以前のものに追加する方法がわかりませんでした。そのため、私はそれを自分自身の質問として掲示すると考えました。 'paintComponenet'は私の' curvedLines'ArrayListに要素がなくなるまで何も描画しないので、最初の行が描画されないようにif/else文を追加しました。前にコードサンプルを調べましたが、コードがうまくいかない理由をすぐには理解できませんでした。たぶん、私はちょうどスイングコンポーネントの背後にあるロジック/構造を非常によく理解していません。 – Mystic
この質問を以前の質問に追加するように求められていませんでした。スレッドごとに1つの質問しか持たないようにしてください。あなたの質問には回答があったので、チェックマークをクリックして回答を「受け入れる」べきで、人々は問題が解決されたことを知りました。 – camickr