Java 将变量从一个类传递到另一个类
大家好,我是stack,所以如果有人能以任何方式提供帮助,那将是非常棒的。我正在使用eclipse,程序正在编译和运行。我有3门课,它们在同一个包里。因此,我想将ThreadQuizCountdown类中I的值传递给另一个类PanelQuizCountdown int,JTextField的名称为timeField,当前我显示在控制台中,我一直在尝试这样做,但如果有人能帮忙,我无法这样做。这是密码Java 将变量从一个类传递到另一个类,java,swing,concurrency,jtextfield,event-dispatch-thread,Java,Swing,Concurrency,Jtextfield,Event Dispatch Thread,大家好,我是stack,所以如果有人能以任何方式提供帮助,那将是非常棒的。我正在使用eclipse,程序正在编译和运行。我有3门课,它们在同一个包里。因此,我想将ThreadQuizCountdown类中I的值传递给另一个类PanelQuizCountdown int,JTextField的名称为timeField,当前我显示在控制台中,我一直在尝试这样做,但如果有人能帮忙,我无法这样做。这是密码 /**The driver class of the program. Here is the J
/**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();
}
}
timeField.setText( i +"" );
使用委托,为符合接口的委托类添加begin方法参数,如
interface DelegationInterface {
void countdownTick(int i);
}
timeField.setText( i +"" );
在ThreadQuizCountdown中:
添加专用字段并修改开始方法:
private DelegationInterface delegate;
public void begin(DelegationInterface delegate) {
this.delegate = delegate;
myThread.start();
}
timeField.setText( i +"" );
接下来,修改run:注意,我们在critical部分中调用倒计时,在这种情况下,倒计时并不重要,但如果您有许多计时器,这将有助于避免问题
public void run() {
....
myThread.sleep(1000);
if (delegate != null) {
synchronized(delegate) {
delegate.countdownTick(i);
}
}
....
}
timeField.setText( i +"" );
最后,将接口的实现添加到面板:
public class PanelQuizCountdown extends JPanel implements ActionListener, DelegationInterface {
....
public void countdownTick(int i) {
// place i to to timeField
}
....
}
timeField.setText( i +"" );
就这样 使用委派,为符合接口的委派类添加begin方法参数,如
interface DelegationInterface {
void countdownTick(int i);
}
timeField.setText( i +"" );
在ThreadQuizCountdown中:
添加专用字段并修改开始方法:
private DelegationInterface delegate;
public void begin(DelegationInterface delegate) {
this.delegate = delegate;
myThread.start();
}
timeField.setText( i +"" );
接下来,修改run:注意,我们在critical部分中调用倒计时,在这种情况下,倒计时并不重要,但如果您有许多计时器,这将有助于避免问题
public void run() {
....
myThread.sleep(1000);
if (delegate != null) {
synchronized(delegate) {
delegate.countdownTick(i);
}
}
....
}
timeField.setText( i +"" );
最后,将接口的实现添加到面板:
public class PanelQuizCountdown extends JPanel implements ActionListener, DelegationInterface {
....
public void countdownTick(int i) {
// place i to to timeField
}
....
}
timeField.setText( i +"" );
就这样 当您可以选择使用标签时,在文本字段中显示倒计时不是一种好的做法。无论如何,我调试了您的代码,在应用下面的步骤后,它将以您希望的方式运行
timeField.setText( i +"" );
在ThreadQuizCountdown类中,在run方法的while循环中,添加此行
timeField.setText( i +"" );
它将时间值设置为textfield,这是您的第一个明显缺失。您可以在try catch block之前添加此行
timeField.setText( i +"" );
其次,删除这一行:timeField=newjtextfield26;在同一个while循环中,每次都将textfield分配给一个新对象是愚蠢的
timeField.setText( i +"" );
应用这些将完成您的工作。在文本字段中显示倒计时,而您可以选择使用标签,这不是一个好的做法。无论如何,我调试了您的代码,在应用下面的步骤后,它将以您希望的方式运行
timeField.setText( i +"" );
在ThreadQuizCountdown类中,在run方法的while循环中,添加此行
timeField.setText( i +"" );
它将时间值设置为textfield,这是您的第一个明显缺失。您可以在try catch block之前添加此行
timeField.setText( i +"" );
其次,删除这一行:timeField=newjtextfield26;在同一个while循环中,每次都将textfield分配给一个新对象是愚蠢的
timeField.setText( i +"" );
应用这些将使您的工作得以完成。我认为在UI类中将文本设置为UI字段是一种很好的做法,不是在thread中。我这样做了,它在thread thread-1 java.lang.NullPointerException在ThreadQuizCountdown.runThreadQuizCountdown.java:30在java.lang.thread.runThread.java:722中给了我==>异常,这是添加了timeField.setText I+的同一行;你确定?添加此timeField.setText i+;就在system.out.println.之后,我根据你在问题中发布的代码完成了这些操作。也许您更改了代码并丢失了。使用初始代码并应用我的步骤。如果您遇到错误,让我们在聊天室中交谈。好吗?我认为在UI类中,而不是在线程中,将文本设置为UI字段是一种很好的做法。我这样做了,它在thread thread-1 java.lang.NullPointerException中给了我==>异常ThreadQuizCountdown.runThreadQuizCountdown.java:30在java.lang.thread.runThread.java:722它与添加timeField.setText I+的行相同;你确定?添加此timeField.setText i+;就在system.out.println.之后,我根据你在问题中发布的代码完成了这些操作。也许您更改了代码并丢失了。使用初始代码并应用我的步骤。如果您遇到错误,让我们在聊天室中交谈。好啊
timeField.setText( i +"" );