Java JTree als Navigation für JPanels. JPanels werden nicht "upgedatet".

Sapor2211

Cadet 4th Year
Registriert
Dez. 2013
Beiträge
82
Hallo CB Forum User,

Ich programmiere momentan ein kleines Ticket Tool für unser Unternehmen.
Nichts wildes, lediglich verschiedene Panels (Bereiche) mit Auswahlmöglichkeiten über RadioButton und kleinen Kommentar/Usernamen-Feldern, die dann als E-Mail formatiert und versendet werden.

Zu Mir: JavaAnfänger nur als gelegentliches Hobby, komme aus der SPS Programmierung :cool_alt::cool_alt:

Aufbau: Ein JSplitPane | Links ein JTree als Navigation, Rechts die JPanels.

Problem:
Wenn Links auf ein den Pfad des JTree´s geklickt wird, sollen JPanels der Rechte Seite "upgedatet" werden.
Momentan wird immer das CloudPanel(panelheader) aufgerufen. Allerdings sollte sich der Headername immer ändern.

Über den TreeSelectionListener lasse ich mir den Pfad als String zurückgeben. Diesen verwende ich momentan nur um den Headernamen des CloudPanels ändern zu lassen. Dieser bleibt aber wie bei der Initialisierung auf "Start" (Bild1)

Der Pfad String ändert sich auch. Gebe ich zu Testzwecken immer gerne über die Konsole aus. Bild2


Ich gehe davon aus, das ich hier (SplittPane.java) etwas ändern muss. Leider bin ich momentan ratlos was... Und es liegt nicht an der jetzigen Uhrzeit ;) ich versuche es schon seid Tagen.

Code:
//Update Panel
	static void updateLabel(String updateSelectNode) {
		panelheader = updateSelectNode;
		cp = new CloudPanel(panelheader);
		System.out.println(panelheader);
	}

Achso: Ja CardLayout ist mir ein Begriff, finde ich aber Optisch nicht hübsch. Eine Navigation ist da schon eleganter.

Bilder:

Bild1.pngBild2.png


SourceCode:
-----------------------------------------------------------------------------------------------------------------------
MainWindow.java
Code:
public class MainWindow {

	private JFrame frame;
	public String UsernameGlobal = null;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					MainWindow window = new MainWindow();
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public MainWindow() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {

		// ########### Set Frame ####################
		String Username = System.getProperty("user.name"); // Hole aktuellen
															// Windows User

		UsernameGlobal = Username;
		frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setResizable(false);
		frame.getContentPane().setBackground(Color.WHITE);
		frame.getContentPane().setLayout(null);
		frame.setIconImage(
				Toolkit.getDefaultToolkit().getImage(MainWindow.class.getResource("/mainframetool/icon/logo.png")));
		frame.setTitle("Operating Ticket Tool " + Username);
		frame.setBounds(100, 100, 600, 470);
		// ######## Set Frame Ende #####################

		//Erstelle Horizontales SplittPane (Links JTree als Navigation, Rechts JPanels
		SplittPane splitt = new SplittPane();
		frame.getContentPane().add(splitt.getSplitPane());
		

		
	}
}

SplittPane.java
Code:
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;

public class SplittPane extends JPanel {

	private static JSplitPane splitPane;
	private static JPanel cp;
	private static String panelheader = "Start";

	public SplittPane() {
		setLayout(null);

		// Panel Rechts
		cp = new CloudPanel(panelheader);

		// Navi Links
		MenuNavigation menu = new MenuNavigation();

		// Erzeuge Horizontal SplitPane mit JTreeNavigation Links und Panels
		// Rechts
		splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, menu, cp);
		splitPane.setDividerSize(1);
		splitPane.setDividerLocation(120);
		splitPane.setBounds(0, 0, 600, 470);
		splitPane.setOneTouchExpandable(true);
		updateLabel(panelheader);

	}
	//Für MainWindow.java
	public JSplitPane getSplitPane() {
		return splitPane;
	}
	
	//Update Panel
	static void updateLabel(String updateSelectNode) {
		panelheader = updateSelectNode;
		cp = new CloudPanel(panelheader);
		System.out.println(panelheader);
	}
}

