【问题标题】:Why is my line not drawing?为什么我的线不画?
【发布时间】:2014-08-14 00:39:15
【问题描述】:

所以我定义了一个 mouseEventlistener 和 mousemotionListener 来定义点。

      protected Point elementPosition = null;
      public Point endPoint = null;
      public Axis tempAxis;
      public Graphics g;


      class MouseButtonHandler extends MouseAdapter
      {

       public void mousePressed(MouseEvent e)
       {
        if(e.getModifiers()==InputEvent.BUTTON1_MASK)
        {

         elementPosition =new Point(e.getX(), e.getY()) ;
   if(addType==YLABEL)
   {
    YDialog ydia = new YDialog(anApp);
    ydia.setVisible(true);

    value =(double) ydia.getValue();
    ydia.dispose();
   }


        }
      }

     public void mouseReleased(MouseEvent e)
    {
    }
    }

   class MouseMoveHandler extends MouseMotionAdapter
   {
   public void MouseMoved(MouseEvent e)
   {
    Point currentCursor = e.getPoint();
   }


   public void mouseDragged(MouseEvent e)
   {
    endPoint = new Point(e.getX(), e.getY());
    tempAxis = new Axis(elementPosition, endPoint);
    tempAxis.draw(g);  
   }

  }

其中轴类是这样定义的。

 import java.awt.*;
 import java.awt.event.*;

 public class Axis extends Object
 {
  public Point position;
  public Point endPoint;

 public Axis(Point position, Point endPoint)
 {
  this.position = position;
  this.endPoint = endPoint;
 }

public void draw(Graphics g)
{
 g.setColor(Color.red);
 g.drawLine(position.x, position.y, endPoint.x, endPoint.y);
}

}

这些都在视图类中实现。弹出,按计划显示菜单和所有内容,但鼠标拖动时不绘制轴。具体来说,它说有问题 tempAxis.draw(g);。有谁知道为什么会发生此错误。顺便说一句,我还是 Java 新手。

【问题讨论】:

  • 只是一个建议:如果您格式化您的代码,我们和您可能会更容易阅读。
  • g 从未初始化
  • 这是否意味着我需要与 mouseevent 和 mousemovelistener 在同一类中的 draw(Graphics g) 方法?
  • 没关系,它与另一个具有空指针异常的变量有关,但没有被报告为这样。谢谢。

标签: java graphics awt draw mousemove


【解决方案1】:

为什么我的线没有画出来?

因为这不是自定义绘画的工作方式。

至少有两个主要问题。第一个是,您在每个拖动事件上创建一个新的Axis,这是不必要且低效的。

您应该在mousePressed 上创建一个新的Axis,传递起点并在mouseDragged 事件中更新此实例。如果您需要保留以前绘制的线条,则需要将它们添加到某种List 中,以便重新绘制它们(请记住,绘制具有破坏性)。

第二个问题是绘制是在组件paint 方法的上下文中执行的。假设您正在使用 AWT,您应该有某种从 Component 扩展而来的自定义类,Canvas 非常流行。

您将覆盖此组件的paint 方法并在此处执行您的绘画。这就是为什么你需要List

例如...

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class DrawLine {

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

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

                Frame frame = new Frame("Testing");
                frame.addWindowListener(new WindowAdapter() {
                    @Override
                    public void windowClosing(WindowEvent e) {
                        System.exit(0);
                    }
                });
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends Canvas {

        private List<Axis> lines;

        public TestPane() {
            lines = new ArrayList<>(25);

            MouseAdapter handler = new MouseAdapter() {

                private Axis current;

                @Override
                public void mousePressed(MouseEvent e) {
                    System.out.println("Clicled");
                    current = new Axis(e.getPoint());
                    lines.add(current);
                }

                @Override
                public void mouseDragged(MouseEvent e) {
                    System.out.println("Dragged");
                    if (current != null) {
                        current.setEndPoint(e.getPoint());
                        repaint();
                    }
                }

                @Override
                public void mouseReleased(MouseEvent e) {
                    current = null;
                }

            };

            addMouseListener(handler);
            addMouseMotionListener(handler);
        }

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

        @Override
        public void paint(Graphics g) {
            super.paint(g);
            for (Axis axis : lines) {
                System.out.println("line");
                axis.draw(g);
            }
        }

    }

    public class Axis extends Object {

        public Point position;
        public Point endPoint;

        public Axis(Point position) {
            this.position = position;
            this.endPoint = position;
        }

        public void setEndPoint(Point endPoint) {
            this.endPoint = endPoint;
        }

        public void draw(Graphics g) {
            g.setColor(Color.red);
            g.drawLine(position.x, position.y, endPoint.x, endPoint.y);
        }
    }

}

请查看Painting in AWT and Swing,了解有关绘画过程的更多详细信息。

现在,除非您有充分的理由这样做,否则我会鼓励您在 AWT 库上使用 Swing API,该库在大约 15 年前被 Swing 取代。了解 Swing 工作原理的人比记得(或有使用过)AWT 的人多。为此,您应该首先查看Performing Custom Painting

【讨论】:

    猜你喜欢
    • 2019-12-12
    • 1970-01-01
    • 2023-02-21
    • 1970-01-01
    • 2022-07-12
    • 2023-01-08
    • 2018-03-04
    • 1970-01-01
    • 2013-01-03
    相关资源
    最近更新 更多