有点像摇摆和制作guis的新手,我一直在使用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) {
}
}
提前感谢任何帮助。
答案 0 :(得分:2)
您的行现在没有显示您的变量(在示例代码中特别是j
)是类变量的原因是它们在调用paintComponent()
之间“记住”状态。具体来说,当j
是本地的时,它总是被设置回其初始值(大概是j=60
)。然而,现在,它在行
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;
}
...
}
这有助于阻止因修改j
和paintComponent()
中的actionPerformed()
而导致的一致性问题。