2013-02-08 3 views
1

Я начинаю с GUI и слушателей. Я хочу выбрать и установить файл с ПК в «Файл zvolenysubor» в классе Hlavna другим классом, реализующим ActionListener. Я могу выбрать файл в методе actionPerformed слушателя и установить его в «Суппорт файлов», но я не смог его сохранить в «Файл 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 передает аргументы метода по значению в отличие от ссылки, поэтому параметр File, который вы поставляете конструктору VyberListener, обновляется только в классе VyberListener методом actionPerformed, а не ссылкой в ​​вашем основном методе. Что вы пытаетесь сделать здесь?

Если вы пытаетесь обновить «Файл zvolenysubor» в своем основном методе, может быть полезно сделать ваш «Субордор файлов» в вашем классе VyberListener общедоступным, так что к нему можно получить доступ по основному методу.

Обновление Чтобы свести к минимуму количество болтовни в комментариях ниже, я попытаюсь обобщить. Хотя поддержка Java проходит по ссылке, на самом деле она передается только указателям по ссылке. Таким образом, в вашем примере, вы передаете ссылку на нулевой объект (Subor) к вашему ActionListener, который затем перезаписаны в методе actionPerformed: не

subor = chooser.getSelectedFile(); 

Таким образом, переменная файла «zvolenysubor» не обновляется. Для того, чтобы обновить поля в классе Hlavná, я рекомендую использовать следующий «контейнер» шаблон:

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? –

+0

Конечно, вы терпите неудачу, потому что вы передаете нулевой указатель на конструктор VyberListener. Вы не передаете ссылку на какой-либо объект! –

+0

Ах да, это правда. Так как сдать ссылку на этот zvolenysubor в конструктор, пожалуйста? –

Смежные вопросы