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

时间:2014-04-14 04:06:55

标签: java swing variables awt

有点像摇摆和制作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) {

        }
    }

提前感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

您的行现在没有显示您的变量(在示例代码中特别是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;
    }
    ...
}

这有助于阻止因修改jpaintComponent()中的actionPerformed()而导致的一致性问题。