我想在鼠标拖动时在JPanel
上画2条(或更多)线。当我使用super.paintComponent(g)
在我的代码中,我无法在面板上绘制2条线,但是当我不使用super.paintComponent(g);
时,结果很难看,如下面的图片所示:
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS90UjVKdi5qcGcifQ==” alt =“在此处输入图像描述”>
我了解行为什么会那样表现。
如何在拖动鼠标时在面板上画线?
顺便说一句,g2d.draw(line2d)
绘制的线有时不是平滑线(如下图所示)
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9wT2ZzNy5qcGcifQ==” alt =“在此处输入图像描述”>
到目前为止我的代码:
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);
}
});
}
}
..画2行
这似乎是这个问题的症结所在。
单击/拖动时,在可扩展列表(例如ArrayList
)中保留行的集合,在列表中添加新行并调用repaint()
。在paintComponent(Graphics)
中,迭代集合并绘制每条线。
BTW-我猜您在测试此窗口时尚未最小化并还原窗口。您的台词(漂亮或丑陋的)将消失!
。他们消失了。是什么原因?
只要需要重绘GUI,就会调用paint()
和paintComponent()
方法。它们可能会在应用程序前面的另一个窗口出现之后被调用,然后将其带回到最前面。从最小化还原之后的另一个时间。
保留行的选项包括:
BufferedImage
,然后将图像放入ImageIcon
中。如果绘图区域的大小是固定的,并且什么也不会被删除,则此方法效果很好,并且可以容纳..数百万条线,弧,半透明区域,较小的图像,文本。使用图像作为渲染表面,您可以不再需要JLabel
,因为您要做的就是向图像添加新行,然后重新绘制标签以查看新行和所有先前的行。..该线不是直线。
这是因为绘制线条时使用了“渲染提示”。由对齐的像素行组成的屏幕只能完美地形成垂直或水平线。要以任何其他角度给出直线和连续线的“错觉”,需要一种称为ArrayList
的技术。阅读dithering的开头部分,以获取有关Graphics2D
的更多说明和描述。
我不知道您的问题,但是如果您想画一条连续的线。拖动时,您必须更新最后的位置。
Graphics2D