2013-02-08 36 views
1

我已经开始使用GUI和监听器。我想从另一个实现ActionListener的类中选择并将文件从pc设置到Hlavna类中的“File zvolenysubor”中。 我可以在侦听器的actionPerformed方法中选择文件,并将其设置为“File subor”,但我无法将其保存到我的主文件夹中的“File zvolenysubor”(以及我的所有想法如何做到这一点都失败了)。 我应该更改/添加那里吗?不能通过监听器设置变量

这里是我的课:

public class Hlavna {  
    public static void main(String[] args) { 
     File zvolenysubor = null; 
     JFrame frame = new JFrame("ABCDE"); 
     JButton vybersuboru = new JButton("vyber"); 
     vybersuboru.setBounds(220, 15, 200, 20); 


     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(640, 480); 
     frame.add(vybersuboru); 
     frame.setLayout(null); 

     VyberListener list1 = new VyberListener(zvolenysubor); 
     vybersuboru.addActionListener(list1); 
     vybersuboru.setText("vyber subor"); 
    } 
} 


public class VyberListener implements ActionListener { 
    private File subor; 

    public VyberListener(File subor){ 
     this.subor = subor; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     JFileChooser chooser = new JFileChooser(); 
     System.out.println("lol"); 
     FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG & GIF Images", "jpg", "gif"); 
     chooser.setFileFilter(filter); 
     chooser.showOpenDialog(null); 
     subor = chooser.getSelectedFile(); 
     System.out.println(subor.getAbsolutePath());   
    } 
} 

回答

0

不是真的知道你是问这里。 Java根据值传递方法参数而不是引用,所以您提供给VyberListener构造函数的File参数只会在VyberListener类中由actionPerformed方法更新,而不是在主方法中引用。你想在这里完成什么?

如果您尝试在主要方法中更新“File zvolenysubor”,可能有必要将VyberListener类中的“File subor”设置为public,以便可以通过main方法访问它。

更新 为了最大限度地减少喋喋不休的数量,在下面的意见,我会尝试和总结。尽管Java支持通过引用,但实际上它只是通过参考指针。因此,在你的榜样,你传递一个空对象引用(小霸王)到您的ActionListener,然后在actionPerformed方法覆盖:

subor = chooser.getSelectedFile(); 

因此,你的文件变量“zvolenysubor”从不更新。为了更新您的Hlavna类领域,我建议使用下面的“容器”模式:

public class Hlavna {  
    public static void main(String[] args) { 
     // New "FileReference" container instance 
     FileReference zvolenysubor = new FileReference(); 
     JFrame frame = new JFrame("ABCDE"); 
     JButton vybersuboru = new JButton("vyber"); 
     vybersuboru.setBounds(220, 15, 200, 20); 

     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(640, 480); 
     frame.add(vybersuboru); 
     frame.setLayout(null); 

     VyberListener list1 = new VyberListener(zvolenysubor); 
     vybersuboru.addActionListener(list1); 

     // Retrieves the updated File instance 
     File updatedFile = zvolenysubor.getFile(); 
    } 
} 

public class VyberListener implements ActionListener { 
    private FileReference subor; 

    public VyberListener(FileReference subor){ 
     this.subor = subor; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     JFileChooser chooser = new JFileChooser(); 
     FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG & GIF Images", "jpg", "gif"); 
     chooser.setFileFilter(filter); 
     chooser.showOpenDialog(null); 
     subor.setFile(chooser.getSelectedFile());  
    } 
} 

// FileReference container class allows the file reference to be updated by the ActionListener 
// without re-initialising the object reference 
public class FileReference { 
    private File _file; 

    public void setFile(File file) { 
     _file = file; 
    } 

    public File getFile() { 
     return _file; 
    } 
} 
+0

是的,这就是我想要做的,更新“文件zvolenysubor”,这是主要的方法。有没有可能在actionPerformed中以某种方式更新它? – 2013-02-08 13:28:35

+0

当然,你失败了,因为你正在向VyberListener构造函数传递空指针。你没有传递任何对象的引用! – 2013-02-08 13:38:12

+0

啊,真的。那么如何将zvolenysubor的参考传递给构造函数呢? – 2013-02-08 13:43:43