Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在拖动光标时绘制没有间隙的细线?_Java_Image_Swing_Graphics2d - Fatal编程技术网

Java 如何在拖动光标时绘制没有间隙的细线?

Java 如何在拖动光标时绘制没有间隙的细线?,java,image,swing,graphics2d,Java,Image,Swing,Graphics2d,我有下面这个类,它刷新层0中的jpeg文件,层1用于绘制/绘制/绘制与粉碎相关的任何内容。但在我的画里,当我想画一条细线时,它就断了。因为鼠标光标移动需要较慢 如何解决鼠标快速移动时,线条保持连接的问题 Annotation.java 我通过在点之间绘制矩形来解决这个问题,使用笔划大小(基本笔划)作为高度。这听起来像是一个令人讨厌的解决方案,但实际上效果相当不错 import java.awt.*; import java.awt.event.*; import java.awt.image.

我有下面这个类,它刷新层0中的jpeg文件,层1用于绘制/绘制/绘制与粉碎相关的任何内容。但在我的画里,当我想画一条细线时,它就断了。因为鼠标光标移动需要较慢

如何解决鼠标快速移动时,线条保持连接的问题

Annotation.java
我通过在点之间绘制矩形来解决这个问题,使用笔划大小(基本笔划)作为高度。这听起来像是一个令人讨厌的解决方案,但实际上效果相当不错

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

public class Annotation {

  // Image
  private static Image backgroundImage;
  private static BufferedImage _bufImage = null;

  // Enum
  public  static enum Shape { RECTANGLE, OVAL, LINE }
  private static enum State { IDLE, DRAGGING }

  private static final Shape INIIIAL_SHAPE = Shape.RECTANGLE;
  private static final Color INITIAL_COLOR = Color.RED;
  private static Shape _shape = INIIIAL_SHAPE;
  private static Color _color = INITIAL_COLOR;

  private static State _state = State.IDLE;
  private static Point _start = null;
  private static Point _end   = null;

  // JPanel
  private static JPanel p;
  private static JPanel mp;

  /* Run: */
  public static void main(String args[]) {
    c();
  }

  /* GUI */
  public static void c() {
    try {
        URL url = new URL("http://pscode.org/media/stromlo2.jpg");
      backgroundImage = ImageIO.read(url);
    } catch (Exception e) {
      e.printStackTrace();
    }

    loadAnnotation();
    loadBackground();

    JFrame f;
    f = new JFrame();
    f.setLayout(new BorderLayout());
    f.add(mp);
    f.pack();
    f.setVisible(true);
  }

  /* Layer 0:
   * Load background picture */
  public static void loadBackground() {
    mp = new JPanel() {
      public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(backgroundImage, 0, 0, getWidth(), getHeight(), null);
      }
      public Dimension getPreferredSize() {
        return new Dimension(backgroundImage.getWidth(this), backgroundImage.getHeight(this));
      }
    };
    mp.add(p);
  }

  /* Layer 1:
   * Annotation: Draw on top of background picture anything! */
  public static void loadAnnotation() {

    p = new JPanel() {
      public void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D)g;
        g2.setColor(Color.RED);
        if (_bufImage == null) {
            int w = this.getWidth();
            int h = this.getHeight();
            _bufImage  = new BufferedImage(1024,600, BufferedImage.TRANSLUCENT);
            Graphics2D gc = _bufImage.createGraphics();
        }

        g2.drawImage(_bufImage, null, 0, 0);
        if (_state == State.DRAGGING) {
          g2.drawLine(_start.x, _start.y, _end.x  , _end.y);
        }
      }

      public Dimension getPreferredSize() {
        return new Dimension(1024, 600);
      }
    };

    p.setLayout(new FlowLayout());
    p.addMouseListener(new MouseListener() {
      @Override
      public void mouseClicked(MouseEvent me) {
      }

      @Override
      public void mousePressed(MouseEvent me) {
      }

      @Override
      public void mouseReleased(MouseEvent me) {
        //_state = State.IDLE;
        _state = State.IDLE;
      }

      @Override
      public void mouseEntered(MouseEvent me) {
      }

      @Override
      public void mouseExited(MouseEvent me) {
      }
    });

    p.addMouseMotionListener(new MouseMotionListener() {

      @Override
      public void mouseDragged(MouseEvent me) {
        _state = State.DRAGGING;
        _end   = me.getPoint();
        if (_state == State.DRAGGING) {
            Graphics2D g2 = _bufImage.createGraphics();
            g2.setColor(Color.red);
            g2.setStroke(new BasicStroke(2));
            g2.drawLine(_start.x, _start.y, _end.x, _end.y);
            p.repaint();
        }
        _start = _end;
      }

      @Override
      public void mouseMoved(MouseEvent me) {
        //System.out.println("move");
        _start = me.getPoint();
      }
    });

    JButton pm = new JButton("+");
    pm.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent ae) {
      }
    });
    p.add(pm);
    p.setOpaque(true);
  }

}

