我正在努力学习这个获取价值 - 设定价值 - 从编码风格中返回价值。我听说这是一种“通过价值或参考”的问题,做了我的研究,仍然坚持这个问题。无论如何,这是我的源代码:
System.out.println(x);
int x = object2.getX(); **//I HAVE A PROBLEM HERE**
int x2 = rand.nextInt(100);
int y = rand.nextInt(100);
int xpost = rand.nextInt(300);
int ypost = rand.nextInt(150);
allField[x] = new JTextField(String.format(" %s + %s", x2 , y));
allField[x].setBounds(xpost, ypost, 100, 30);
allField[x].setEnabled(false);
add(allField[x]);
object2.setX(x++); **//I HAVE A PROBLEM HERE TOO**
我试图通过object2.getX()获取另一个类的值;从那里它将设置数组的索引。完成数组的设置后,仍然为0,我想增加它(x ++),并将该值传递给另一个类并设置它。
这是另一个类:
public class TimerTutorial extends JFrame {
JLabel promptLabel, timerLabel;
int counter, x = 0;
int changeTest;
JTextField tf;
JButton button;
Timer timer;
public int getX(){**//I HAVE A PROBLEM HERE**
return x;
}
public int setX(int y){**//I HAVE A PROBLEM HERE**
x = y;
return this.x;
}
}
如果您需要整个代码,但问题在此之前说明:
import java.awt.event.*;
import java.awt.*;
import java.util.Random;
import javax.swing.*;
public class TimerTutorial extends JFrame{
JLabel promptLabel, timerLabel;
int counter, x = 0;
int changeTest;
JTextField tf;
JButton button;
Timer timer;
public int getX(){
return x;
}
public int setX(int y){
x = y;
return this.x;
}
public TimerTutorial(){
setLayout(new GridLayout(2,2,5,5));
tf = new JTextField();
add(tf);
promptLabel = new JLabel("Enter seconds:", SwingConstants.CENTER);
add(promptLabel);
button = new JButton("Start Timing");
add(button);
timerLabel = new JLabel("Waiting...", SwingConstants.CENTER);
add(timerLabel);
event e = new event();
button.addActionListener(e);
}
public class event implements ActionListener{
public void actionPerformed(ActionEvent e){
int count = (int)(Double.parseDouble(tf.getText()));
timerLabel.setText("Time left:" +count);
TimeClass tc = new TimeClass(count);
timer = new Timer(1000, tc);
timer.start();
}
public class TimeClass implements ActionListener{
int counter;
public TimeClass(int counter){
this.counter = counter;
}
public void actionPerformed(ActionEvent tc){//every time timer updates this will spark
counter--;
JTextField[] allField = new JTextField [20];
TimerTutorial object2 = new TimerTutorial();
Random rand = new Random();
System.out.println(x);
int x = object2.getX();
int x2 = rand.nextInt(100);int y = rand.nextInt(100);
int xpost = rand.nextInt(300); int ypost = rand.nextInt(150);
allField[x] = new JTextField(String.format(" %s + %s", x2 , y));
allField[x].setBounds(xpost, ypost, 100, 30);
allField[x].setEnabled(false);
add(allField[x]);
object2.setX(x++);
if(counter>=1) {
timerLabel.setText("Time left: "+counter);
} else {
timer.stop();
timerLabel.setText("Done!");
Toolkit.getDefaultToolkit().beep();
}
}
}
}
public static void main(String args[]){
TimerTutorial gui = new TimerTutorial();
gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
gui.setSize(800,800);
gui.setVisible(true);
}
}
实际上代码工作正常。我的目标是以秒为间隔随机发布JTextFields,其中包含随机位置和值。这里的问题是x不会增加。这使我的JTextFields索引[0]。 PS:还是Java的新手,任何提示都将不胜感激
答案 0 :(得分:0)
您的问题是类和类实例的混淆。此外,传递价值意味着什么。你不会将值传递给类或实例,只是传递给方法。
你有actionPerformed
方法:
TimerTutorial object2 = new TimerTutorial();
...
int x = object2.getX();
...
object2.setX(x++);
(遗漏代码与标有...的问题无关)
第一个创建一个新的(!)对象TimerTutorial。下一个从这个新对象获取一些数据,但因为它是新的并且没有在中间更改,所以在actionPerformed
方法的每次运行中它都是相同的值。
最后一次setX
调用是荒谬的,因为object2
很快会被垃圾收集,所以设置一个值是没有意义的。顺便说一下,你设置的值和以前一样。
注意:我没有解释post / pre递增/递减运算符。 除非你100%理解它们,否则不要使用它们!!!!
<强>从不强>
<强>自从强>
对于您还不了解的所有其他语言结构也是如此。
答案 1 :(得分:-1)
问题1
您的第一个问题在于您使用++
运算符:
object2.setX(x++);
这里发生的是x
的值作为参数传递给setX()
并随后递增。一般来说,x++
会增加x
,但语句的值仍然是旧的x
。
int x = 0;
System.out.println(x++); // 0
System.out.println(x); // 1
您可以使用++x
或x+1
来避免这种情况。
问题2
修复++
运算符的使用对您没有多大帮助,因为每次执行动作侦听器方法时都会创建一个新的TimerTutorial
对象。
public void actionPerformed(ActionEvent tc){
...
TimerTutorial object2 = new TimerTutorial(); //new object is create which initializes it's instance variable x to 0
...
int x = object2.getX(); //returns the instance variable x of object2 which is 0
...
object2.setX(x++); //explained in problem 1
//After here object2 is never used again in this method
...
} //at the end of the method, the scope of the variable object2 ends and the object it points to will be garbage collected
我希望您现在每次执行动作侦听器时都能看到x
为0
。如果要保留对象及其在另一个范围内的状态,则必须在该范围内声明该变量。在您的情况下,动作侦听器已经是TimerTutorial
的内部类,因此您甚至可能不需要新的TimerTutorial
对象。你可以使用外部类。我仍然不确定你的计划应该达到什么目标,但我认为这将是最佳选择:
public void actionPerformed(ActionEvent tc){
...
//TimerTutorial object2 = new TimerTutorial(); <= not needed
...
int x = getX(); //returns the instance variable x of the outer class
...
setX(x+1); //sets the instance variable x of the outer class
...
} //next time this method is called, the state of x will be preserved in the outer class