【问题标题】:Java JTextField information access from another class从另一个类访问 Java JTextField 信息
【发布时间】:2013-01-07 07:17:56
【问题描述】:

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

我想从新的 JFrame 幻灯片中访问 JTextField 的一些信息。我尝试使用访问器方法创建前一个类的对象,但值不断返回 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);

确实会导致系统打印“测试”。所以访问器方法似乎正在工作。但是,尝试从 JTextField 访问值似乎不起作用。

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

有没有一种好方法可以将数据从 JTextFields 传递到其他类?

【问题讨论】:

    标签: java swing jtextfield accessor


    【解决方案1】:

    将参数“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 模式。

    【讨论】:

    • 无法编译... AccessClass testClass = new AccessClass(AccessMain.class.this);上面的行导致错误。
    • 抱歉,已修复。将“AccessMain.class.this”重命名为“AccessMain.this”。
    • 真棒似乎工作!那非常快,谢谢!有趣的解决方法,我想我不会想到这一点。
    猜你喜欢
    • 2017-07-22
    • 2013-05-02
    • 1970-01-01
    • 2013-05-18
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多