1

フリーフォーム形状を描画するために拡張するクラスを使用しようとしていますがMouseInputAdapter、これは後でアニメーション化されたオブジェクトを作成する可能性があります。

いくつかの回答を見てきましたが、それらは を使用していますaddMouseMotionListener(this)。これは、私が理解している限り、オブジェクトでは実行できません。私の主な問題は、実際に何かを描くことです。JPanelanimate メソッドでリスナーを初期化する場所やリスナーを追加する場所など、基本的なものが欠けている可能性があります。nullPointerException再描画すると仮定するたびに sを取得 します。それか、mouseDragged がアクティブになるたびに。

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

public class test {

    JFrame frame = new JFrame("Bouncing Vertices");
    MyDrawPanel drawPanel = new MyDrawPanel();
    private int delay = 5;
    public int z = 0;
    public int a = 0;
    public static int counter = 0;
    public static int[] xs;
    public static int[] ys;
    public static boolean isDone = false;

    public void animate() {
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(drawPanel);
        frame.setSize(800, 600);
        frame.setVisible(true);
        MyListener alpha = new MyListener();
        drawPanel.addMouseMotionListener(alpha);
        drawPanel.addMouseListener(alpha);
        while (true) {
            drawPanel.repaint();
            try {
                Thread.sleep(delay);
            } catch (Exception ex) {
            }
        }
    }

    private class MyListener extends MouseInputAdapter {

        public void mouseDragged(MouseEvent arg0) {
            int x = arg0.getX();
            int y = arg0.getY();

            if (x != z || y != a) {
                xs[counter] = x;
                ys[counter] = y;
                z = x;
                a = y;
                counter++;
            }

        }

        public void mouseReleased(MouseEvent arg0) {
            isDone = true;
        }
    }

    public static int[] getXs() {
        return xs;
    }

    public static int[] getYs() {
        return ys;
    }

    public static boolean getBoolean() {
        return isDone;
    }

    public static void setBoolean() {
        isDone = false;
    }

    public static void setArrays() {
        for (int i = 0; i < ys.length; i++) {

            xs[counter] = 0;
            ys[counter] = 0;
        }
    }

    public static void main(String[] args) {
        test qwerty = new test();
        qwerty.animate();
    }
}

class MyDrawPanel extends JPanel {

    public void paintComponent(Graphics g) {
        g.setColor(Color.GRAY);
        g.fillRect(0, 0, this.getWidth(), this.getHeight());
        if (test.getBoolean() && test.getXs().length > 0) {
            g.setColor(Color.BLACK);
            g.drawPolyline(test.getXs(), test.getYs(), test.getYs().length);
            test.setBoolean();
            test.setArrays();
        }
    }
}
4

1 に答える 1

1

Swing コンポーネントがイベント ディスパッチ スレッド上にあることを確認するために、Swing ユーティリティへの呼び出しを追加しました。

リスナーと描画パネルを別のクラスにできるように、コードを再配置しました。これを行うために、メイン クラスのインスタンスをリスナー クラスと描画クラスに渡しました。

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.event.MouseInputAdapter;

public class DrawingTest implements Runnable {

    private JFrame frame;

    private MyDrawPanel drawPanel;

    private List<Point> points;

    public DrawingTest() {
        points = new ArrayList<Point>();
    }

    @Override
    public void run() {
        frame = new JFrame("Bouncing Vertices");

        drawPanel = new MyDrawPanel(this);
        MyListener alpha = new MyListener(this);
        drawPanel.addMouseMotionListener(alpha);
        drawPanel.addMouseListener(alpha);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(drawPanel);
        frame.setSize(800, 600);
        frame.setVisible(true);
    }

    public JPanel getDrawingPanel() {
        return drawPanel;
    }

    public List<Point> getPoints() {
        return points;
    }

    public void setPoint(int x, int y) {
        points.add(new Point(x, y));
    }

    public void resetPoints() {
        points.clear();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new DrawingTest());
    }

    private class MyListener extends MouseInputAdapter {

        private DrawingTest drawingTest;

        public MyListener(DrawingTest drawingTest) {
            this.drawingTest = drawingTest;
        }

        @Override
        public void mouseDragged(MouseEvent event) {
           drawingTest.setPoint(event.getX(), event.getY());
           drawingTest.getDrawingPanel().repaint();
        }

        @Override
        public void mouseReleased(MouseEvent event) {
            drawingTest.resetPoints();
        }

    }

}

class MyDrawPanel extends JPanel {

    private DrawingTest drawingTest;

    public MyDrawPanel(DrawingTest drawingTest) {
        this.drawingTest = drawingTest;
    }

    @Override
    public void paintComponent(Graphics g) {
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, this.getWidth(), this.getHeight());
        g.setColor(Color.BLUE);
        for (int i = 1; i < drawingTest.getPoints().size(); i++) {
            Point p1 = drawingTest.getPoints().get(i - 1);
            Point p2 = drawingTest.getPoints().get(i);
            g.drawLine(p1.x, p1.y, p2.x, p2.y);
        }
    }
}
于 2012-10-05T16:46:16.143 に答える