【问题标题】:How do I move a 2d graphic around a canvas when the mouse is moved not dragged当鼠标移动而不拖动时,如何在画布周围移动 2d 图形
【发布时间】:2014-02-10 12:33:13
【问题描述】:

我正在解决一个在 java 中绘制 2d 图形的问题,但我希望在鼠标移动而不是拖动时移动绘图。你知道,当鼠标在画布上移动时,图形正在移动也。我该怎么做?

  import java.awt.Cursor;
  import java.awt.Graphics;
  import java.awt.Graphics2D;
  import java.awt.Image;
  import java.awt.Point;
  import java.awt.PointerInfo;
  import java.awt.Toolkit;
  import java.awt.event.MouseEvent;
  import java.awt.event.MouseListener;
  import java.awt.event.MouseMotionListener;
  import java.awt.geom.QuadCurve2D;
  import java.awt.geom.Rectangle2D;
  import java.awt.image.BufferedImage;
  import java.awt.image.MemoryImageSource;

  public class Pointer2QuadCurve extends javax.swing.JFrame {

     private javax.swing.JPanel jPanel1;
     double x1;
     double y1;

  public Pointer2QuadCurve() {
    initComponents();
    jPanel1.addMouseListener(new MouseListener() {

        @Override
        public void mouseClicked(MouseEvent e) {

        }

        @Override
        public void mousePressed(MouseEvent e) {

        }

        @Override
        public void mouseReleased(MouseEvent e) {

        }

        @Override
        public void mouseEntered(MouseEvent e) {
            int[] pixels = new int[16 * 16];
            Image image = Toolkit.getDefaultToolkit().createImage(
                    new MemoryImageSource(16, 16, pixels, 0, 16));
            Cursor transparentCursor
                    = Toolkit.getDefaultToolkit().createCustomCursor(image, new Point(0, 0), "invisibleCursor");
            //paintWithPointer(getGraphics());
            setCursor(transparentCursor);
        }

        @Override
        public void mouseExited(MouseEvent e) {

        }
    });
    jPanel1.addMouseMotionListener(new MouseMotionListener() {

        @Override
        public void mouseDragged(MouseEvent e) {

        }

        @Override
        public void mouseMoved(MouseEvent e) {
            //Point p = getMousePosition();
            x1 = e.getX();
            y1 = e.getY();
            jPanel1.repaint();
        }
    });
}



private void initComponents() {

    jPanel1 = new javax.swing.JPanel();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
    jPanel1.setLayout(jPanel1Layout);
    jPanel1Layout.setHorizontalGroup(
        jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 400, Short.MAX_VALUE)
    );
    jPanel1Layout.setVerticalGroup(
        jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 300, Short.MAX_VALUE)
    );

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
    );

    pack();
}                       


public static void main(String args[]) {

    try {
        for (javax.swing.UIManager.LookAndFeelInfo info :   javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
         java.util.logging.Logger.getLogger(Pointer2QuadCurve.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(Pointer2QuadCurve.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(Pointer2QuadCurve.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(Pointer2QuadCurve.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }

    java.awt.EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            new Pointer2QuadCurve().setVisible(true);
        }
    });
}


public void paint(Graphics g) {
    Graphics2D g2d = (Graphics2D) g;
    // draw Rectangle2D.Double
    g2d.draw(new Rectangle2D.Double(x1, y1,
            Math.random() + 10,
            Math.random() + 15));
}

}

【问题讨论】:

  • MouseMoitionListener 开头。当mouseMoved被触发时,更新“对象”的位置并重绘
  • 谢谢,但是要绘制的代码会在paint方法中吗?
  • @MadProgrammer Ugg.. 我的回答最初建议使用MouseListener,但在我的脑海里我在想..我确定有一个mouseMoved(..) 事件!
  • 好的,谢谢。我会再试一次。
  • 如需尽快获得更好的帮助,请发帖MCVE。即使在为 AWT 包添加导入之后,我也看到 4 个编译错误。运行时问题的 MCVE 应该包含导入,并且可以干净地编译。

标签: java awt java-2d


【解决方案1】:
  • MouseMotionListener 添加到自定义绘制组件。
  • 监听mouseMoved 事件。
  • MouseEvent 获取Point
  • Point处绘制形状。

【讨论】:

  • 为什么是第三点?似乎有点矫枉过正,MouseEvent 会给你点,可以根据需要转换为源组件上下文以外的其他上下文......只是说......
  • @MadProgrammer 第三点是使用MouseListener 的后遗症。 :P 已编辑..
  • 是的,对我来说似乎有点矫枉过正......但裤子对我来说似乎有点矫枉过正;)+1
  • @MadProgrammer 当他们向我解释“休闲星期五”仍然要求穿裤子时,我感到很沮丧。 那个怎么休闲? :(
  • @EseUdom 不是。您可以尝试使用多层组件,但如果您使用重量级/AWT 组件,您会遇到问题,因为它们不能透明......
猜你喜欢
  • 1970-01-01
  • 2018-02-22
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多