拖动鼠标时在JPanel上画线

TU_*_*KAI 3 java swing jpanel

我想JPanel在鼠标拖动时画上2条(或更多条)线。当我super.paintComponent(g) 在代码中使用时,无法在面板上绘制2条线,但是当我不使用时super.paintComponent(g);,结果很难看,如下图所示:

在此处输入图片说明

我了解行为什么会这样。

拖动鼠标时如何在面板上画线?

顺便说一句,g2d.draw(line2d)有时绘制的线不是平滑线(如下图所示)

在此处输入图片说明

到目前为止,我的代码:

import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Line2D;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;


public class LineDrawing extends JPanel implements MouseMotionListener, MouseListener{
    Point point1;
    Point point2;
    Line2D line2d;

  public LineDrawing(){
       super();
       addMouseListener(this);
       addMouseMotionListener(this);
    }

 @Override
  public void paintComponent(Graphics g){

    //super.paintComponent(g);

       Graphics2D g2d = (Graphics2D) g;
       if(point1!=null && point2!=null){

          g2d.setPaint(Color.RED);
          g2d.setStroke(new BasicStroke(1.5f));
          g2d.draw(line2d);

         }
      }   


  @Override
  public void mouseDragged(MouseEvent e) {

    point2 = e.getPoint();
    line2d = new Line2D.Double(point1, point2); 
    repaint();

  }

   @Override
   public void mouseMoved(MouseEvent e) {

   }

   @Override
   public void mouseClicked(MouseEvent e) {

  }

   @Override
   public void mousePressed(MouseEvent e) {
     point1 = e.getPoint();

   }

  @Override
  public void mouseReleased(MouseEvent e) {

  }

 @Override
 public void mouseEntered(MouseEvent e) {

 }

 @Override
 public void mouseExited(MouseEvent e) {

}


public static void main(String a[]){
   EventQueue.invokeLater(new Runnable(){
        @Override
        public void run() {

         JFrame frame = new JFrame();
         LineDrawing linedraw= new LineDrawing();
         frame.add(linedraw);
         frame.setSize(500,500);
         frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
         frame.setVisible(true);   

                         }
                });
   }   
}
Run Code Online (Sandbox Code Playgroud)

And*_*son 5

..画2行

这似乎是这个问题的症结所在。

ArrayList单击/拖动时,将行集合保存在可扩展列表中(例如),向列表中添加新行并调用repaint()。在中paintComponent(Graphics),对集合进行迭代并绘制每条线。

顺便说一句-我猜您在测试此窗口时没有最小化并恢复您的窗口。您的台词(漂亮或丑陋)将消失!


他们消失了。什么原因?

每当需要重绘GUI时,就会调用方法paint()paintComponent()。它们可能会在应用程序前面的另一个窗口出现之后被调用,然后将其带回到最前面。从最小化还原之后的另一个时间。

保留行的选项包括:

  • 存储行的位置,并在需要时重新绘制所有位置(如上所述)。这可以用于大多数目的。即使有几百行,GUI也会在“眨眼之间”重绘它们。
  • 将每条线绘制到a上BufferedImage,然后将图像放入ImageIcona中JLabel。如果绘图区域的大小是固定的,并且什么也没有去除,则此方法效果很好,并且可以容纳..数百万条线,弧,半透明区域,较小的图像,文本。不再需要ArrayList,因为您要做的就是向图像添加新行,然后重新绘制标签以查看新行和所有先前的行。

..该线不是直线。

那是因为画线时使用了“渲染提示”。由对齐的像素行组成的屏幕只能完美地形成垂直或水平线。要以任何其他角度给出直线和连续线的“错觉”,需要一种称为抖动的技术。阅读的开头部分,Graphics2D以获取有关的更多说明和描述RenderingHints