gpt4 book ai didi

从另一个类访问 Java JTextField 信息

转载 作者:行者123 更新时间:2023-12-02 07:21:13 24 4
gpt4 key购买 nike

我使用带有 JTextFields 的 gui 来收集一些信息,然后使用 JButton 获取该信息并将其写入文件,将 gui 可见性设置为 false,然后使用 Runnable 从不同的 JFrame 创建另一个 JFrame 的实例类来显示幻灯片。

我想从新的 JFrame 幻灯片中访问 JTextFields 的一些信息。我尝试使用访问器方法创建前一个类的对象,但值始终返回 null(我知道我已经正确完成了此操作)。

我担心当访问器方法去检查变量等于什么时,JTextFields 对于新的 JFrame 来说显示为 null。

下面是显示此问题的 sscce。

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);
}
}

使用“test”对访问器方法进行硬编码,如下所示:

public String getSubjectNumber()
{
return "test";
}

在新的 JFrame 中运行此方法如下:

SelfPaceMain experiment = new SelfPaceMain();
private String subjectNumber = experiment.getSubjectNumber();
System.out.println(subjectNumber);

确实会导致系统打印“test”。所以访问器方法似乎有效。但是,尝试从 JTextFields 访问值似乎不起作用。

我将从我创建的文件中读取信息,但无法传递 subjectNumber(用作文件名),我无法告诉新类要打开哪个文件。

是否有一种将数据从 JTextFields 传递到其他类的好方法?

最佳答案

将参数“AccessMain”或“JTextField”传递给第二个类:

SwingUtilities.invokeLater(new Runnable() 
{
@Override
public void run()
{
AccessClass testClass = new AccessClass(AccessMain.this); //fixed this
testClass.setVisible(true);
}
});

然后从第二个类中的“AccessMain”或“JTextField”读取“subjectNumber”的值(JTextField值):

public class AccessClass extends JFrame
{
final AccessMain experiment;

public AccessClass(AccessMain experiment)
{
this.experiment = experiment;
}

public String getSubjectNumber(){
return experiment.getSubjectNumber();
}
}

另外,你应该尝试 Observer模式。

关于从另一个类访问 Java JTextField 信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14191516/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com