JTree mit diversen JPanels

solsticepan

Grünschnabel
Hallo Leute,

kann mir jemand weiterhelfen.

ich habe einen JTree in einem JApplet mit verschienden TreeNodes und wenn ich diese jetzt auswähle möchte ich das ein anderes Panel erscheint.

public class Umicore extends JApplet {
Container cp = getContentPane() ;



public void init() {
cp = getContentPane() ;


/* in einen ScrollBalken verpacken */
JScrollPane scroll = new JScrollPane(new MyTree() ) ;


cp.add(tree, BorderLayout.CENTER) ;


}

// hier die klasse mit dem JTree
class MyTree extends JPanel {

MyTree() {
setLayout(new BorderLayout() );

DefaultMutableTreeNode root = new DefaultMutableTreeNode("Übersicht");
createNodes(root);
tree = new JTree(root);
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION) ;

tree.addTreeSelectionListener(new TreeSelectionListener() {
public void valueChanged(TreeSelectionEvent e) {
myTreeListener(e);
}
}) ;

JScrollPane scroll = new JScrollPane(tree);
scroll.setPreferredSize(new Dimension(250,750));
add(scroll, BorderLayout.WEST);


}




protected void createNodes(DefaultMutableTreeNode top) {

DefaultMutableTreeNode categorie = new DefaultMutableTreeNode("Kategorien");

DefaultMutableTreeNode abschritte = new DefaultMutableTreeNode("Test");

categorie.add(abschritte);
top.add(categorie);

}


private void myTreeListener(TreeSelectionEvent e) {

DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent() ;

if (node == null ) return ;


if (node.toString().equals("Test")) {

showPanel() ;
}
}

private void showPanel() {

JPanel panel = new JPanel() ;
JLabel label = new JLabel(" TEST TEST TEST ") ;
panel.add(label) ;
super.add(panel, BorderLayout.CENTER) ;
}

}


Wenn ich auf Test klicke wird das panel nicht angezeigt, verändere ich jedoch die größe des applets ( innerhalb des AppletViewers) zeigt es mir das label an.

kann mir jemand helfen

danke im voraus
 
Hallo,

der (Java=Zauber-)Trick ist einen neuen Thread für die GUI aktualisierung zu verwenden. Hatte lange Zeit auch viele ähnliche Probleme. Habe sogar in einem meiner Swingapplikationen einen Label statt einem JLabel verwendet, da die Aktualisierung, Guiänderung garnicht zu sehen war.

Java:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;

import javax.swing.*;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeSelectionModel;

public class Umicore extends JApplet {
	Container cp = getContentPane();

	JTree tree = new JTree();

	public void init() {
		cp = getContentPane();

		/* in einen ScrollBalken verpacken */
		JScrollPane scroll = new JScrollPane(new MyTree());

		cp.add(tree, BorderLayout.CENTER);

	}

	// hier die klasse mit dem JTree
	class MyTree extends JPanel {

		MyTree() {
			setLayout(new BorderLayout());

			DefaultMutableTreeNode root = new DefaultMutableTreeNode(
					"Übersicht");
			createNodes(root);
			tree = new JTree(root);
			tree.getSelectionModel().setSelectionMode(
					TreeSelectionModel.SINGLE_TREE_SELECTION);

			tree.addTreeSelectionListener(new TreeSelectionListener() {
				public void valueChanged(TreeSelectionEvent e) {
					myTreeListener(e);
				}
			});

			JScrollPane scroll = new JScrollPane(tree);
			scroll.setPreferredSize(new Dimension(250, 750));
			add(scroll, BorderLayout.WEST);

		}

		protected void createNodes(DefaultMutableTreeNode top) {

			DefaultMutableTreeNode categorie = new DefaultMutableTreeNode(
					"Kategorien");

			DefaultMutableTreeNode abschritte = new DefaultMutableTreeNode(
					"Test");

			categorie.add(abschritte);
			top.add(categorie);

		}

		private void myTreeListener(TreeSelectionEvent e) {

			DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree
					.getLastSelectedPathComponent();

			if (node == null)
				return;

			if (node.toString().equals("Test")) {

				showPanel();
			}
		}

		private void showPanel() {
			final JPanel panel = new JPanel() ;
			JLabel label = new JLabel(" TEST TEST TEST ") ;
			panel.add(label) ;
			new Thread () {
				public void run() {
					cp.remove(tree);
					cp.add(panel, BorderLayout.CENTER) ;
					cp.repaint();
				}
			}.start();
		}
	}
}


Vg Erdal
 
Hallo Erdal,

vielen dank für deinen Tipp.

Habe auch eine Lösung gefunden die ich dir vielleicht auch vorschlagen kann.

alles wie zuvor bis auf die methode showPanel()

folglich abgeändert.

private JPanel showPanel() {

JPanel panel = new JPanel() ;
JLabel label = new JLabel() ;

panel.add(label) ;

return panel ;

}


dann in der Klasse MyTree

// hier die klasse mit dem JTree
class MyTree extends JPanel {
/*
* Klasse Background die einen schönen Hintergrund erstellt in 3D
*/
Background back = new Background() ;

MyTree() {
setLayout(new BorderLayout());

DefaultMutableTreeNode root = new DefaultMutableTreeNode("Übersicht");
createNodes(root);
tree = new JTree(root);
tree.getSelectionModel().setSelectionMode(
TreeSelectionModel.SINGLE_TREE_SELECTION);

tree.addTreeSelectionListener(new TreeSelectionListener() { public void valueChanged(TreeSelectionEvent e) {
myTreeListener(e);
}
});

JScrollPane scroll = new JScrollPane(tree);
scroll.setPreferredSize(new Dimension(250, 750));
add(scroll, BorderLayout.WEST);
add(back, BorderLayout.CENTER) ;

}

protected void createNodes(DefaultMutableTreeNode top) {
DefaultMutableTreeNode categorie = new DefaultMutableTreeNode("Kategorien");

DefaultMutableTreeNode abschritte = new DefaultMutableTreeNode("Test");

categorie.add(abschritte);
top.add(categorie);

}

private void myTreeListener(TreeSelectionEvent e) {

DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent() ;
if (node == null) return;

if (node.toString().equals("Test")) {

//hier der geänderte Code
/* Entfernt alle Komponenten */
back.removeall() ;

back.add(showPanel() ) ;

/* zeichnet die Komponenten neu */
back.revalidate() ;
}
}




was hälst du davon
wäre Interessant deine Meinung dazu zu hören

danke aber nochmal für den anderen Code

bis die Tage...

solsticepan
 
Hallo solsticepan,

herzlichen Dank, fürs Feedback. Hab in meinem Beispiel das Thread entfernt, validate eingefügt. Siehe da es funkt. Deine Lösung ist besser, so muss man nicht unnötig viel neue Threads erstellen.

Hinweis: Verwende für Code die du hier postest Tags wie [ CODE ][ / CODE ] oder [ JAVA ][ / JAVA ] . Dann kann man es besser lesen, und sieht schön aus.

Code:
		private void showPanel() {
			final JPanel panel = new JPanel() ;
			JLabel label = new JLabel(" TEST TEST TEST ") ;
			panel.add(label) ;
			cp.remove(tree);
			cp.add(panel, BorderLayout.CENTER) ;
			cp.validate();
		}

Vg Erdal
 
Zuletzt bearbeitet:
Zurück