// Auswertung welcher String aus dem JTree (MenuNavigation.java) angeklickt wurden ist.
class SelectionListener implements TreeSelectionListener {

	public void valueChanged(TreeSelectionEvent se) {

		JTree tree = (JTree) se.getSource();
		DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
		String selectedNodeName = selectedNode.toString();
		if (selectedNode.isLeaf()) {

			MenuNavigation.GetIntSelection = NaviStringSelection.NaviStringSelectionListener(selectedNodeName);
			System.out.println(MenuNavigation.GetIntSelection);
			SplittPane.updateLabel(selectedNodeName);

		}
	}
}

CloudPanel.java
Code:
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JSeparator;
import javax.swing.JSplitPane;
import javax.swing.JTextPane;
import java.awt.SystemColor;
import java.awt.Font;

public class CloudPanel extends JPanel {
	
	private JTextField textField_cloud;
	
	public CloudPanel(String panel) {
		setLayout(null);
		
		JRadioButton rdbtn_cloud = new JRadioButton("New radio button");
		rdbtn_cloud.setFont(new Font("Tahoma", Font.BOLD, 11));
		rdbtn_cloud.setBounds(132, 89, 188, 23);
		add(rdbtn_cloud);
		
		JRadioButton rdbtn_cloud2 = new JRadioButton("New radio button");
		rdbtn_cloud2.setFont(new Font("Tahoma", Font.BOLD, 11));
		rdbtn_cloud2.setBounds(132, 115, 188, 23);
		add(rdbtn_cloud2);
		
		JRadioButton rdbtn_cloud3 = new JRadioButton("New radio button");
		rdbtn_cloud3.setFont(new Font("Tahoma", Font.BOLD, 11));
		rdbtn_cloud3.setBounds(132, 141, 188, 23);
		add(rdbtn_cloud3);
		
		JRadioButton rdbtn_cloud4 = new JRadioButton("New radio button");
		rdbtn_cloud4.setFont(new Font("Tahoma", Font.BOLD, 11));
		rdbtn_cloud4.setBounds(132, 167, 188, 23);
		add(rdbtn_cloud4);
		
		textField_cloud = new JTextField("");
		textField_cloud.setBounds(132, 62, 188, 20);
		add(textField_cloud);
		textField_cloud.setColumns(10);
		
		JButton btn_cloud = new JButton("Ticket erstellen");
		btn_cloud.setBounds(132, 246, 188, 23);
		add(btn_cloud);
		
		JSeparator separator = new JSeparator();
		separator.setBounds(10, 233, 430, 2);
		add(separator);
		
		JRadioButton rdbtn_cloud_loc1 = new JRadioButton("Wob2");
		rdbtn_cloud_loc1.setFont(new Font("Tahoma", Font.BOLD, 11));
		rdbtn_cloud_loc1.setBounds(10, 203, 109, 23);
		add(rdbtn_cloud_loc1);
		
		JRadioButton rdbtn_cloud_loc2 = new JRadioButton("MB");
		rdbtn_cloud_loc2.setFont(new Font("Tahoma", Font.BOLD, 11));
		rdbtn_cloud_loc2.setBounds(132, 203, 109, 23);
		add(rdbtn_cloud_loc2);
		
		JTextPane txtpnUserprojekt = new JTextPane();
		txtpnUserprojekt.setEditable(false);
		txtpnUserprojekt.setFont(new Font("Tahoma", Font.BOLD, 11));
		txtpnUserprojekt.setBackground(SystemColor.control);
		txtpnUserprojekt.setText("User/Projekt:");
		txtpnUserprojekt.setBounds(10, 62, 109, 20);
		add(txtpnUserprojekt);
		
		JTextPane txtpnCloud = new JTextPane();
		txtpnCloud.setEditable(false);
		txtpnCloud.setText(panel);
		txtpnCloud.setBackground(SystemColor.control);
		txtpnCloud.setBounds(132, 11, 188, 23);
		add(txtpnCloud);
	}
	
}

