关于#java#的问题:AWT 位图使用出错

我不知道到底代码哪个地方出现了问题,
为什么实际运行效果,和我预想的大相径庭?

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;

public class HandDraw {
    //定义窗口对象
    Frame frame = new Frame("简单手绘程序");

    //定义画图区的宽高
    private final int AREA_WIDTH = 500;
    private final int AREA_HEIGHT = 400;
    //定义一一个右键菜单,用于设置画笔的颜色
    private PopupMenu colorMenu = new PopupMenu() ;
    private MenuItem redItem = new MenuItem("红色");
    private MenuItem greenItem = new MenuItem("绿色");
    private MenuItem blueItem = new MenuItem("蓝色");

    //定义一个变量,记录当前画笔的颜色
    Color forceColor = Color.BLACK;

    //创建一个BufferedImage位图对象
    BufferedImage image = new BufferedImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_RGB);

    //通过位图,获取关联的Graphics对象
    Graphics g = image.getGraphics();

    //自定义一个类,继承Canvas
    class MyCanvas extends Canvas{
        @Override
        public void paint(Graphics g) {
            g.drawImage(image, 0, 0, null);

        }
    }

    MyCanvas drawArea = new MyCanvas();

    //定义变量,记录鼠标拖动过程中,上一次所处的坐标
    int preX = -1;
    int preY = -1;

    public void init(){
        //组装视图,逻辑控制
        ActionListener listener = e -> {
            switch (e.getActionCommand()) {
                case "红色":
                    forceColor = Color.RED;
                    break;
                case "绿色":
                    forceColor = Color.GREEN;
                    break;
                case "蓝色":
                    forceColor = Color.BLUE;
                    break;
            }
        };

        redItem.addActionListener(listener);
        greenItem.addActionListener(listener);
        blueItem.addActionListener(listener);

        colorMenu.add(redItem);
        colorMenu.add(greenItem);
        colorMenu.add(blueItem);

        //把colorMenu设置给绘图区域
        drawArea.add(colorMenu);

        drawArea.addMouseListener(new MouseAdapter() {
            @Override
            //当鼠标键抬起时被调用
            public void mouseReleased(MouseEvent e) {
                if (e.isPopupTrigger()) {
                    colorMenu.show(drawArea, e.getX(), e.getY());
                }

                //重置preX和prey
                preX = -1;
                preY = -1;
            }
        });

        //设置位图的背景为白色
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, AREA_WIDTH, AREA_HEIGHT);

        //通过监听鼠标的移动,完成线条绘制
         drawArea.addMouseMotionListener(new MouseMotionAdapter() {
             @Override
             //该方法,当鼠标左键按下,并进行拖动时,会被调用
             public void mouseDragged(MouseEvent e) {
                 if (preX > 0 && preY > 0) {
                     g.setColor(forceColor);
                     //画线条  需要两组坐标,分别代表线条的起点和终点
                     g.drawLine(preX, preY, e.getX(), e.getX());
                 }

                 //修iEpreX和preY的值
                 preX = e.getX();
                 preY = e.getY();

                 //重绘组件
                 drawArea.repaint();
             }
         });

         drawArea.setPreferredSize(new Dimension(AREA_WIDTH, AREA_HEIGHT));
         frame.add(drawArea);

        //设置frame最佳大小并可见
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        new HandDraw().init();
    }
}

实际运行效果 不知道为什么鼠标拖动时,会多很多竖线

img

预计效果

img

古老的技术啦啊

你可以贴下代码哦,图片识别麻烦

Java图形化界面---绘图

加VX

结合GPT给出回答如下请题主参考
在处理 Java AWT 绘图问题时,出现实际运行效果和预想效果大相径庭的情况,可能有多种原因:

  1. 绘制顺序问题:AWT 绘图需要按照一定的顺序进行,否则会影响绘制效果。例如,如果需要绘制圆形和矩形,应先绘制圆形再绘制矩形,否则可能出现圆形被矩形覆盖的情况。

  2. 坐标系问题:AWT 绘图使用的坐标系与常规的数学坐标系略有不同,原点位于左上角。因此,在绘制时需要特别注意它们之间的转换。

  3. 使用不当的颜色:AWT 绘图使用的颜色由红、绿、蓝三个分量组成,每个分量取值范围为 0~255,如果使用错误的颜色值,可能会影响绘制效果。

  4. 窗口大小问题:如果窗口大小不够大,可能会导致无法完全显示绘制出来的图形,从而影响效果。

  5. 绘图对象没刷新:需要在绘制完成后调用 repaint() 方法,以便让绘图对象重新绘制图形。

针对具体问题,可以尝试逐步检查以上原因,并进行调整,以优化绘图效果。

你预想的是怎么样的?

如果你在特定的组件上绘制图形,确保组件的大小和位置正确,以便你的绘图能够完全显示在组件上。

以下是一个简单的Java AWT绘图示例,它绘制一个红色的矩形:

import java.awt.*;

public class Demo extends Frame {

    public static void main(String[] args) {
        Demo demo = new Demo();
        demo.setSize(300, 200);
        demo.setVisible(true);
    }

    public void paint(Graphics g) {
        g.setColor(Color.RED);
        g.fillRect(50, 50, 100, 100);
    }

}

在这个示例中,我们创建了一个名为“Demo”的类,该类继承自AWT的Frame类。在main方法中,我们创建了一个Demo对象,并设置了其大小并将其设置为可见。在paint方法中,我们使用Graphics对象的setColor方法设置颜色为红色,并使用fillRect方法绘制一个矩形。

请注意,这只是一个基本示例,您可以使用各种方法和属性来绘制更复杂的图形。以下是一个简单的Java AWT绘图示例,它绘制一个红色的矩形:

import java.awt.*;

public class Demo extends Frame {

    public static void main(String[] args) {
        Demo demo = new Demo();
        demo.setSize(300, 200);
        demo.setVisible(true);
    }

    public void paint(Graphics g) {
        g.setColor(Color.RED);
        g.fillRect(50, 50, 100, 100);
    }

}

在这个示例中,我们创建了一个名为“Demo”的类,该类继承自AWT的Frame类。在main方法中,我们创建了一个Demo对象,并设置了其大小并将其设置为可见。在paint方法中,我们使用Graphics对象的setColor方法设置颜色为红色,并使用fillRect方法绘制一个矩形。

请注意,这只是一个基本示例,您可以使用各种方法和属性来绘制更复杂的图形。