Java Swing中的自定义绘图循环
我正在努力学习如何在Java中为我正在从事的一个小组项目定制GUI。我以前做过用户表单类型的GUI,所以我知道我在这里做什么的要点,但是自定义绘图的东西仍然让我困惑 我从网上复制了这段代码,我一直试图弄清楚它是如何工作的,但我不明白为什么我不能循环绘图方法。作为一个简单的测试,我试图让程序在我的光标上画一个椭圆形。它在光标上绘制椭圆,但在运行时只绘制一次,然后什么也不做 我怎样才能做这个循环,这样我就可以继续画东西了?或者我是否需要以不同的方式调用/使用这些方法Java Swing中的自定义绘图循环,java,swing,loops,graphics,drawing,Java,Swing,Loops,Graphics,Drawing,我正在努力学习如何在Java中为我正在从事的一个小组项目定制GUI。我以前做过用户表单类型的GUI,所以我知道我在这里做什么的要点,但是自定义绘图的东西仍然让我困惑 我从网上复制了这段代码,我一直试图弄清楚它是如何工作的,但我不明白为什么我不能循环绘图方法。作为一个简单的测试,我试图让程序在我的光标上画一个椭圆形。它在光标上绘制椭圆,但在运行时只绘制一次,然后什么也不做 我怎样才能做这个循环,这样我就可以继续画东西了?或者我是否需要以不同的方式调用/使用这些方法 public class Bom
public class BombermanGUI extends JFrame {
public static final int CANVAS_WIDTH = 640;
public static final int CANVAS_HEIGHT = 480;
private DrawCanvas canvas;
public BombermanGUI() {
canvas = new DrawCanvas();
canvas.setPreferredSize(new Dimension(CANVAS_WIDTH, CANVAS_HEIGHT));
Container cp = getContentPane();
cp.add(canvas);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.pack();
this.setTitle("......");
this.setVisible(true);
}
private class DrawCanvas extends JPanel{
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
setBackground(Color.BLACK);
int x, y;
x = MouseInfo.getPointerInfo().getLocation().x - this.getLocationOnScreen().x;
y = MouseInfo.getPointerInfo().getLocation().y - this.getLocationOnScreen().y;
g.setColor(Color.YELLOW);
g.drawOval(x, y, 10, 10);
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new BombermanGUI();
}
});
}
}
这是tobais_k答案,我的回答是结束问题强>
添加一个事件监听器并让它调用重新绘制方法,例如用于跟踪鼠标光标的鼠标运动监听器,或者让一些线程运行游戏并定期触发重新绘制。绘制一系列复杂的回调和对系统内更改的响应。要记住的第一件事是,你不控制绘画过程,而是向系统提出建议,这样系统就可以决定应该重新绘画的内容和时间 请查看和以了解更多详细信息 绘画是一个破坏性的过程。假设在重新绘制时,您将重新绘制当前组件的整个状态。这意味着您将需要某种模型来维护所有需要绘制的内容 请看一看,特别是关于
Shape
MouseInfo
是一种非常糟糕的检测鼠标位置的方法,因此,您应该使用来检测鼠标事件
基本上,当用户按下鼠标按钮时,您将记录鼠标按下的位置。移动鼠标时,您将计算相对于鼠标按下的移动的宽度和高度,并更新“当前”形状。您可以调用repaint
,请求更新UI,并通过paintComponent
方法绘制此形状(首先绘制之前的所有形状)
释放鼠标按钮时,您将向模型提交“当前”形状,因此每次调用
paintComponent
时都会绘制该形状。添加事件侦听器,并让它调用repaint
方法,例如,用于跟踪鼠标光标的鼠标运动侦听器,或者让一些线程运行你的游戏并定期触发重新绘制
。哎呀,我在删除不必要的部分时把代码搞糟了一点,我现在就来修复它。我也在想办法。啊,重新绘制就是我要找的,这应该可以解决我的问题。谢谢davidpostill的建议。没有答案,所以我不能选择最好的答案…哇,这是一个地狱的很多围绕我的头。幸运的是我有时间把这一切弄清楚,thanks@user2856410从概念上讲,它非常简单(无意冒犯,我知道它看起来非常复杂),问题是,这是一个非线性问题,因为您在事件驱动的环境中运行,所以您需要维护从一个事件到下一个事件的“有状态”细节,这些并不总是直接相关的