我正在努力学习如何在Java中为我正在进行的小组项目做自定义GUI。我以前做过用户表单类型的GUI,所以我知道我在这里做的事情的要点,但是自定义绘图的东西仍然让我困惑。
我从网上复制了这段代码,我一直在试图弄清楚它是如何工作的,但我不明白为什么我不能循环绘图方法。作为一个简单的测试,我试图让程序在我的光标上绘制一个椭圆形。它在光标上绘制椭圆,但在运行时只绘制一次,然后什么都不做。
如何制作此循环以便我可以继续画画?或者我需要一种不同的方式来调用/使用这些方法吗?
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();
}
});
}
}
答案 0 :(得分:2)
绘制一系列复杂的回调和对系统内变化的响应。要记住的第一件事是你不能控制绘画过程,而是向系统提出建议,以便它可以决定重绘的内容和时间......
请查看Painting in AWT and Swing和Performing Custom Painting了解详情。
绘画是一个破坏性的过程。假设重绘时,您将重新绘制当前组件的整个状态。这意味着你需要某种模型来维护所有需要绘制的内容......
请查看2D Graphics,特别是查看Shape
MouseInfo
是一种非常糟糕的方法,可以为此目的检测鼠标的位置,相反,您应该使用MouseListener
and/or MouseMotionListener
来检测鼠标事件。
基本上,当用户按下鼠标按钮时,您将记录鼠标按下的位置。移动鼠标时,您将计算相对于鼠标按下的移动的宽度和高度,并更新"当前"形状。您可以调用repaint
来请求更新UI并通过paintComponent
方法绘制此形状(首先绘制所有以前的形状)。
释放鼠标按钮后,您将提交"当前"塑造模型,因此每次调用paintComponent
时都会绘制它。
答案 1 :(得分:0)
这是tobais_k,我现在回答这个问题!
添加一个事件监听器并让它调用重绘方法,例如用于跟踪鼠标光标的鼠标移动侦听器,或者让一些线程运行游戏并定期触发重绘。