передать переменную из одного класса в другой - PullRequest
1 голос
/ 10 марта 2012

Привет всем, я в стеке, так что если кто-то может помочь в любом случае, было бы здорово.Я использую Eclipse, и программа компилируется и работает.У меня есть 3 класса, и они находятся в одной упаковке.Поэтому я хочу передать значение i в классе ThreadQuizCountdown другому классу PanelQuizCountdown в JTextField с именем timeField. В настоящее время я отображается в консоли. Я пытался это сделать, но я не смог, если кто-нибудь может помочь.Вот код

/**The driver class of the program. Here is the JFrame 
 * class name RunQuizCountdown.java
 * @author Kiril Anastasov
 * @date 09/03/2012
 */

import java.awt.*;
import javax.swing.*;

public class RunQuizCountdown 
{
    public static void main(String[] args) 
    {

        JFrame application = new JFrame();
        PanelQuizCountdown panel = new PanelQuizCountdown();
        application.add(panel);
        application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        application.setSize(200,300);
        application.setLocationByPlatform(true);
        application.setVisible(true);
    }

}



/** Here is the GUI of the program
 * class name PanelQuizCountdown.java
 * @author Kiril Anastasov
 * @date 09/03/2012
 */

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;   

public class PanelQuizCountdown extends JPanel implements ActionListener
{
    JTextField timeField, answerField;
    JLabel messageLabel, correctLabel, totalLabel;
    int x, y;
    int correct;
    int total;

    ThreadQuizCountdown myQuiz;

    PanelQuizCountdown()
    {
        timeField = new JTextField(5);
        myQuiz = new ThreadQuizCountdown(timeField);
        this.add(timeField);
        myQuiz.begin();


        messageLabel = new JLabel("What is the result of " + x + " * " + y);
        this.add(messageLabel);

        answerField = new JTextField(5);
        this.add(answerField);

        correctLabel = new JLabel("You gave : " + correct +  " correct answers");
        this.add(correctLabel);

        totalLabel = new JLabel("You answered: " + total + " questions");
        this.add(totalLabel);





    }


    public void actionPerformed(ActionEvent ae)
    {

    }
}

/** Here is the thread of the program
 * class name ThreadQuizCountdown.java
 * @author Kiril Anastasov
 * @date 09/03/2012
 */

import javax.swing.JTextField;

public class ThreadQuizCountdown implements Runnable
{
    JTextField  timeField;
    Thread myThread = new Thread(this);

    int i = 30;
    boolean go = true;

    ThreadQuizCountdown(JTextField theTimeField)
    {
        timeField = theTimeField;
    }

    public void run()
    {


        while(go)
        {           
            System.out.println(i);      

            try 
            { 
                myThread.sleep(1000);          
            } 
            catch (InterruptedException ie) 
            {
                 System.out.println("thread exception");
            }

            timeField = new JTextField(26);

            if(i == 0 )
            {
                go = false;
            }
            i--;
        }

    }

    public void begin()
    {
        myThread.start();
    }

    public void finish()
    {
        myThread.stop();
    }
}

Ответы [ 2 ]

2 голосов
/ 10 марта 2012

Не рекомендуется показывать обратный отсчет в текстовом поле, пока у вас есть возможность использовать метку. В любом случае, я отладил ваш код, и после выполнения описанных ниже шагов он будет работать так, как вы хотите.

В классе ThreadQuizCountdown, в цикле while метода run() добавьте эту строку

timeField.setText( i +"" );

, который устанавливает значение времени для текстового поля, которое является вашим первым очевидным пропуском. Вы можете добавить эту строку перед блоком try-catch.

Во-вторых, удалите эту строку: timeField = new JTextField(26); из того же цикла while, глупо каждый раз присваивать текстовое поле новому объекту.

Применение этого сделает вашу работу.

2 голосов
/ 10 марта 2012

Используйте делегирование, добавьте в метод метода begin () для вашего класса делегата, который соответствует интерфейсу, например

interface DelegationInterface {
   void countdownTick(int i);
}

в ThreadQuizCountdown: добавить приватное поле и изменить метод начала:

private DelegationInterface delegate;

public void begin(DelegationInterface delegate) {
   this.delegate = delegate;
   myThread.start();
}

далее, изменить run (): (обратите внимание, что мы вызываем обратный отсчет в критической секции, в этом случае это не имеет значения, но если у вас будет много таймеров, это поможет избежать проблем)

public void run() {
....
  myThread.sleep(1000); 
  if (delegate != null) {
      synchronized(delegate) {
          delegate.countdownTick(i);
      }
  }
....
}

И, наконец, добавьте реализацию интерфейса на панель:

public class PanelQuizCountdown extends JPanel implements ActionListener, DelegationInterface {
    ....
    public void countdownTick(int i) {
        // place i to to timeField
    }
    ....
}

Вот и все!

...