gpt4 book ai didi

java - 鼠标拖动画线组滞后的原因

转载 作者:太空宇宙 更新时间:2023-11-04 07:17:29 26 4
gpt4 key购买 nike

我用Java编写了一个小程序,允许用户设置背景颜色和“笔”颜色,然后单击并在窗口框架中绘制以绘制一条线。我通过在拖动鼠标的每个 x 和 y 点处填充椭圆来设置这条线。我还允许用户使用 - 和 + 键通过增加或减少椭圆的半径来更改线条的大小。我的问题是,绘制线条时存在某种滞后原因。我相信它是在 mouseDrag 方法中,并且该方法的执行速度限制了绘制椭圆时可以获得的 x 和 y 点的数量。有没有什么方法可以缓解这种延迟,从而获得更好的线路?

import java.applet.Applet;
import java.awt.Event;
import java.awt.Color;
import java.awt.Graphics;

public class Screen extends Applet
{
int x = -20, y = -20;
int height = 20, width = 20;
boolean black, blue, cyan, green, magenta, orange, pink, red, white, yellow;

public void init()
{
setSize(400,400);
setBackground(Color.white);
}
public void paint(Graphics g)
{
if (black == true)
g.setColor(Color.BLACK);
else if (blue == true)
g.setColor(Color.BLUE);
else if (cyan == true)
g.setColor(Color.CYAN);
else if (green == true)
g.setColor(Color.GREEN);
else if (magenta == true)
g.setColor(Color.MAGENTA);
else if (orange == true)
g.setColor(Color.ORANGE);
else if (pink == true)
g.setColor(Color.PINK);
else if (red == true)
g.setColor(Color.RED);
else if (white == true)
g.setColor(Color.WHITE);
else if (yellow == true)
g.setColor(Color.YELLOW);

g.fillOval(x, y, width, height);
}
public boolean mouseDrag(Event e, int xPos, int yPos)
{
x = xPos;
y = yPos;
paint(getGraphics());
return true;
}
public boolean keyDown(Event e, int key)
{
black = false;
blue = false;
cyan = false;
green = false;
magenta = false;
orange = false;
pink = false;
red = false;
white = false;
yellow = false;

if (key == 'n')
{
x =-20;
y =-20;
update(getGraphics());
}
else if (key == 'x')
black = true;
else if (key == 'b')
blue = true;
else if (key == 'c')
cyan = true;
else if (key == 'g')
green = true;
else if (key == 'm')
magenta = true;
else if (key == 'o')
orange = true;
else if (key == 'p')
pink = true;
else if (key == 'r')
red = true;
else if (key == 'w')
white = true;
else if (key == 'y')
yellow = true;
else if (key == '+')
{
height += 5;
width += 5;
}
else if (key == '-')
{
height += -5;
width += -5;
}
else if (key == 'X')
setBackground(Color.BLACK);
else if (key == 'B' )
setBackground(Color.BLUE);
else if (key == 'C')
setBackground(Color.CYAN);
else if (key == 'G')
setBackground(Color.GREEN);
else if (key == 'M')
setBackground(Color.MAGENTA);
else if (key == 'O')
setBackground(Color.ORANGE);
else if (key == 'P')
setBackground(Color.PINK);
else if (key == 'R')
setBackground(Color.RED);
else if (key == 'W')
setBackground(Color.WHITE);
else if (key == 'Y')
setBackground(Color.YELLOW);
return true;
}
}

最佳答案

你的画看起来有问题:

  • 您正在直接调用 paint(...),这是绝对不应该做的事情。
  • 您没有在绘制覆盖中调用 super.paint(...) 方法。
  • 尝试最小化你的 GUI,然后恢复它,并告诉我你的绘图有多少消失在虚无中。

相反,你应该:

  • 当您想要建议绘制 GUI 时调用 repaint()
  • 在绘画重写中调用 super 方法
  • 创建椭圆形集合(可能是 Ellipse2D),并通过 for 循环在绘画方法中绘制它们。
  • 删除所有这些 AWT 代码,转而在 JPanel 的 paintComponent(...) 方法中在 Swing 中进行绘制。
  • 不要绘制单独的椭圆,而是绘制连接点的线。您可以通过更改描边来更改粗细。
  • 将绘制的每条曲线保存到 BufferedImage 上,然后在 PaintComponent 方法中绘制该曲线。
<小时/>

编辑:
有关完整的示例,请参阅我的回答:Changing JPanel Graphics g color drawing line

关于java - 鼠标拖动画线组滞后的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19781603/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com