2014-02-17 71 views
0

我正在試着學習這個獲取值 - 設置值 - 返回它來自何處的值編碼。我聽說這是一種'傳遞價值或參考'的問題,做了我的研究,但仍然困擾着這個問題。無論如何,這是我的源代碼:將A類設置值的值從A類設置爲B,並將B類的值返回給A

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 ++),該值爲1,傳遞給另一個類並設置它。

這是其他類:

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中,任何提示可以理解

+1

長碼...你能縮小它到你面臨的問題嗎?這裏我們必須爲你做。 –

+0

對不起!等待。我會縮小它的範圍。 @Vakh –

回答

-1

問題1

你的第一個問題就出在你的++運營商的用法:

object2.setX(x++); 

這裏發生的是,值x作爲參數傳遞到setX(),之後遞增。一般來說x++增量爲x但聲明的值仍舊是舊的x

int x = 0; 
System.out.println(x++); // 0 
System.out.println(x); // 1 

您可以通過使用++xx+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 

我希望現在你可以看到x0每次你執行你的動作監聽得到執行。如果你想保留你的對象,並且它在另一個範圍內的狀態,你必須在該範圍內聲明該變量。在你的情況下,動作監聽器已經是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 
+0

我已經將其更改爲++ x,仍然是同樣的問題。當我再次調用x時,它被設置爲0. 我認爲問題在於 public int getX(){ return x; } public int setX(int y){ x = y; return this.x; } –

+0

@SeanMira你有沒有試過用同樣的方法再次調用它,或者你是否第二次調用你的點擊處理程序? –

+0

我試着再次調用它。還是一樣。第一個打印爲0,第二個打印爲1(由Timer類再次調用),仍爲0和1. @AndréStannek –

0

你的問題是類和類的實例的混亂。而且,此外,傳遞價值意味着什麼。YOu不會將值傳遞給類或實例,只需要方法

你有你actionPerformed方法是:

TimerTutorial object2 = new TimerTutorial(); 
... 
int x = object2.getX(); 
... 
object2.setX(x++); 

(左明代碼無關的標記......問題) 首先創建一個新對象TimerTutorial(!)。接下來從這個新對象獲得一些數據,但是因爲它是新的並且在它們之間沒有改變,所以在actionPerformed方法的每次運行中這將是相同的值。

最後的setX調用是無意義的,因爲object2將在垃圾收集後不久被收集,所以設置一個值是沒有意義的。順便說一句,你設置了與以前相同的值。

注意:我不解釋post/pre增量/減量運算符。 只要不使用它們,除非你100%瞭解它們!

從來沒有。

永遠。

對於您還不瞭解的所有其他語言構造也是如此。

+0

我明白了。所以每次調用時都會有一個新的對象。有沒有辦法保存該對象中的變量? @Ingo –

+0

當然,@SeanMira有一個方法。問題是,實際上有很多方法,但就你而言,爲什麼你不需要在TimeClass實例中持有TimerTutorial2實例? – Ingo

+0

對不起,我有點失落,@Ingo。還是Java的新手。我將研究如何保存對象內部的變量,我相信這個技巧將在這個程序中起作用。 –

相關問題