簡體   English   中英

從另一個類訪問Java JTextField信息

[英]Java JTextField information access from another class

我正在使用帶有JTextFields的gui來收集一些信息,然后使用一個接受該信息並將其寫入文件的JButton,將gui可見性設置為false,然后使用Runnable從另一個類創建另一個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);

是否導致系統打印“測試”。 所以訪問器方法似乎正在起作用。 但是,嘗試從JTextFields訪問值似乎不起作用。

我會從我創建的文件中讀取信息,但是無法傳遞subjectNumber(用作文件的名稱),我無法告訴新類要打開哪個文件。

有沒有一種好方法將數據從JTextField傳遞到其他類?

將參數'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模式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM