我使用gui和JTextFields来收集一些信息,然后JButton将该信息写入文件,将gui可见性设置为false,然后使用Runnable创建一个来自不同类的另一个JFrame的实例来显示幻灯片。从另一个类的Java JTextField信息访问
我想从新的JFrame幻灯片中访问JTextFields的一些信息。我已经尝试使用访问器方法创建前一个类的对象,但值保持为空(我知道我已经正确地完成了这个操作)。
我很担心,当访问器方法去检查什么变量等于JTextField对新的JFrame显示为空。
以下是显示此问题的代码。
package accessmain;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class AccessMain extends JFrame implements ActionListener
{
private static final int FRAMEWIDTH = 800;
private static final int FRAMEHEIGHT = 300;
private JPanel mainPanel;
private PrintWriter outputStream = null;
private JTextField subjectNumberText;
private String subjectNumberString;
public static void main(String[] args)
{
AccessMain gui = new AccessMain();
gui.setVisible(true);
}
public AccessMain()
{
super("Self Paced Slideshow");
setSize(FRAMEWIDTH, FRAMEHEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
//Begin Main Content Panel
mainPanel = new JPanel();
mainPanel.setBorder(new EmptyBorder(0,10,0,10));
mainPanel.setLayout(new GridLayout(7, 2));
mainPanel.setBackground(Color.WHITE);
add(mainPanel, BorderLayout.CENTER);
mainPanel.add(new JLabel("Subject Number: "));
subjectNumberText = new JTextField(30);
mainPanel.add(subjectNumberText);
mainPanel.add(new JLabel(""));
JButton launch = new JButton("Begin Slideshow");
launch.addActionListener(this);
mainPanel.add(launch);
//End Main Content Panel
}
@Override
public void actionPerformed(ActionEvent e)
{
String actionCommand = e.getActionCommand();
if(actionCommand.equals("Begin Slideshow"))
{
subjectNumberString = subjectNumberText.getText();
if(!(subjectNumberString.equals("")))
{
System.out.println(getSubjectNumber());
this.setVisible(false);
writeFile();
outputStream.println("Subject Number:\t" + subjectNumberString);
outputStream.close();
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
AccessClass testClass = new AccessClass();
testClass.setVisible(true);
}
});
}
else
{
//Add warning dialogue here later
}
}
}
private void writeFile()
{
try
{
outputStream = new PrintWriter(new FileOutputStream(subjectNumberString + ".txt", false));
}
catch(FileNotFoundException e)
{
System.out.println("Cannot find file " + subjectNumberString + ".txt or it could not be opened.");
System.exit(0);
}
}
public String getSubjectNumber()
{
return subjectNumberString;
}
}
然后创建一个准系统类显示数据的丢失:
package accessmain;
import javax.swing.*;
import java.awt.*;
public class AccessClass extends JFrame
{
AccessMain experiment = new AccessMain();
String subjectNumber = experiment.getSubjectNumber();
public AccessClass()
{
System.out.println(subjectNumber);
}
}
硬编码的访问方法与“测试”是这样的:
public String getSubjectNumber()
{
return "test";
}
运行该方法如以下在新的JFrame中:
SelfPaceMain experiment = new SelfPaceMain();
private String subjectNumber = experiment.getSubjectNumber();
System.out.println(subjectNumber);
是否导致系统打印“测试”。所以访问器方法似乎正在工作。但是,试图访问JTextFields中的值似乎不起作用。
我会从我创建的文件中读取信息,但无法传递subjectNumber(用作文件名),我无法告诉新类打开哪个文件。
有没有一种很好的方式将数据从JTextFields传递到其他类?
不能得到这编译... AccessClass的TestClass =新AccessClass(AccessMain.class.this); 上述行导致错误。 – sage88
对不起,修正了它。将'AccessMain.class.this'重命名为'AccessMain.this'。 – imxylz
真棒似乎工作!非常快,谢谢你!有趣的解决方法,我不认为我会想到这一点。 – sage88