MenuNavigation.java

Code:
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeSelectionModel;
import javax.swing.tree.DefaultMutableTreeNode;
import java.awt.BorderLayout;
import java.util.ArrayList;
import java.awt.Font;
import java.awt.Color;

public class MenuNavigation extends JPanel {
	
	public static int GetIntSelection=1;

	public MenuNavigation() {
		setBackground(Color.WHITE);
		setLayout(new BorderLayout(0, 0));
		// Erstelle JTree Navigation
		JTree tree = new JTree();
		tree.setFont(new Font("Tahoma", Font.BOLD, 11));
		//String Array
		final ArrayList<String> MainframeNav = new ArrayList<String>();
		MainframeNav.add("Mainframe");
		MainframeNav.add("IMS");
		MainframeNav.add("RVS");
		MainframeNav.add("DB2");
		MainframeNav.add("Anwalt");
		MainframeNav.add("Drucker");
		MainframeNav.add("Zutritte");

		final ArrayList<String> AllgemeinNav = new ArrayList<String>();
		AllgemeinNav.add("Allgemein");
		AllgemeinNav.add("Empty1");
		AllgemeinNav.add("Empty2");

		final ArrayList<String> CloudNavi = new ArrayList<String>();
		CloudNavi.add("Cloud");
		CloudNavi.add("IaaS");
		CloudNavi.add("PaaS");
		CloudNavi.add("IDP");
		CloudNavi.add("UPS");
		CloudNavi.add("Allgemein");

		// Erstelle 3 Nodes/Unterordner, zähle Anzahl der Strings aus dem Array(ArrayList Mainframe/Allg/Cloud) und füge
		// jeden String den Node hinzu
		DefaultMutableTreeNode obj = new DefaultMutableTreeNode("Menu") {
			{
				DefaultMutableTreeNode node_1;
				DefaultMutableTreeNode node_2;
				DefaultMutableTreeNode node_3;
				node_1 = new DefaultMutableTreeNode(AllgemeinNav.get(0));
				for (int i = 1; i < AllgemeinNav.size(); i++) {
					node_1.add(new DefaultMutableTreeNode(AllgemeinNav.get(i)));
				}

				add(node_1);
				node_2 = new DefaultMutableTreeNode(MainframeNav.get(0));
				for (int i = 1; i < MainframeNav.size(); i++) {
					node_2.add(new DefaultMutableTreeNode(MainframeNav.get(i)));
				}

				add(node_2);
				node_3 = new DefaultMutableTreeNode(CloudNavi.get(0));
				for (int i = 1; i < CloudNavi.size(); i++) {
					node_3.add(new DefaultMutableTreeNode(CloudNavi.get(i)));
				}
				add(node_3);
			}
		};
		tree.setModel(new DefaultTreeModel(obj));
		add(tree, BorderLayout.WEST);

		// Methode ob eine Zeile ausgewählt wurde.Auswertung welcher String in
		// SelectionListener
		tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
		tree.addTreeSelectionListener(new SelectionListener());

	}

}

NaviStringSelection.java kann man ausser Acht lassen. Dort werden die Strings nur über ein Switch einem Int zugeordnet.
 
Hallo,

ich glaube in deine updateLabel(...)-Methode hat sich ein Logikfehler eingeschlichen. Du weist hier der Variable cp ein neues Objekt zu (neuer Speicherbereich). Dein Splitpane kennt allerdings nur dein "altes" cp (zeigt auf einen anderen Speicherbereich). Du musst also die rechte Komponente im Splitpane neu setzten, wenn du sie austauschen möchtest. Eventuell muss der Bereich dann noch mit repaint() und revalidate() neu gezeichnet werden.

Code:
    	static void updateLabel(String updateSelectNode) {
    		panelheader = updateSelectNode;
    		cp = new CloudPanel(panelheader);
                
                splitPane.setRightComponent(cp); //Angenommen splitpane ist nicht null
    		
                System.out.println(panelheader);
    	}

