Hir ist mein Code die Methode wäre private void defineActionBeenden() nur mach ich wohlt etwas falsch bekommen nur ein exception ich vermute ich hatte falsche variable benutzt. Vieleicht hilft das etwas besser zu verstehen. Bei bedarf kann ich auch noch andere Klassen hinzufügen. Zeile ca 274
Aus platzgründen habe ich die codes von ein paar buttens entfernt.
Braucht man den ein referenz auf die besagten Klassen der Fenster oder neue Variable?
public class Main extends JFrame {
private static int topInset;
private Action actAddKat, actAddDoc, actCopy, actCut, actPaste, actDelete,
actRename, actEnd;
private JTextField jtfStatus;
private JTextArea jtaBeschreibung;
private Knoten[] knotenCache = null;
/* ***** Popup-Menüs ***** */
private JPopupMenu popupJTreeDokumentSelektion;
private JPopupMenu popupJTreeMehrfachSelektion;
private JPopupMenu popupJTreeKatalogSelektion;
private void addEventHandlers() {
jTree.addMouseListener(new JTreeMouseListener());
// hier können weitere Listener angemeldet werden
jTree.addTreeSelectionListener(new JTreeSelectionListener());
}
private class JTreeMouseListener extends MouseAdapter {
private TreePath clickedNodePath;
private int selectedRow;
@Override
public void mousePressed(MouseEvent me) {
// Row-Auswertung
int selectedRow = jTree.getRowForLocation(me.getX(), me.getY());
if (me.getComponent() == jTree && selectedRow != -1) {
// Path-Auswertung
clickedNodePath = jTree
.getPathForLocation(me.getX(), me.getY());
Knoten knoten = (Knoten) clickedNodePath.getLastPathComponent();
// 2-fach Klick feststellen,
// Kataloge ausschließen:
if (me.getClickCount() == 2 && !knoten.getAllowsChildren())
((Dokument) knoten).dokumentAusgeben();
this.checkMouseRight(me);
// weiterleiten
} else {
// Selektion bei Klick daneben aufheben:
jTree.removeSelectionPaths(jTree.getSelectionPaths());
// und auch die Instanzvariable löschen
clickedNodePath = null;
}
}
// (fett-Stellungen dienen der Übersicht):
@Override
public void mouseReleased(MouseEvent me) {
if (selectedRow != -1)
this.checkMouseRight(me); // weiterleiten
}
private void checkMouseRight(MouseEvent me) {
if (me.isPopupTrigger() // rechte Maustaste
&& selectedRow != -1) {
TreePath[] selectedPaths = jTree.getSelectionPaths();
if (selectedPaths != null) {
if (!clickedNodePathInSelectedTreePaths(clickedNodePath,
selectedPaths) || selectedPaths.length == 1) { // s.
// Hinweis
// clickedNodePath nicht in selectedPaths:
jTree.setSelectionPath(clickedNodePath);
//popupJTreeDokumentSelektion.show(me.getComponent(),me.getX(), me.getY());
this.katalogOrDokument(me);
} else {
// clickedNodePath in selectedPaths:
//popupJTreeMehrfachSelektion.show(me.getComponent(),me.getX(), me.getY());
this.katalogOrDokument(me);
}
} else {
// keine selectedPaths
jTree.setSelectionPath(clickedNodePath);
popupJTreeDokumentSelektion.show(me.getComponent(),
me.getX(), me.getY());
}
}
}
private void katalogOrDokument(MouseEvent me){
if
((Knoten)clickedNodePath.getLastPathComponent()
instanceof Katalog)popupJTreeKatalogSelektion.show(me.getComponent(), me.getX(), me.getY());
else
popupJTreeDokumentSelektion.show(me.getComponent(), me.getX(), me.getY());
}
private boolean clickedNodePathInSelectedTreePaths(
TreePath clickedNodePath, TreePath[] selectedPaths) {
for (TreePath path : selectedPaths) {
if (path.equals(clickedNodePath))
return true;
}
return false;
}
}
// neue innere Klasse:
private class JTreeSelectionListener implements TreeSelectionListener {
public void valueChanged(TreeSelectionEvent tse) {
DefaultMutableTreeNode lastNode = (DefaultMutableTreeNode) jTree
.getLastSelectedPathComponent();
if (lastNode == null)
return;
if (lastNode instanceof Dokument) {
jtaBeschreibung
.setText(((Dokument) lastNode).getBeschreibung());
}
}
}
public static int getTopInset() {
return topInset;
}
// GUI-Objekte
private JTree jTree;
// Model-Objekte
private DefaultTreeModel treeModel;
private Katalog topLevelKatalog;
private IOVerwaltung ioVerwaltung;
public Main() {
super("Medienverwaltung");
createMenus();
addAusgabebereich();
popupJTreeKatalogSelektion = new JPopupMenu("Operationen auf einem Katalog");
popupJTreeKatalogSelektion.add(actCopy);
popupJTreeKatalogSelektion.add(actCut);
popupJTreeKatalogSelektion.add(actPaste);
popupJTreeKatalogSelektion.add(actDelete);
popupJTreeKatalogSelektion.add(actRename);
}
/**
* Erst mal nur für Tests: feste Verdrahtung auf ein einzulesendes
* Verzeichnis.
*
* @param args
* keine Verarbeitung von Aufrufparametern
*/
public static void main(String[] args) {
Main app = new Main();
String filePath = Konstanten.DEFAULT_PATH;
app.initializeApplication(filePath);
app.durchsucheKatalog();
}
/**
* Initialisiert die Anwendung – im weiteren Ausbau: GUI, EventHandler,
* Menüs, PopupMenüs usw.
*
* @param filePath
* Startpfad auf das Dateisystem, kann auch null sein.
*/
private void initializeApplication(String filePath) {
ioVerwaltung = new IOVerwaltung();
this.setSize(Konstanten.GUI_DIMENSION);
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent we) {
System.exit(0);
}
});
topLevelKatalog = new Katalog("TopLevelKatalog");
treeModel = new DefaultTreeModel(topLevelKatalog);
treeModel.setAsksAllowsChildren(true);
if (filePath != null) {
ioVerwaltung.baumEinlesen(topLevelKatalog, filePath);
}
jTree = new JTree(treeModel);
jTree.getSelectionModel().setSelectionMode(
TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
jTree.setEditable(true);
JScrollPane jScrollPane = new JScrollPane(jTree);
this.add(jScrollPane, BorderLayout.CENTER);
this.setVisible(true);
topInset = this.getInsets().top;
this.addEventHandlers();
this.createPopupMenus();
}
private void durchsucheKatalog() {
Katalog katalog = topLevelKatalog;
if (katalog != null) {
BufferedReader reader = new BufferedReader(new InputStreamReader(
System.in));
String inputString = null;
try {
System.out.println("Bitte Dateinamen eingeben "
+ "(Abbruch mit \"end\")>");
while (((inputString = reader.readLine()) != null)
&& (!inputString.equals("end"))) {
Dokument doc = katalog.sucheDokument(inputString);
if (doc != null) {
doc.dokumentAusgeben();
System.out.println("Ausgabe von \"" + inputString
+ "\"");
} else
System.out
.println("Kein Dokument mit " + "dem Namen \""
+ inputString + "\" gefunden.");
}
} catch (IOException ioe) {
System.out.println("Fehler beim Einlesen - " + ioe.toString());
}
System.exit(0);
}
}
private void createMenus() {
JMenuBar menuBar = new JMenuBar();
/* ********** Menü: Kataloge verwalten ********** */
JMenu menuVerwalten = new JMenu("Kataloge verwalten");
JMenuItem jmiEinlesen = getJmiKatalogEinlesen();
menuVerwalten.add(jmiEinlesen);
JMenuItem jmiLaden = getJmiKatalogLaden();
menuVerwalten.add(jmiLaden);
menuVerwalten.addSeparator();
JMenuItem jmiSaveAs = getJmiSpeichernUnter();
menuVerwalten.add(jmiSaveAs);
JMenuItem jmiSave = getJmiSpeichern();
menuVerwalten.add(jmiSave);
menuVerwalten.addSeparator();
defineActionKatalogErgänzen();
menuVerwalten.add(actAddKat);
defineActionDokumentErgänzen();
menuVerwalten.add(actAddDoc);
JMenuItem jmiSuchen = getJmiDokumentSuchen();
menuVerwalten.add(jmiSuchen);
/* ********** Menü: Knoten bearbeiten ********** */
JMenu menuBearbeiten = new JMenu("Knoten bearbeiten");
defineActionKopieren();
menuBearbeiten.add(actCopy);
defineActionAusschneiden();
menuBearbeiten.add(actCut);
defineActionEinfügen();
actPaste.setEnabled(false);
menuBearbeiten.add(actPaste);
defineActionLöschen();
menuBearbeiten.add(actDelete);
defineActionKnotennameÄndern();
menuBearbeiten.add(actRename);
/* ********** Menü: Operationen ********** */
JMenu menuOperationen = new JMenu("Operationen");
defineActionBeenden();
menuOperationen.add(actEnd);
/* ********** Zusammenbau ********** */
menuBar.add(menuVerwalten);
menuBar.add(menuBearbeiten);
menuBar.add(menuOperationen);
this.setJMenuBar(menuBar);
}
private void defineActionBeenden() {
actEnd = new AbstractAction("Alle Fenster Schließen") {
public void actionPerformed(ActionEvent e) {
System.out.println("Alle Fenster geschlossen");
}
};
}
// getJmiXxx-Methoden
private JMenuItem getJmiDokumentSuchen() {
JMenuItem jmiSuchen = new JMenuItem("Dokument suchen...");
jmiSuchen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("\"Dokument suchen ...\" gewählt");
}
});
return jmiSuchen;
}
private JMenuItem getJmiSpeichern() {
JMenuItem jmiSave = new JMenuItem("Speichern");
jmiSave.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("\"Speichern ...\" gewählt");
}
});
return jmiSave;
}
private JMenuItem getJmiSpeichernUnter() {
JMenuItem jmiSaveAs = new JMenuItem("Speichern unter...");
jmiSaveAs.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JFileChooser fileChooser = new JFileChooser(
Konstanten.DEFAULT_PATH);
fileChooser.setDialogTitle("Datei zum Serialisieren festlegen");
int returnValue = fileChooser.showSaveDialog(Main.this);
if (returnValue == JFileChooser.APPROVE_OPTION) {
File file = fileChooser.getSelectedFile();
ioVerwaltung.serialize((Knoten) treeModel.getRoot(), file);
jtfStatus.setText("Katalog unter \"" + file.getName()
+ "\" gespeichert");
} else
jtfStatus.setText("Speichern abgebrochen");
}
});
return jmiSaveAs;
}
private JMenuItem getJmiKatalogLaden() {
JMenuItem jmiLaden = new JMenuItem("Katalog laden...");
jmiLaden.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JFileChooser fileChooser = new JFileChooser(".");
fileChooser.setDialogTitle("Serialisierungsdatei auswählen");
int returnValue = fileChooser.showOpenDialog(Main.this);
if (returnValue == JFileChooser.APPROVE_OPTION) {
File file = fileChooser.getSelectedFile();
Knoten temp = ioVerwaltung.deserialize(file);
if (temp == null)
jtfStatus.setText("Der Katalog \"" + returnValue
+ "\" konnte nicht geladen werden.");
else {
treeModel.setRoot(temp);
jtfStatus.setText("Katalog aus \"" + file.getName()
+ "\" geladen.");
}
} else
jtfStatus.setText("\"Katalog laden\" abgebrochen");
}
});
return jmiLaden;
}
private JMenuItem getJmiKatalogEinlesen() {
JMenuItem jmiEinlesen = new JMenuItem("Katalog einlesen...");
jmiEinlesen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
knotenCache = getSelectedNodes();
if (knotenCache != null && knotenCache.length == 1
&& knotenCache[0] instanceof Katalog) {
JFileChooser fileChooser = new JFileChooser(".");
fileChooser.setDialogTitle("Ordner zum Einlesen in \""
+ knotenCache[0].getName() + "\" auswählen");
fileChooser
.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int returnValue = fileChooser.showOpenDialog(Main.this);
if (returnValue == JFileChooser.APPROVE_OPTION) {
String returnString = fileChooser.getSelectedFile()
.getAbsolutePath();
// casting ist oben geprüft!
ioVerwaltung.baumEinlesen((Katalog) knotenCache[0],
returnString);
// ganz wichtig: das TreeModel informieren
treeModel.reload(knotenCache[0]);
// und gleich den Zielordner expandieren
jTree.expandPath(new TreePath(knotenCache[0].getPath()));
jtfStatus.setText("Dateisystem eingelesen");
}
} else
jtfStatus.setText("Vor dem Einlesen muss ein "
+ " Katalog ausgewählt werden!");
}
});
return jmiEinlesen;
}
// defineActionXxx-Methoden
private void defineActionKnotennameÄndern() {
actRename = new AbstractAction("Knotenname ändern") {
public void actionPerformed(ActionEvent e) {
knotenCache = getSelectedNodes();
// nur e i n Knoten darf selektiert sein:
if (knotenCache != null && knotenCache.length == 1) {
String nodeType = null;
if (knotenCache[0] instanceof Katalog)
nodeType = "Katalog \"";
else
nodeType = "Dokument \"";
String returnString = JOptionPane.showInputDialog(
Main.this, nodeType + knotenCache[0].getName()
+ "\" umbenennen:", "Neuer Knotenname",
JOptionPane.PLAIN_MESSAGE);
// hier die returnString-Verarbeitung ergänzen
if (returnString == null)
jtfStatus.setText("Dialog abgebrochen");
else if (returnString.equals(""))
jtfStatus.setText("OK ohne Eingabe");
else if (returnString.length() > 0) {
knotenCache[0].setName(returnString);
}
} else
jtfStatus.setText("Bitte zunächst einen Knoten "
+ "auswählen.");
}
};
}
private void defineActionLöschen() {
actDelete = new AbstractAction("Löschen") {
public void actionPerformed(ActionEvent e) {
knotenCache = getSelectedNodes().clone();
knotenCache = null;
// zunächst selektierte Knoten ermitteln:
knotenCache = getSelectedNodes();
String message = "";
if (knotenCache.length == 1)
message = "Soll der ausgewählte Knoten "
+ "wirklich gelöscht werden?";
else
message = "Sollen die ausgewählten Knoten wirklich "
+ "gelöscht werden?";
int returnValue = JOptionPane.showConfirmDialog(jTree, message,
"Löschen bestätigen", JOptionPane.OK_CANCEL_OPTION);
// Löschen abhängig vom Rückgabewert:
if (returnValue == JOptionPane.OK_OPTION) {
// ... vorhandene Implementierung
Knoten parent = (Knoten) knotenCache[0].getParent();
if (parent != null)
System.out.println("parent von "
+ knotenCache[0].getName() + " ist: "
+ parent.getName());
else
System.out.println("parent von "
+ knotenCache[0].getName() + " ist null");
}
actPaste.setEnabled(false);
}
};
}
private void defineActionEinfügen() {
actPaste = new AbstractAction("Einfügen") {
public void actionPerformed(ActionEvent e) {
Knoten[] temp = getSelectedNodes(); // Zielordner
if (temp != null) {
if (temp.length == 1 && temp[0] instanceof Katalog) {
for (Knoten cacheNode : knotenCache)
// sortiert einfügen:
treeModel.insertNodeInto(cacheNode, temp[0],
((Katalog) temp[0])
.getInsertIndexFor(cacheNode));
// und gleich den Zielordner expandieren:
jTree.expandPath(new TreePath(temp[0].getPath()));
jtfStatus.setText("Knoten eingefügt");
} else
jtfStatus.setText("Als Ziel ist nur e i n Knoten "
+ "vom Typ \"Katalog\" zulässig!");
} else
jtfStatus.setText("Kein Katalog zum einfügen "
+ "ausgewählt");
}
};
}
private void defineActionKopieren() {
actCopy = new AbstractAction("Kopieren") {
public void actionPerformed(ActionEvent e) {
Knoten[] knotenArray = getSelectedNodes();
// NullPointerException bei fehlender
// Auswahl vermeiden:
if (knotenArray != null && knotenArray.length > 0) {
knotenCache = cloneKnotenArray(knotenArray);
actPaste.setEnabled(true);
jtfStatus.setText("Knoten kopiert");
} else {
jtfStatus.setText("Bitte zunächst eine Auswahl treffen");
}
}
};
}
private void defineActionKatalogErgänzen() {
actAddKat = new AbstractAction("Katalog ergänzen...") {
public void actionPerformed(ActionEvent e) {
knotenCache = getSelectedNodes();
if (knotenCache != null && knotenCache.length == 1
&& knotenCache[0] instanceof Katalog) {
String returnString = JOptionPane.showInputDialog(
Main.this,
"Katalog zu \"" + knotenCache[0].getName()
+ "\" ergänzen:", "Neuer Katalogname",
JOptionPane.PLAIN_MESSAGE);
if (returnString == null)
jtfStatus
.setText("Dialog abgebrochen: " + returnString);
else if (returnString.equals(""))
jtfStatus.setText("keine Eingabe");
else if (returnString.length() > 0) {
Katalog katalog = new Katalog(returnString);
// auch hier sortiert einfügen:
treeModel.insertNodeInto(katalog, knotenCache[0],
((Katalog) knotenCache[0])
.getInsertIndexFor(katalog));
jtfStatus.setText("Katalog \"" + returnString
+ "\" ergänzt");
}
} else {
jtfStatus.setText("Ein Katalog kann nur zu "
+ "e i n e m ausgewählten Katalog "
+ "ergänzt werden.");
}
}
};
}
private void addAusgabebereich() {
jtaBeschreibung = new JTextArea("Dies ist ein Probetext ");
jtaBeschreibung.setBorder(BorderFactory
.createBevelBorder(BevelBorder.LOWERED));
jtaBeschreibung.setLineWrap(true);
JScrollPane jspAusgabe = new JScrollPane(jtaBeschreibung);
jtfStatus = new JTextField();
jtfStatus.setForeground(Color.WHITE);
jtfStatus.setBackground(Color.DARK_GRAY);
jtfStatus.setEditable(false);
JPanel jpanelAusgabe = new JPanel(new BorderLayout());
jpanelAusgabe.setPreferredSize(new Dimension(this.getSize().width, 85));
jpanelAusgabe.add(jspAusgabe, BorderLayout.CENTER);
jpanelAusgabe.add(jtfStatus, BorderLayout.SOUTH);
this.getContentPane().add(jpanelAusgabe, BorderLayout.SOUTH);
}
/**
* Ermittelt die selektierten Knoten im JTree.
*
* @return ein Knoten-Array, ermittelt aus einem TreePath-Array
*/
private Knoten[] getSelectedNodes() {
TreePath[] treePaths = jTree.getSelectionPaths();
if (treePaths == null) {
jtfStatus.setText("Zunächst einen Knoten auswählen!");
return null;
}
int treePathsLength = treePaths.length;
Knoten[] returnArray = new Knoten[treePathsLength];
for (int i = 0; i < treePathsLength; i++)
returnArray** = (Knoten) treePaths**.getLastPathComponent();
return returnArray;
}
private Knoten[] cloneKnotenArray(DefaultMutableTreeNode[] nodeArray) {
Knoten[] returnArray = new Knoten[nodeArray.length];
for (int i = 0; i < nodeArray.length; i++)
returnArray** = (Knoten) nodeArray**.clone();
return returnArray;
}
/**
* Erstellt alle Popup-Menüs, die von der Anwendung
* unterstützt werden.
*/
private void createPopupMenus() {
popupJTreeDokumentSelektion = new JPopupMenu(
"Operationen auf einem Dokument");
popupJTreeDokumentSelektion.add(actCopy);
popupJTreeDokumentSelektion.add(actCut);
popupJTreeDokumentSelektion.add(actDelete);
popupJTreeDokumentSelektion.add(actRename);
// Ohne Einfügen bei Operation auf Dokument!
popupJTreeMehrfachSelektion = new JPopupMenu(
"Operationen auf mehreren Knoten");
popupJTreeMehrfachSelektion.add(actCopy);
popupJTreeMehrfachSelektion.add(actCut);
popupJTreeMehrfachSelektion.add(actDelete);
// ohne Umbenennen und Einfügen bei Mehrfachselektion!
}
}