2016-06-12 4 views
0

Ich entwerfe eine Schnittstelle, in der der Benutzer eine Datei mit der Nummer JFileChooser (initiiert über JButton) auswählen und seinen String-Pfad zur späteren Verwendung in einer Tabelle speichern kann. Mein Code zum Auswählen einer Datei ist in der Klasse TheHandler enthalten, und meine Tabelle befindet sich in der Klasse FilePanel. Ich habe den Wert filePath gerichtet auf tablePath der Klasse FilePanel, so dass ich die Zeichenfolgen in der Tabelle speichern kann.Java - Speichern von String-Pfaden in der Tabelle mit JFileChooser, get set Methoden?

aber mein Problem ist, dass tablePath kehrt null, was ich denke, ist entweder, weil:

1) filePath innerhalb eines void Verfahren enthalten

2) ein Wert tablePath gegeben wird, bevor der Benutzer eine auswählt Datei

oder eine Kombination von 1) und 2). Also meine Frage ist, wie kann ich den Wert filePath extrahieren, so dass es von tablePath genommen werden kann, nachdem der Benutzer eine Datei auswählt?

Ich denke, get und set-Methoden, aber ich habe gerade angefangen, darüber zu lernen, und von Beispielen, die ich angetroffen habe, würde ich denken, dass ich sie innerhalb der actionPerformed(ActionEvent event) Konstruktor verwenden müsste, aber wenn das der Fall ist, ich Ich bin völlig davon überzeugt, wie das geht. Jede Hilfe würde sehr geschätzt werden.

TheHandler Klasse:

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

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

Antwort

1

Ihre TheHandler sind eine Action Klasse schlicht und einfach, und seine Hauptmethode, die außer Kraft gesetzt actionPerformed Methode nur dann, wenn die Komponente aufgerufen wird dass der Handler hinzugefügt wird, sei es ein JButton, JMenuItem oder was auch immer, löst seinen Aufruf aus. Sie scheinen eine Instanz dieser Klasse zu erstellen, aber ich sehe nicht, dass Sie sie zu einer Komponente hinzufügen, die ActionListeners übernimmt. Daher sollte es nicht überraschen, dass ihr einziges Feld, filePath, null bleibt.

Wenn Sie dies auf eine bessere Weise verwenden möchten, dann verwenden Sie es als ein ActionListener soll verwendet werden. Fügen Sie sie zu einem JButton oder JMenuItem hinzu und führen Sie ihre Aktion aus, wenn ein Ereignis vorschreibt, dass die Aktion ausgeführt werden soll. Wenn Sie benachrichtigt werden möchten, dass das filePath-Feld nicht länger null ist, können Sie es mithilfe von SwingPropertyChangeSupport zu einer "gebundenen Eigenschaft" machen.

Option 2 besteht darin, eine Methode zu erstellen, die das "Fleisch" des Codes in TheHandler actionPerformed ausführt, und das einfach bei Bedarf aufrufen. Sie können TheHandler sogar anrufen lassen, damit er einen doppelten Zweck erfüllen kann.

z.B.

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

Dann könnte Ihre anderen Klasse aufrufen direkt getFilePath() Methode des TheHandler.

+0

Oh, ich entschuldige mich, es wurde von meinem Beitrag links, aber ich habe den ActionListener mit einem JButton gekoppelt, um den Prozess einzuleiten: addBtn.addActionListener (neuer TheHandler()); Dies macht aber Sinn, lassen Sie mich sehen, ob ich das wirklich schnell arbeiten kann – Rosie

+0

Aha, also korrigieren Sie mich, wenn ich falsch liege, aber innerPath selbst kann nicht aufgerufen werden, aber durch Erstellen der getFilePath() -Methode nimmt innerPath den Wert von innerFilePath wann Die Bedingungen sind erfüllt, und da getFilePath() eine öffentliche Methode ist, die innerFilePath zurückgibt, kann diese Methode in anderen Klassen aufgerufen werden. – Rosie

+0

Eigentlich habe ich eine andere Frage, wenn es Ihnen nichts ausmacht. Die von Ihnen erstellte Methode hat den Dateichooser (der den gewünschten Zeichenfolgenpfad enthält) aus der Void-Methode herausgenommen, aber das Aufrufen dieser Methode in einer anderen Klasse öffnet einen zweiten Dateichooser (der erste, wenn die Lade-Schaltfläche gedrückt wird). Gibt es eine Möglichkeit, nur den Rückgabewert der getFilePath() -Methode zu erhalten, damit ich den resultierenden String-Wert in einer anderen Klasse verwenden kann? – Rosie

Verwandte Themen