Hinweis: Ich habe den Code nicht getestet. Irrtümer vorbehalten. :schaf:

Allgemeiner Hinweis: Anstatt statische Mehtoden und Variablen zu verwenden, ist es ratsam lieber mit Instanzen zu arbeiten, denn in deinem Fall kannst du nur eine Instanz geleichzeitig von deinem Splitpane sinnvoll verwenden. Stichwort: Wiederverwendbarkeit von Code.
 
Schonmal Danke, werde ich demnäst ausprobieren. Momentan kein Zugriff.

Allgemeiner Hinweis: Anstatt statische Mehtoden und Variablen zu verwenden, ist es ratsam lieber mit Instanzen zu arbeiten, denn in deinem Fall kannst du nur eine Instanz geleichzeitig von deinem Splitpane sinnvoll verwenden. Stichwort: Wiederverwendbarkeit von Code.

Kannst du mir da bitte ein kongretes Beispiel? Variablen ok, aber was meinst du mit Instanzen statt statischen Methoden?

Danke
 
Im Fall deiner Splitpane-Klasse brauchst du keine statischen Methoden und damit musst du auch keine Zustände in statischen Variablen speichern. Stattdessen rufe die updateLabel(...)-Methode einfach auf dem Objekt (also deiner Instanz) von Splitpane auf, welches du im Kontext der inneren Klasse sowieso kennst:

Code:
    import javax.swing.JPanel;
    import javax.swing.JSplitPane;
    import javax.swing.JTree;
    import javax.swing.event.TreeSelectionEvent;
    import javax.swing.event.TreeSelectionListener;
    import javax.swing.tree.DefaultMutableTreeNode;
     
    public class SplittPane extends JPanel {
     
        // Instanzvariablen statt statische Variablen:
    	private JSplitPane splitPane;
    	private JPanel cp;
    	private String panelheader = "Start";
     
    	public SplittPane() {
    		setLayout(null);
     
    		// Panel Rechts
    		cp = new CloudPanel(panelheader);
     
    		// Navi Links
    		MenuNavigation menu = new MenuNavigation();
     
    		// Erzeuge Horizontal SplitPane mit JTreeNavigation Links und Panels
    		// Rechts
    		splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, menu, cp);
    		splitPane.setDividerSize(1);
    		splitPane.setDividerLocation(120);
    		splitPane.setBounds(0, 0, 600, 470);
    		splitPane.setOneTouchExpandable(true);
    		updateLabel(panelheader);
     
    	}
    	//Für MainWindow.java
    	public JSplitPane getSplitPane() {
    		return splitPane;
    	}
    	
    	//Update Panel
    	void updateLabel(String updateSelectNode) {
    		panelheader = updateSelectNode;
    		cp = new CloudPanel(panelheader);
                splitPane.setRightComponent(cp);
    		System.out.println(panelheader);
    	}
    }
     
    // Auswertung welcher String aus dem JTree (MenuNavigation.java) angeklickt wurden ist.
    class SelectionListener implements TreeSelectionListener {
     
    	public void valueChanged(TreeSelectionEvent se) {
     
    		JTree tree = (JTree) se.getSource();
    		DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
    		String selectedNodeName = selectedNode.toString();
    		if (selectedNode.isLeaf()) {
     
    			MenuNavigation.GetIntSelection = NaviStringSelection.NaviStringSelectionListener(selectedNodeName);
    			System.out.println(MenuNavigation.GetIntSelection);

    			updateLabel(selectedNodeName); //alternativ: SplittPane.this.updateLabel(...);
    		}
    	}
    }

Durch den Verzicht auf die statischen Variablen und Methoden in der Klasse Splitpane, könnte dein Programm in zwei verschiedenen Fenstern/Panels dein Splitpane anzeigen. Dabei ließen sich die beiden Splitpanes unabhängig voneinander bedienen[1]. Mit deiner statischen Variante würden die beiden Splitpanes jedoch immer das selbe anzeigen, wären also "synchronisiert".

