2014-02-17 3 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 

Вы можете избежать этого с помощью ++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 
+0

Я уже изменил его на ++ x, по-прежнему та же проблема. Когда я снова вызываю x, он устанавливается в 0. Я думаю, проблема лежит на public int getX() { return x; } public int setX (int y) { x = y; return this.x; } –

+0

@SeanMira вы пытались вызвать его снова в том же методе, или вы просто вызвали ваш обработчик щелчка во второй раз? –

+0

Я попытался позвонить ему снова. Все такой же. Первая печать будет равна 0, а вторая будет равна 1. (опять-таки по тикерному классу), все еще 0 и 1. @ AndréStannek –

0

Ваша проблема путаница классов и экземпляров классов. И, кроме того, что значит передать значение.Вы не передаете значения классам или экземплярам, ​​только до методов.

У вас есть в вас actionPerformed метод это:

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

(Вышедший код ненужного для задачи, помеченной ...) Первые создает новый объект TimerTutorial (!). Следующий получает некоторые данные от этого нового объекта, но поскольку он является новым и не изменен между ними, это будет одинаковое значение в каждом прогоне метода actionPerformed.

Последний звонок setX бессмыслен, потому что object2 будет собирать мусор вскоре после этого, поэтому нет смысла устанавливать значение. BTW, вы устанавливаете то же значение, что и раньше.

Примечание: я не объясняю операторы post/pre increment/decment. Просто не используйте их, если вы не понимаете их на 100% !!!!

Никогда.

Ever.

То же самое касается всех других языковых конструкций, которые вы еще не поняли.

+0

Я вижу. Поэтому каждый раз, когда он вызывается, возникает новый объект. Есть ли способ сохранить переменные в этом объекте? @Ingo –

+0

Несомненно, @SeanMira есть способ. Проблема в том, что существует много способов, но в вашем случае, почему бы вам не сохранить экземпляр TimerTutorial2 в экземпляре TimeClass, когда он вам нужен? – Ingo

+0

Извините, я немного потерялся с этим, @Ingo. Еще новичок в java. Я пойду на изучение того, как сохранить переменные внутри объекта, я считаю, что трюк будет работать в этой программе. –

Смежные вопросы