# JTree Plus Minus ausblenden



## jorgeHX (13. Dezember 2004)

Moin,
kann man in einem JTree die Plus und Minussymbole ausblenden, so dass man nur noch per Klick auf die Einträge im Tree den Baum aufklappen und schließen kann?

Ich finde einfach keine Lösung...


----------



## Thomas Darimont (13. Dezember 2004)

Hallo!

Versuchs mal so:

```
/*
 * Created on 13.12.2004@17:30:21
 *
 * TODO Explain me ...
 */
package de.tutorials;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.plaf.basic.BasicTreeUI;
import javax.swing.tree.DefaultTreeCellRenderer;

/**
 * @author Darimont
 *  
 */
public class JTreeExample extends JFrame {

	public JTreeExample() {
		super("JTreeExample");
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		JTree tree = new JTree();
		DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer() {
			{
				setLeafIcon(new ImageIcon("c:/leafIcon.jpg"));
				setOpenIcon(new ImageIcon("c:/openIcon.jpg"));
				setClosedIcon(new ImageIcon("c:/closeIcon.jpg"));
			}
		};

		BasicTreeUI ui = (BasicTreeUI) tree.getUI();
		ui.setCollapsedIcon(new ImageIcon("c:/collapsedIcon.jpg"));
		ui.setExpandedIcon(new ImageIcon("c:/expandedIcon.jpg"));

		tree.setCellRenderer(renderer);

		add(new JScrollPane(tree));

		pack();
		setVisible(true);
	}

	public static void main(String[] args) {
		new JTreeExample();
	}
}
```

Gruß Tom


----------



## jorgeHX (13. Dezember 2004)

Moin Tom,
den DefaultTreeCellRenderer hatte ich schon überschrieben, um so wie du neue Icons einzufügen. Allerdings bleibt auch dann noch die Möglichkeit, durch Klick auf die Symbole vor meinem Icon den Baum zu öffnen...

Als Beispiel nehme ich die Hilfe im Paint-Programm von Microsoft....
Vielleicht schaust du dir das kurz an, wenn meine Erklärung nicht deutlich ist...
Danke


----------



## Thomas Darimont (13. Dezember 2004)

Hallo!

Dann versuchs mal so:

```
/*
 * Created on 13.12.2004@17:30:21
 *
 * TODO Explain me ...
 */
package de.tutorials;

import java.lang.reflect.Field;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.plaf.basic.BasicTreeUI;
import javax.swing.tree.DefaultTreeCellRenderer;

/**
 * @author Darimont
 *  
 */
public class JTreeExample extends JFrame {

	public JTreeExample() {
		super("JTreeExample");
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		JTree tree = new JTree();
		DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer() {
			{
				setLeafIcon(new ImageIcon("c:/leafIcon.jpg"));
				setOpenIcon(new ImageIcon("c:/openIcon.jpg"));
				setClosedIcon(new ImageIcon("c:/closeIcon.jpg"));
			}
		};

		BasicTreeUI ui = (BasicTreeUI) tree.getUI();
		try {
			Field fld = BasicTreeUI.class.getDeclaredField("paintLines");
			fld.setAccessible(true);
			fld.set(ui, Boolean.FALSE);
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}

		//ui.setCollapsedIcon(new ImageIcon("c:/collapsedIcon.jpg"));
		//ui.setExpandedIcon(new ImageIcon("c:/expandedIcon.jpg"));
		ui.setExpandedIcon(null);
		ui.setCollapsedIcon(null);

		tree.setCellRenderer(renderer);

		add(new JScrollPane(tree));

		pack();
		setVisible(true);
	}

	public static void main(String[] args) {
		new JTreeExample();
	}
}
```

Gruß Tom


----------



## jorgeHX (13. Dezember 2004)

sehr cool, 
danke


----------



## jorgeHX (13. Dezember 2004)

Sorry,
aber was macht die Zeile:

Field fld = BasicTreeUI.class.getDeclaredField("paintLines")

?

Und für was steht "paintLines"


----------



## Thomas Darimont (13. Dezember 2004)

Hallo!

Damit besorge ich mir über das Reflection API das als protected in BasicTreeUI definierte Feld paintLines welches steuert, ob die "Baum-Linien" im Jtree gezeichnet werden. Zu diese Feld gibt es leider keine set Methode weshalb ich diesen "Umweg" gehen muss...

Gruß Tom


----------



## jorgeHX (13. Dezember 2004)

mmh,
bei mir kommt da immer eine "java.lang.NoSuchFieldException"

Liegt das daran, dass ich einen eigenen TreeCellRenderer habe?


----------



## Thomas Darimont (13. Dezember 2004)

Hallo!

Eigentlich nicht. die vom JTree verwendete UI Klasse müsste dann immernoch von BasicTreeUI abgeleitet sein... kann es vielleicht sein, dass du eine ältere Java Version als ich (1.5.0) verwendest...? Vielleicht gab's "damals" das Feld noch nicht...

Gruß Tom


----------



## jorgeHX (13. Dezember 2004)

Hey,
du hast Recht, jetzt sind sie weg. Allerdings reagieren sie immernoch auf einen Klick...
Kann man das noch ausstellen?


----------