[1] Vorausgesetzt in der MenuNavigation-Klasse verzichtest du auch auf die statische Variable, um Nebeneffekten vorzubeugen.

Hinweis: Bei deiner updateLabel(...)-Methode hast du keinen Sichtbarkeitsmodifikator (private oder public) angegeben. Damit ist die Methode "package-private" und kann somit nur innerhalb des gleichen Packages aufgerufen werden. Für dich macht das allerdings keinen Unterschied, da du bei keiner deiner Klassen ein Package angegeben hast. Um Namenskonflikten vorzubeugen, ist es jedoch immer ratsam ein Package zu definieren. Siehe dazu: https://docs.oracle.com/javase/tutorial/java/package/index.html

Anmerkung: Der Code in der Antwort ist ungetestet. :schaf:
 
So r4lly danke erstmal ;)

Code:
	//Update Panel
	 public static void updateLabel(String updateSelectNode) {
		panelheader = updateSelectNode;
		cp = new CloudPanel(panelheader);
		splitPane.setRightComponent(cp);
		System.out.println(panelheader);
	}
So funktioniert es ;)

Wenn ich allerdings die "static" Methoden entferne bekomme ich folgende Fehlermeldungen
Code:
// Auswertung welcher String aus dem JTree (MenuNavigation.java) angeklickt wurden ist.
class SelectionListener implements TreeSelectionListener {

	public void valueChanged(TreeSelectionEvent se) {

		JTree tree = (JTree) se.getSource();
		DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
		String selectedNodeName = selectedNode.toString();
		if (selectedNode.isLeaf()) {

			MenuNavigation.GetIntSelection = NaviStringSelection.NaviStringSelectionListener(selectedNodeName);
			System.out.println(MenuNavigation.GetIntSelection);
			updateLabel(selectedNodeName);  //The method updateLabel(String) is undefined for the type SelectionListener
			SplittPane.this.updateLabel(selectedNodeName); //No enclosing instance of the type SplittPane is accessible in scope

		}
	}

}

1: //The method updateLabel(String) is undefined for the type << Create method, allerdings in der Selectionlistener Claas. Bringt mir nichts.
2: // //No enclosing instance of the type SplittPane is accessible in scope << Laut Goolge Static einbauen ;)

Wie gesagt bin noch nicht ganz drin in der Java Theorie.
 
Ups, scheinbar habe ich deinen Code etwas zu flüchtig überflogen. Für mich sah es so aus, als ob dein Listener eine Inner-Class von SplitPane ist. Im Falle einer separaten Klasse ist natürlich klar, dass Java damit nichts anfangen kann.

Als Lösungsvorschlag habe ich deinen Listener als innere Klasse vom SplitPane implementiert. Dazu habe ich auch Anpassungen an der MenuNavigation vornehmen müssen.

Splitpane.java:
Code:
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;

public class SplittPane extends JPanel {

    private JSplitPane splitPane;
    private JPanel cp;
    private String panelheader = "Start";

    public SplittPane() {
        setLayout(null);

        // Panel Rechts
        cp = new CloudPanel(panelheader);

        // Navi Links
        MenuNavigation menu = new MenuNavigation();

        // Erzeuge Horizontal SplitPane mit JTreeNavigation Links und Panels
        // Rechts
        splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, menu, cp);
        splitPane.setDividerSize(1);
        splitPane.setDividerLocation(120);
        splitPane.setBounds(0, 0, 600, 470);
        splitPane.setOneTouchExpandable(true);
        updateLabel(panelheader);