不客气。如果你像我一样发布一个SSCCE(图片的热链接),那会早几分钟但是+1用于发布可编译代码。:)
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Annotation {

  // Image
  private static Image backgroundImage;
  private static BufferedImage _bufImage = null;

  // Enum
  public  static enum Shape { RECTANGLE, OVAL, LINE }
  private static enum State { IDLE, DRAGGING }

  private static final Shape INIIIAL_SHAPE = Shape.RECTANGLE;
  private static final Color INITIAL_COLOR = Color.RED;
  private static Shape _shape = INIIIAL_SHAPE;
  private static Color _color = INITIAL_COLOR;

  private static State _state = State.IDLE;
  private static Point _start = null;
  private static Point _end   = null;

  // JPanel
  private static JPanel p;
  private static JPanel mp;

  /* Run: */
  public static void main(String args[]) {
    c();
  }

  /* GUI */
  public static void c() {
    try {
        URL url = new URL("http://pscode.org/media/stromlo2.jpg");
      backgroundImage = ImageIO.read(url);
    } catch (Exception e) {
      e.printStackTrace();
    }

    loadAnnotation();
    loadBackground();

    JFrame f;
    f = new JFrame();
    f.setLayout(new BorderLayout());
    f.add(mp);
    f.pack();
    f.setVisible(true);
  }

  /* Layer 0:
   * Load background picture */
  public static void loadBackground() {
    mp = new JPanel() {
      public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(backgroundImage, 0, 0, getWidth(), getHeight(), null);
      }
      public Dimension getPreferredSize() {
        return new Dimension(backgroundImage.getWidth(this), backgroundImage.getHeight(this));
      }
    };
    mp.add(p);
  }

  /* Layer 1:
   * Annotation: Draw on top of background picture anything! */
  public static void loadAnnotation() {

    p = new JPanel() {
      public void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D)g;
        g2.setColor(Color.RED);
        if (_bufImage == null) {
            int w = this.getWidth();
            int h = this.getHeight();
            _bufImage  = new BufferedImage(1024,600, BufferedImage.TRANSLUCENT);
            Graphics2D gc = _bufImage.createGraphics();
        }

        g2.drawImage(_bufImage, null, 0, 0);
        if (_state == State.DRAGGING) {
          g2.drawLine(_start.x, _start.y, _end.x  , _end.y);
        }
      }

      public Dimension getPreferredSize() {
        return new Dimension(1024, 600);
      }
    };

    p.setLayout(new FlowLayout());
    p.addMouseListener(new MouseListener() {
      @Override
      public void mouseClicked(MouseEvent me) {
      }

      @Override
      public void mousePressed(MouseEvent me) {
      }

      @Override
      public void mouseReleased(MouseEvent me) {
        //_state = State.IDLE;
        _state = State.IDLE;
      }

      @Override
      public void mouseEntered(MouseEvent me) {
      }

      @Override
      public void mouseExited(MouseEvent me) {
      }
    });

    p.addMouseMotionListener(new MouseMotionListener() {

      @Override
      public void mouseDragged(MouseEvent me) {
        _state = State.DRAGGING;
        _end   = me.getPoint();
        if (_state == State.DRAGGING) {
            Graphics2D g2 = _bufImage.createGraphics();
            g2.setColor(Color.red);
            g2.setStroke(new BasicStroke(2));
            g2.drawLine(_start.x, _start.y, _end.x, _end.y);
            p.repaint();
        }
        _start = _end;
      }

      @Override
      public void mouseMoved(MouseEvent me) {
        //System.out.println("move");
        _start = me.getPoint();
      }
    });

    JButton pm = new JButton("+");
    pm.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent ae) {
      }
    });
    p.add(pm);
    p.setOpaque(true);
  }

}