Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java drawLine()方法不将类变量作为输入_Java_Swing_Variables_Awt - Fatal编程技术网

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

Java drawLine()方法不将类变量作为输入,java,swing,variables,awt,Java,Swing,Variables,Awt,一般来说,swing和制作GUI是一个新手,我一直在使用drawLine方法创建“floors”,它一直在为paintComponent类的局部坐标变量工作,但是我想使用actionListerner/Timer更改坐标,所以我需要整个类都可以访问这些变量 这可能是一个真正简单的解决方法(??),如果我在这里问这个问题,我会看起来像个傻瓜,但我无法解决它 这是代码 class Elevator extends JPanel implements ActionListener { pri

一般来说,swing和制作GUI是一个新手,我一直在使用drawLine方法创建“floors”,它一直在为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) {

        }
    }
类电梯扩展JPanel实现ActionListener{ 私有int numberOfLines=0; 私人int j=60; int yco=j-125; 最终私人内部高度=50; 最终私有整数宽度=80; 最终私有布尔值UP=true; 最终私人int TOP=60; 最终私有int底部=j-125; 私有int mi=5; 专用定时器=新定时器(100,本); 公共电梯(int x){ 这个.numberOfLines=x; } 受保护组件(图形g){ 超级组件(g); 对于(int i=0;i
感谢您的帮助。

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

j += 75;
并且永远不要重置为较低的值。这意味着第二次或第三次调用
paintComponent()
时,
j
的值太大,并且您的线条在可见区域外绘制(屏幕外)。Java Swing组件可以很容易地调用其
paintComponent()
方法两次、三次或更多次,然后再在屏幕上渲染该组件,这就是为什么不再绘制线条的原因(从技术上讲,线条是绘制的,只是在你看不到的任何地方)

要解决此问题,可以在
paintComponent()
方法中添加一行

j = 60;
就在for循环之前。但是在这一点上,您最好保持
j
local(除非您需要读取它的值,但不需要使用计时器更改它)

或者,如果
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;
    }
    ...
}
公共组件(图形g){
...
int jCopy=j;
对于(int i=0;i300){
j=60;
}
...
}

这将有助于停止在
paintComponent()
actionPerformed()
中修改
j
可能导致的一致性问题。您需要调用
timer.start()
,更改
actionPerformed()
覆盖中的值,并确保调用
This.repaint()
内部
actionPerformed()
但原始行(计时器未更改的行)也不会打印<代码>g.绘制线(0,j,getWidth(),j);j+=75这一行当我将J更改为PaintComponent类内部的局部变量时,它会按预期工作,但是如果J变量是在方法外部创建的,则draw line函数似乎不起作用。