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