gpt4 book ai didi

Java drawLine() 方法不将类变量作为输入

转载 作者:行者123 更新时间:2023-12-02 05:56:21 27 4
gpt4 key购买 nike

一般来说,对 Swing 和制作 GUI 有点陌生,我一直在使用 DrawLine 方法来创建“地板”,并且它一直在为 PaintComponent 类中的坐标变量本地工作,但是我想更改使用 actionListerner/Timer 进行坐标,因此我需要整个类都可以访问变量。

这可能是一个真正简单的修复(??),我在这里问它看起来像个傻瓜,但我无法解决它。

这是代码。

class Elevator extends JPanel implements ActionListener {

private int numberOfLines = 0;
private int j = 60;

int yco = j - 125;

final private int HEIGHT = 50;
final private int WIDTH = 80;
final private boolean UP = true;
final private int TOP = 60;
final private int BOTTOM = j - 125;

private int mi = 5;

private Timer timer = new Timer(100, this);

public Elevator(int x) {

this.numberOfLines = x;

}

protected void paintComponent(Graphics g) {
super.paintComponent(g);

for (int i = 0; i < numberOfLines; i++) {

g.drawLine(0, j, getWidth(), j);
j += 75;

}

g.drawRect(getWidth() / 2, yco, WIDTH, HEIGHT);

}

@Override
public void actionPerformed(ActionEvent e) {

}
}

如有任何帮助,请提前致谢。

最佳答案

您的行现在没有显示您的变量(特别是示例代码中的 j)是类变量的原因是它们在调用 paintComponent() 之间“记住”状态。具体来说,当j是本地的时,它总是被设置回其初始值(大概是j=60)。然而现在,它在您的 for 循环中增加了

j += 75;

并且永远不会重置为较低的值。这意味着第二次或第三次调用 paintComponent() 时,j 的值太大,并且您的线条被绘制在可见区域之外(屏幕外) 。 Java Swing 组件在组件渲染到屏幕上之前可以轻松地调用其 paintComponent() 方法两次、三次或更多次,这就是您的线条不再被绘制的原因(嗯,从技术上讲,它们是被绘制的,只是不在您可以看到它们的任何地方)。

要解决此问题,您可以向 paintComponent() 方法添加单行

j = 60;

就在 for 循环之前。但此时,您不妨将 j 保留在本地(除非您需要读取其值但不使用计时器更改它)。

或者,如果 j 需要随着时间的推移而改变,只需确保它被计时器设置在 actionPerformed() 内,然后使用该值的副本paintComponent() 而不是直接使用 j 的值。举个例子:

public void paintComponent(Graphics g) {
...
int jCopy = j;
for (int i = 0; i < numberOfLines; i++) {

g.drawLine(0, jCopy, getWidth(), jCopy);
jCopy += 75;

}
...
}

public void actionPerformed(ActionEvent e) {
...
j += 5;
//If you don't cap it at some max,
//it will go off the bottom of the screen again
if (j > 300) {
j = 60;
}
...
}

这将有助于阻止因修改 paintComponent()actionPerformed() 中的 j 可能导致的一致性问题。

关于Java drawLine() 方法不将类变量作为输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23051789/

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