当前位置: 首页 > 面试题库 >

Java Paint未在Swing中绘制

楚苏燕
2023-03-14
问题内容

我正在尝试制作绘画程序,但是在拖动鼠标时无法绘制线条。看来涂料一直在刷新,因此只绘制了鼠标的当前位置。我对此有些陌生,因此如何在拖动鼠标时将所有行显示在JPanel上?谢谢,这是我所拥有的:

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.JPanel;

public class DrawingPanel extends JPanel{

    Point start;
    Point end;
    static Color c = Color.black;
    DrawingPanel(){
        addMouseMotionListener(new ml());
        addMouseListener(new ml());
    }
    public class ml implements MouseMotionListener, MouseListener{
        public void mouseMoved(MouseEvent ev){}
        public void mousePressed(MouseEvent e){
            end = e.getPoint();
        }
        public void mouseDragged(MouseEvent e){
            start = end;
            end=e.getPoint();
            repaint();
        }
        public void mouseReleased(MouseEvent e){
            start=null;
            end=null;
        }
        public void mouseClicked(MouseEvent e){}
        public void mouseEntered(MouseEvent e){}
        public void mouseExited(MouseEvent e){}
    }
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.setColor(c);
        if(start!=null){
            Graphics2D g2 = (Graphics2D) g;
            g2.setStroke(new BasicStroke(5));
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2.drawLine(start.x, start.y, end.x, end.y);


        }

    }
}

问题答案:

有多种方法可以解决您的问题。@MattiasF和@MadProgrammer是正确的:Swing在做它应该做的事情。您的paintComponent方法应该重绘整个场景,而不是添加到前一个场景。

到目前为止,建议的解决方案会导致html" target="_blank">应用程序执行矢量图形处理:您正在记住原始的绘制操作,并且在每个绘制上都执行每个绘制操作(Java2D对其进行了一些优化,因为它实际上不会重绘区域。当前在屏幕上不可见的区域,但要弄清楚哪些区域是可见的,哪些区域不可见,也需要花费时间。

优点是,如果需要更大或更小的图像,则可以完美地缩放绘图操作。缺点是,一旦存储了许多绘图操作,它的速度可能会变慢,并且无法(轻松)进行位图操作。

另一种方法是位图方法。您可以在内存中建立绘图的位图,然后使用该paintComponent方法将位图绘制到屏幕上。

优点是通常更快。它还允许位图操作,并且针对此模型进行编程通常也更容易,因为您可以在需要时进行绘制,而不是在内存中构建一系列绘制操作。缺点是它使用更多的内存(直到您执行许多绘图操作为止),并且您无法再完美地缩放图像。

为了使您的工作,例如与保存在内存中的位图,添加等领域image,并imageGraphics为您的阶级,并更换您的鼠标监听ml,以及在paintComponent用下面的代码的方法:

private BufferedImage image = new BufferedImage(500, 500, BufferedImage.TYPE_INT_ARGB);
private Graphics2D imageGraphics = image.createGraphics();

public class ml extends MouseAdapter implements MouseMotionListener, MouseListener {

    public void mousePressed(MouseEvent e) {
        end = e.getPoint();
    }

    public void mouseDragged(MouseEvent e) {
        start = end;
        end = e.getPoint();

        imageGraphics.setColor(c);
        imageGraphics.setStroke(new BasicStroke(5));
        imageGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        imageGraphics.drawLine(start.x, start.y, end.x, end.y);

        repaint();
    }

    public void mouseReleased(MouseEvent e) {
        start = null;
        end = null;
    }
}

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    g2.drawImage(image, null, 0, 0);
}

您将立即看到缩放问题。位图缓冲区为500x500像素,超出此范围的任何内容都不会绘制。这基本上与Microsoft绘画的工作方式相同:开始绘制之前,您需要了解画布的大小。



 类似资料:
  • 问题内容: 我正在用Java编写的Paint应用程序上工作,并 遇到了一些(更多)问题。我有一个gui和一个工作程序(kinda),我唯一的问题是 用户绘制的线条和图形没有保存(在 绘制下一个图形后消失)。 从过去的问题中,我了解到我将需要使用BufferedImage来 存储图形,然后在我的绘画类中绘画它。 我的问题是,任何人都可以提供有关如何使用 缓冲图像来存储和绘制图形的基本解释/示例,以及

  • 问题内容: 我正在尝试用Java绘制曲线。一个简单的以(X,Y)开始,(X,Y)结束和曲线量的贝塞尔曲线就足够了。 我找不到在Swing中执行此操作的方法。如果不在Swing中,我可以使用一些简单的数学方法吗?我将如何在Swing中实现它? 编辑:我知道如何通过重写paint(Graphics g)方法绘制形状和线条。 问题答案: 您可以使用Java 2D Object Path2D.Double

  • 我在java swing中有一个UI需求,其中我需要实现以下内容: 顶部的两个按钮放在一个JPanel中。我需要画一条线通过该面板的中心,直到两个按钮的开始。下面的面板是以卡片布局排列的面板的容器。当按钮被点击时,卡片被切换显示另一个面板。 因此,在所有方面,它看起来都像一个JTabbedPane,但有一点不同,选项卡是排列在选项卡窗格中心的按钮。我需要为我正在构建的UI提供这种差异。 正如您所看

  • 我试图画曼德布罗特集,其中的点是黑色的,其他的都是白色的。在这个初始版本中,我不希望能够放大,而只是创建一个静态图像。 我创建了一个ComplexNumber类,如下所示,用于处理平方运算和将复数相加。 这是我渲染GUI并实际计算Mandelbrot Set中的点的代码。 运行完这段代码后,我得到了下图。看起来曼德尔布罗特的布景有一点模糊,但随后被一吨黑色遮住了。我做错了什么? 更新的解决方案如下

  • 主要内容:1 Swing绘制图形的介绍,2 Swing绘制图形的方法,3 Swing绘制图形的案例1 Swing绘制图形的介绍 java.awt.Graphics类提供了许多用于图形编程的方法。 2 Swing绘制图形的方法 方法 描述 public abstract void drawString(String str, int x, int y) 用于绘制指定的字符串。 public void drawRect(int x, int y, int width, int height) 绘制

  • 如果答案是肯定的,该怎么做?最初,我使用repaint()调用paintComponent(图形);但是,最近我意识到repaint()实际上是repaint(0,0,width,height),它每次都重新绘制所有内容。如果我使用带有参数的repaint()来指定脏区域,它将以何种方式将这样的数据传递给paintComponent(图形)?