0

私は Java ペイント プログラムを持っていますが、これには 2 つの問題があります。どちらの問題も比較的単純で、マウス入力がどのように処理されるか、画像がどのように色を使用するかに注目するだけです。アプリの写真は次のとおりです。

ここに画像の説明を入力

だからここに私の最初の問題があります:

ご覧のとおり、アプリの外観では、ペイント領域にドットのスプレーがあります. これらのドットのそれぞれがマウスクリックです。プログラムはユーザーがマウス ボタンを押していることを認識しないため、個別にクリックする必要があります。

これは明らかに非生産的であり、ユーザーフレンドリーでなく、容認できません。さて、これをどのように修正するか、わかりません。永久while (true)ループを使用してみましたが、うまくいきません。毎回クリックする代わりに、マウスを押したままにするたびにドットが飛び散るようにするにはどうすればよいですか?

2 つ目の問題は、ドットの色です。ご覧のとおり、下部にカラー ボタンがあります。これらは機能しますが、問題があります。色を変更すると、現在画面上にあるすべてのドットの色が変わります。currentColor色は、下部パネルのすべての色ボタンによって制御される actionListeners によって実行される変数によって実行されます。画面に既に配置されている色が影響を受けないようにするにはどうすればよいですか?

JPanelこれら 2 つの問題を修正できるすべてのコードは、描画するプログラムに使用される私のカスタムにあると思います。クラス全体を以下に掲載します。他に質問がありましたら、お知らせください。

int xCord, yCord;

public class PaintPanel extends JPanel implements MouseListener {
    // default serial whatever...
    private static final long serialVersionUID = -6514297510194472060L;

    public PaintPanel() {
        addMouseListener(this);
    }

    ArrayList<Point> points = new ArrayList<Point>();

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        for (Point point : points) {
            g.setColor(currentColor);
            g.fillOval(point.x, point.y, 12, 12);

        }
        repaint();
    }

    @Override
    public void mouseClicked(MouseEvent m) {
    }

    @Override
    public void mouseEntered(MouseEvent m) {
    }

    @Override
    public void mouseExited(MouseEvent m) {
    }

    @Override
    public void mousePressed(MouseEvent m) {

        if (paintPanel.contains(m.getPoint())) {
                points.add(m.getPoint());
                xCord = m.getX();
                yCord = m.getY();
                System.out.println("x: " + xCord + " y: " + yCord);
        }

    }

    @Override
    public void mouseReleased(MouseEvent m) {
    }

}
4

1 に答える 1

1

Swing でのペイントは破壊的です。

つまり、Swing がコンポーネントの再描画を要求すると、そのコンポーネントは以前に描画されたものをクリアし、それ自体を更新することが期待されます。

色の問題の問題は、単一の色しか指定されていないことです。

可能な解決策はBufferedImage、に依存するのではなく、バッキング バッファー (のような) にペイントすることpaintComponentです。

が呼び出されるたびにすべてのドットを再描画する代わりに、paintComponent単純に を描画しBufferedImageます。

マウスの問題に関しては、を実装する必要がありますMouseMotionListener。これにより、マウスが表面を横切ってドラッグされ、ドットの軌跡を描くことを検出できます

非常に基本的な例で更新

ここに画像の説明を入力

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class SimplePaint04 {

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

    public SimplePaint04() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private PaintPane paintPane;

        public TestPane() {
            setLayout(new BorderLayout());
            add((paintPane = new PaintPane()));
            add(new ColorsPane(paintPane), BorderLayout.SOUTH);
        }
    }

    public class ColorsPane extends JPanel {

        public ColorsPane(PaintPane paintPane) {
            add(new JButton(new ColorAction(paintPane, "Red", Color.RED)));
            add(new JButton(new ColorAction(paintPane, "Green", Color.GREEN)));
            add(new JButton(new ColorAction(paintPane, "Blue", Color.BLUE)));
        }

        public class ColorAction extends AbstractAction {

            private PaintPane paintPane;
            private Color color;

            private ColorAction(PaintPane paintPane, String name, Color color) {
                putValue(NAME, name);
                this.paintPane = paintPane;
                this.color = color;
            }

            @Override
            public void actionPerformed(ActionEvent e) {
                paintPane.setForeground(color);
            }

        }

    }

    public class PaintPane extends JPanel {

        private BufferedImage background;

        public PaintPane() {
            setBackground(Color.WHITE);
            setForeground(Color.BLACK);
            MouseAdapter handler = new MouseAdapter() {

                @Override
                public void mousePressed(MouseEvent e) {
                    drawDot(e.getPoint());
                }

                @Override
                public void mouseDragged(MouseEvent e) {
                    drawDot(e.getPoint());
                }

            };
            addMouseListener(handler);
            addMouseMotionListener(handler);
        }

        protected void drawDot(Point p) {
            if (background == null) {
                updateBuffer();;
            }

            if (background != null) {
                Graphics2D g2d = background.createGraphics();
                g2d.setColor(getForeground());
                g2d.fillOval(p.x - 5, p.y - 5, 10, 10);
                g2d.dispose();
            }
            repaint();
        }

        @Override
        public void invalidate() {
            super.invalidate();
            updateBuffer();
        }

        protected void updateBuffer() {

            if (getWidth() > 0 && getHeight() > 0) {
                BufferedImage newBuffer = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
                Graphics2D g2d = newBuffer.createGraphics();
                g2d.setColor(Color.WHITE);
                g2d.fillRect(0, 0, getWidth(), getHeight());
                if (background != null) {
                    g2d.drawImage(background, 0, 0, this);
                }
                g2d.dispose();
                background = newBuffer;
            }

        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            if (background == null) {
                updateBuffer();
            }
            g2d.drawImage(background, 0, 0, this);
            g2d.dispose();
        }
    }
}
于 2013-06-04T03:41:54.957 に答える