2

私はペイント プログラムを持っていて、すべてのボタンとスライダーを完成させましたが、実際のペイント自体に問題があります。実線ではなく画面上でカーソルをドラッグすると、ほとんど点線が表示されますが、これは望ましくありません。との のコードは次MouseListenerのとおりです。JPanelBufferedImage

      public void mouseDragged(MouseEvent e) {
          Graphics g=buffered.getGraphics();
          g.setColor(mycol);
              Graphics2D graph=(Graphics2D)g;
          BasicStroke stroke=new BasicStroke(30);
          graph.setStroke(stroke);
              //  g.fillRect(xcor, ycor, 20, 20);
          /  /varx=e.getX();
            ycor=e.getY();
             xcor=e.getX();
            int bad=xcor;
            int good=ycor;
            graph.drawLine(xcor, ycor, bad, good);
           // buffered.setRGB(xcor, ycor, mycol.getRGB());
            repaint();
            // g.drawLine(xcor, ycor, x, x)
             repaint();


        }
4

3 に答える 3

6
  • 私のコメントを正当化するために、この回答を追加しますが、コメントからのわずかな変更がここにあり mousePressed(...)ますmouseClicked(...)
  • もう1つ追加されているのは、オブジェクトを返す常に使用する 代わりに soのGraphics2Dオブジェクトが必要だったため、これでキャストのことを実際に心配する必要はありません。BufferedImagegetGraphics()createGraphics()Graphics2D

    以下の例をご覧ください。

======================

import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.event.*;
import java.net.URL;
import javax.swing.*;
import javax.imageio.ImageIO;

public class PaintingExample {

    private BufferedImage bImage;
    private ImageIcon image;
    private JLabel imageLabel;
    private int xClicked = 0;
    private int yClicked = 0;
    private int xDragged = 0;
    private int yDragged = 0;

    private MouseAdapter mouseListener = new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent me) {
            xClicked = me.getX();
            yClicked = me.getY();
        }

        @Override
        public void mouseDragged(MouseEvent me) {
            xDragged = me.getX();
            yDragged = me.getY();

            Graphics2D g2 = bImage.createGraphics();
            g2.setColor(Color.WHITE);
            BasicStroke stroke=new BasicStroke(30);
            g2.setStroke(stroke);
            g2.drawLine(xClicked, yClicked, xDragged, yDragged);
            g2.dispose();
            imageLabel.setIcon(new ImageIcon(bImage));
        }
    };

    public PaintingExample() {
        try {
            bImage = ImageIO.read(new URL(
                    "http://i.imgur.com/fHiBMwI.jpg"));
            image = new ImageIcon(bImage);          
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    private void displayGUI() {
        JFrame frame = new JFrame("Painting on Image");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel contentPane = new JPanel();
        imageLabel = new JLabel(image);
        imageLabel.addMouseListener(mouseListener);
        imageLabel.addMouseMotionListener(mouseListener);

        contentPane.add(imageLabel);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String... args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new PaintingExample().displayGUI();
            }
        });
    }
}
于 2012-08-09T18:59:58.030 に答える
3

私があなたの問題を正しく理解している場合、あなたが抱える主な問題は、マウスをドラッグしたときに受け取る更新の数です。

ゆっくりとドラッグしても、常にすべてのピクセルの動きが通知されるとは限りません。代わりに、システムは「アイドル」状態 (またはしきい値) が通知されるのを待って、スムーズな動きに「見える」ようにします。

コードを少し変更することで、これをまとめることができました

こんにちは ;)

private MouseAdapter mouseListener =
    new MouseAdapter() {
        private boolean paint = false;
        @Override
        public void mousePressed(MouseEvent me) {

            xClicked = me.getX();
            yClicked = me.getY();
            xDragged = xClicked;
            yDragged = yClicked;

            paint = true;

        }

        @Override
        public void mouseReleased(MouseEvent e) {

            xClicked = -1;
            xClicked = -1;
            xDragged = -1;
            yDragged = -1;

            paint = false;

        }

        @Override
        public void mouseMoved(MouseEvent me) {
        }

        @Override
        public void mouseDragged(MouseEvent me) {

            if (paint) {

                xClicked = xDragged;
                yClicked = yDragged;

                xDragged = me.getX();
                yDragged = me.getY();

                xDragged = me.getX();
                yDragged = me.getY();

                Graphics2D g2 = bImage.createGraphics();
                g2.setColor(Color.WHITE);
                g2.drawLine(xClicked, yClicked, xDragged, yDragged);
                g2.dispose();
                imageLabel.setIcon(new ImageIcon(bImage));

                me.getComponent().invalidate();
                me.getComponent().repaint();

            }

        }
    };

基本的には、最後の「既知の場所」から現在の場所まで線を引くという考え方です。

これがボールパークにあることを願っています

于 2012-08-09T22:57:45.957 に答える
2

30 ピクセルは非常に幅の広い線です。それはおそらくあなたが見ているものです。次のようなものを試してみたいかもしれません

graph.setRenderingHint(
    RenderingHints.KEY_ANTIALIASING,
    RenderingHints.VALUE_ANTIALIAS_ON);

一方、すでにアンチエイリアシングを取得していて、それをオフにしたい場合もあります。それから

graph.setRenderingHint(
    RenderingHints.KEY_ANTIALIASING,
    RenderingHints.VALUE_ANTIALIAS_OFF);

これらの 1 つは、画像の外観を変更することが保証されています。うまくいけば、それはあなたの好みにもっと合うでしょう。

于 2012-08-09T15:44:51.843 に答える