我不知道到底代码哪个地方出现了问题,
为什么实际运行效果,和我预想的大相径庭?
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();
}
}
实际运行效果 不知道为什么鼠标拖动时,会多很多竖线
预计效果
古老的技术啦啊
你可以贴下代码哦,图片识别麻烦
加VX
结合GPT给出回答如下请题主参考
在处理 Java AWT 绘图问题时,出现实际运行效果和预想效果大相径庭的情况,可能有多种原因:
绘制顺序问题:AWT 绘图需要按照一定的顺序进行,否则会影响绘制效果。例如,如果需要绘制圆形和矩形,应先绘制圆形再绘制矩形,否则可能出现圆形被矩形覆盖的情况。
坐标系问题:AWT 绘图使用的坐标系与常规的数学坐标系略有不同,原点位于左上角。因此,在绘制时需要特别注意它们之间的转换。
使用不当的颜色:AWT 绘图使用的颜色由红、绿、蓝三个分量组成,每个分量取值范围为 0~255,如果使用错误的颜色值,可能会影响绘制效果。
窗口大小问题:如果窗口大小不够大,可能会导致无法完全显示绘制出来的图形,从而影响效果。
绘图对象没刷新:需要在绘制完成后调用 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方法绘制一个矩形。
请注意,这只是一个基本示例,您可以使用各种方法和属性来绘制更复杂的图形。