2016-06-12 7 views
0

Я разрабатываю интерфейс, в котором пользователь может выбрать файл с помощью JFileChooser (инициированный через JButton) и сохранить его строковый путь в таблице для последующего использования. Мой код для выбора файла содержится в классе TheHandler, а моя таблица находится в классе FilePanel. У меня есть значение filePath, направленное на tablePath класса FilePanel, так что я могу хранить строки в таблице.Java - хранить строки в таблице с помощью JFileChooser, получить заданные методы?

Однако мой вопрос заключается в том, что tablePath возвращается null, который я считаю либо потому, что:

1) filePath содержится в пределах void метода

2) значение дается tablePath до того, как пользователь выбирает файл

или комбинация 1) и 2). Поэтому мой вопрос заключается в том, как я могу извлечь значение filePath, чтобы его можно было принять tablePath после того, как пользователь выберет файл?

Я думаю, что нужно получить и установить методы, но я только начал изучать их, и из примеров, с которыми я столкнулся, я думаю, что мне нужно будет использовать их в конструкторе actionPerformed(ActionEvent event), но если это так, я я полностью отбрасываю, как это сделать. Любая помощь будет принята с благодарностью.

TheHandler класс:

public static class TheHandler implements ActionListener { 
    String filePath; 

    public void actionPerformed(ActionEvent event) { 
     Component parent = null; 
     JFileChooser chooser = new JFileChooser(); 
     FileNameExtensionFilter filter = new FileNameExtensionFilter("TIFF Images", "tif", "tiff"); 
     chooser.setFileFilter(filter); 
     int returnVal = chooser.showOpenDialog(parent); 

     filePath = chooser.getSelectedFile().toString(); 
     //System.out.println(filePath); 

     if (returnVal == JFileChooser.APPROVE_OPTION) { 
      ImagePlus picture = IJ.openImage(filePath); 
      picture.show(); 
     } 
    } 
} 

FilePanel класс:

public class FilePanel extends JPanel { 
    public FilePanel() { 
     setLayout(new GridLayout(1, 0)); 
     TheHandler thePath = new TheHandler(); 
     String tablePath = thePath.filePath; 

     System.out.println(filePaths); // outputs null, this line runs before file is chosen? 

     String col[] = {"Loaded TIFF Files"}; 
     String[] tiffFiles = {filePaths, filePaths}; // Vector or list may be more useful? 
     DefaultTableModel tableModel = new DefaultTableModel(col, 0); 
     tableModel.addRow(tiffFiles); 
    } 
} 

ответ

1

Ваш TheHandler является класс ActionListener чистым и простым, и его основной метод, метод замещения actionPerformed, вызывается только если компонент что Handler добавлен, будь то JButton, JMenuItem или что-то еще, вызывает его вызов. Кажется, вы создаете экземпляр этого класса, но я не вижу, чтобы вы добавляли его к любому компоненту, который принимает ActionListeners, поэтому неудивительно, что его одно поле filePath останется нулевым.

Если вы хотите использовать это в лучшем виде, используйте его, поскольку предполагается использовать ActionListener. Добавьте его в JButton или JMenuItem и выполните его действие, когда событие диктует, что действие должно быть выполнено. Если вы хотите получать уведомления о том, что поле filePath больше не равно null, вы можете сделать его «связанным свойством» с помощью SwingPropertyChangeSupport.

Второй вариант заключается в создании метода, который выполняет «мясо» кода в действии TheHandlerPerformed и просто вызывает это при необходимости. Вы даже можете назвать TheHandler так, чтобы он мог выполнять двойную задачу.

например,

public static class TheHandler implements ActionListener{ 
    String filePath;   

    public void actionPerformed(ActionEvent event){    
     String innerPath = null; 
     innerPath = getFilePath(); 
     if (innerPath != null) { 
      filePath = innerPath; 
      ImagePlus picture = IJ.openImage(filePath); 
      picture.show();                    
     }    
    } 

    public String getFilePath() { 
     String innerFilePath = null; 
     Component parent = null; // better to avoid this 
     JFileChooser chooser = new JFileChooser(); 
     FileNameExtensionFilter filter = new FileNameExtensionFilter("TIFF Images", "tif","tiff"); 
     chooser.setFileFilter(filter);  
     int returnVal = chooser.showOpenDialog(parent); 
     if(returnVal == JFileChooser.APPROVE_OPTION) { 
      innerFilePath = chooser.getSelectedFile().toString();            
     } 
     return innerFilePath; 
    } 
} 

Тогда ваш другой класс можно назвать getFilePath() метод TheHandler непосредственно.

+0

О, прошу прощения, он остался без моего сообщения, но у меня есть ActionListener в сочетании с JButton, чтобы инициировать процесс: addBtn.addActionListener (новый TheHandler()); Это имеет смысл, хотя, позвольте мне посмотреть, смогу ли я получить эту рабочую реальную скорость – Rosie

+0

Ага, так что исправьте меня, если я ошибаюсь, но сам внутренний_Path не может быть вызван, но, создав метод getFilePath(), innerPath принимает значение innerFilePath, когда условия выполняются, и поскольку getFilePath() является общедоступным методом, который возвращает innerFilePath, этот метод можно вызвать в других классах. – Rosie

+0

На самом деле у меня есть другой вопрос, если вы не возражаете. Созданный вами метод вытащил из метода void filechooser (который даст мне нужный путь), но при вызове этого метода в другом классе откроется второй filechooser (первый из них при нажатии кнопки загрузки). Есть ли способ получить только возвращаемое значение метода getFilePath(), чтобы я мог использовать это результирующее значение строки в другом классе? – Rosie