2013-01-07 38 views
0

我使用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传递到其他类?

回答

2

传递参数“AccessMain”或“的JTextField”到第二类:

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

然后在第二读取来自“AccessMain”“subjectNumber”(JTextField中值)或“的JTextField”的值类别:

public class AccessClass extends JFrame 
{ 
    final AccessMain experiment; 

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

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

此外,您应该尝试Observer模式。

+0

不能得到这编译... AccessClass的TestClass =新AccessClass(AccessMain.class.this); 上述行导致错误。 – sage88

+0

对不起,修正了它。将'AccessMain.class.this'重命名为'AccessMain.this'。 – imxylz

+0

真棒似乎工作!非常快,谢谢你!有趣的解决方法,我不认为我会想到这一点。 – sage88