JTree Plus Minus ausblenden

jorgeHX

Erfahrenes Mitglied
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...
 
Hallo!

Versuchs mal so:
Code:
/*
 * 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
 

Anhänge

  • icons.zip
    icons.zip
    3,5 KB · Aufrufe: 216
  • treeTest.JPG
    treeTest.JPG
    11,7 KB · Aufrufe: 1.179
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
 
Hallo!

Dann versuchs mal so:
Code:
/*
 * 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
 

Anhänge

  • treeTest1.JPG
    treeTest1.JPG
    9,6 KB · Aufrufe: 521
Sorry,
aber was macht die Zeile:

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

?

Und für was steht "paintLines"
 
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
 
mmh,
bei mir kommt da immer eine "java.lang.NoSuchFieldException"

Liegt das daran, dass ich einen eigenen TreeCellRenderer habe?
 
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
 
Hey,
du hast Recht, jetzt sind sie weg. Allerdings reagieren sie immernoch auf einen Klick...
Kann man das noch ausstellen?
 
Zurück