        // set Listener for Menu
        menu.addTreeSelectionListener(new SplittPane.SelectionListener());
    }

    //Für MainWindow.java
    public JSplitPane getSplitPane() {
        return splitPane;
    }

    //Update Panel
    void updateLabel(String updateSelectNode) {
        panelheader = updateSelectNode;
        cp = new CloudPanel(panelheader);

        int dividerLocation = splitPane.getDividerLocation();
        splitPane.setRightComponent(cp);
        splitPane.setDividerLocation(dividerLocation);

        System.out.println(panelheader);
    }

    // Auswertung welcher String aus dem JTree (MenuNavigation.java) angeklickt wurden ist.
    private class SelectionListener implements TreeSelectionListener {

        public void valueChanged(TreeSelectionEvent se) {

            JTree tree = (JTree) se.getSource();
            DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
            String selectedNodeName = selectedNode.toString();
            if (selectedNode.isLeaf()) {

                MenuNavigation.GetIntSelection = NaviStringSelection.NaviStringSelectionListener(selectedNodeName);
                System.out.println(MenuNavigation.GetIntSelection);
                updateLabel(selectedNodeName);
            }
        }
    }
}

MenuNavigation.java:
Code:
import javax.swing.JPanel;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeSelectionModel;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.util.ArrayList;

public class MenuNavigation extends JPanel {

    public static int GetIntSelection = 1;
//neu
    public JTree tree;

    public MenuNavigation() {
        setBackground(Color.WHITE);
        setLayout(new BorderLayout(0, 0));
        // Erstelle JTree Navigation
        tree = new JTree();
        tree.setFont(new Font("Tahoma", Font.BOLD, 11));
        //String Array
        final ArrayList<String> MainframeNav = new ArrayList<String>();
        MainframeNav.add("Mainframe");
        MainframeNav.add("IMS");
        MainframeNav.add("RVS");
        MainframeNav.add("DB2");
        MainframeNav.add("Anwalt");
        MainframeNav.add("Drucker");
        MainframeNav.add("Zutritte");

        final ArrayList<String> AllgemeinNav = new ArrayList<String>();
        AllgemeinNav.add("Allgemein");
        AllgemeinNav.add("Empty1");
        AllgemeinNav.add("Empty2");

        final ArrayList<String> CloudNavi = new ArrayList<String>();
        CloudNavi.add("Cloud");
        CloudNavi.add("IaaS");
        CloudNavi.add("PaaS");
        CloudNavi.add("IDP");
        CloudNavi.add("UPS");
        CloudNavi.add("Allgemein");

        // Erstelle 3 Nodes/Unterordner, zähle Anzahl der Strings aus dem Array(ArrayList Mainframe/Allg/Cloud) und füge
        // jeden String den Node hinzu
        DefaultMutableTreeNode obj = new DefaultMutableTreeNode("Menu") {
            {
                DefaultMutableTreeNode node_1;
                DefaultMutableTreeNode node_2;
                DefaultMutableTreeNode node_3;
                node_1 = new DefaultMutableTreeNode(AllgemeinNav.get(0));
                for (int i = 1; i < AllgemeinNav.size(); i++) {
                    node_1.add(new DefaultMutableTreeNode(AllgemeinNav.get(i)));
                }

                add(node_1);
                node_2 = new DefaultMutableTreeNode(MainframeNav.get(0));
                for (int i = 1; i < MainframeNav.size(); i++) {
                    node_2.add(new DefaultMutableTreeNode(MainframeNav.get(i)));
                }

                add(node_2);
                node_3 = new DefaultMutableTreeNode(CloudNavi.get(0));
                for (int i = 1; i < CloudNavi.size(); i++) {
                    node_3.add(new DefaultMutableTreeNode(CloudNavi.get(i)));
                }
                add(node_3);
            }
        };

        tree.setModel(new DefaultTreeModel(obj));
        add(tree, BorderLayout.WEST);
        tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
        
// Listener erst im Splitpane setzen!
// tree.addTreeSelectionListener(new SelectionListener());
    }

//neu
    public void addTreeSelectionListener(TreeSelectionListener listener) {
        tree.addTreeSelectionListener(listener);
    }

//neu
    public void removeTreeSelectionListener(TreeSelectionListener listener) {
        tree.removeTreeSelectionListener(listener);
    }
}

Alternativ kann man den Listener auch als normale Klasse implementieren, muss dann allerdings die Referenzen auf die Objekte im Konstruktor mit übergeben, auf die man Zugriff benötigt.
 
Zurück
Oben