2016-06-12 1 views
0

Je suis en train de concevoir une interface dans laquelle l'utilisateur peut sélectionner un fichier à partir de JFileChooser (initié via JButton) et stocker son chemin de chaîne dans une table, pour une utilisation ultérieure. Mon code pour sélectionner un fichier est contenu dans la classe TheHandler, et ma table est dans la classe FilePanel. J'ai la valeur de filePath dirigé à tablePath de la classe FilePanel, de sorte que je peux stocker les chaînes dans la table.Java - Stocke les chemins de chaîne dans la table avec JFileChooser, obtient les méthodes set?

Cependant, mon problème est que tablePath retours null, qui je pense est parce que:

1) filePath est contenu dans une méthode void

2) une valeur est donnée à tablePath avant que l'utilisateur sélectionne un fichier

ou une combinaison de 1) et 2). Donc, ma question est comment je peux extraire la valeur de filePath, de sorte qu'il peut être pris par tablePath après que l'utilisateur sélectionne un fichier? Je pense aux méthodes get et set, mais je viens de commencer à les apprendre, et à partir d'exemples que j'ai rencontrés, je pense que je devrais les utiliser dans le constructeur actionPerformed(ActionEvent event), mais si c'est le cas, je Je suis complètement découragé sur la façon de le faire. Toute aide serait grandement appréciée.

TheHandler Classe:

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 Classe:

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); 
    } 
} 

Répondre

1

Votre TheHandler est une classe ActionListener pure et simple, et sa principale méthode, la méthode actionPerformed substituée, est appelée uniquement si le composant que The Handler est ajouté à, que ce soit un JButton, JMenuItem, ou autre, déclenche son appel. Vous semblez créer une instance de cette classe, mais je ne vois pas vous l'ajouter à un composant qui prend ActionListeners, donc il ne devrait pas être surprenant que son champ, filePath, restera null.

Si vous voulez utiliser ceci d'une meilleure manière, utilisez-le comme un ActionListener est supposé être utilisé. Ajoutez-le à un JButton ou un JMenuItem, et faites-le exécuter son action lorsqu'un événement dicte que l'action doit être effectuée. Si vous voulez être averti que le champ filePath n'est plus nul, vous pouvez en faire une "propriété liée" en utilisant SwingPropertyChangeSupport.

La deuxième option consiste à créer une méthode qui exécute la «viande» du code dans l'actionPerformed de TheHandler, et l'appelle simplement si nécessaire. Vous pouvez même demander à TheHandler de l'appeler pour qu'il puisse servir un double objectif.

par exemple,

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; 
    } 
} 

Ensuite, votre autre méthode de la classe pourrait appeler TheHandler getFilePath() directement.

+0

Oh, je suis désolé, il a été omis de mon message, mais j'ai le ActionListener couplé avec un JButton pour lancer le processus: addBtn.addActionListener (new TheHandler()); Cela a du sens cependant, laissez-moi voir si je peux obtenir ce travail rapide – Rosie

+0

Aha, corrigez-moi si je me trompe, mais innerPath lui-même ne peut pas être appelé, mais en créant la méthode getFilePath(), innerPath prend la valeur de innerFilePath les conditions sont satisfaites, et puisque getFilePath() est une méthode publique qui retourne innerFilePath, cette méthode peut être appelée dans d'autres classes. – Rosie

+0

En fait, j'ai une autre question si cela ne vous dérange pas. La méthode que vous avez créée a sorti le filechooser (qui me donnera le chemin de chaîne désiré) de la méthode void, mais en invoquant cette méthode dans une autre classe ouvrira un second filechooser (le premier étant lorsque le bouton load est enfoncé). Est-ce que je peux obtenir juste la valeur de retour de la méthode getFilePath(), de sorte que je puisse employer cette valeur de chaîne résultante dans une autre classe? – Rosie