Hallo zusammen.
Wie der Titel schon vermuten lässt, bin ich gerade dabei, mir die JTree Komponente ein wenig an meine Bedürfnisse anzupassen. Leider habe ich damit momentan noch größte Schwierigkeiten (u.a. weil ich das zum ersten Mal mache) und hoffe, jemand ist so nett mir bei dem ein oder anderen Problem zu helfen.
Folgendes soll am Ende rauskommen:
Ich schreibe gerade ein Programm welches vom Layout (und später auch von der Funktionalität) her dem Windows Update von Microsoft ähnlich sein soll.
Es gibt also einen Baum und dort sind alle verfügbaren Updates als Einträge aufgeführt. Jeder Eintrag hat ein kleines Icon, rechts daneben einen Text (den Namen des Updates) und daneben rechts noch einen Button, mit welchem das Update zu einer Liste (die hier nicht weiter wichtig ist) hinzugefügt werden soll.
Wenn man den Eintrag aufklappt, dann erscheint als Child-Node eine kleine Beschreibung.
Zu diesem Zweck habe ich nun also den Standard-Renderer für den JTree durch meinen eigenen ersetzt, und auf den ersten Blick sah das Ergebnis dann auch schonmal gar nicht so schlecht aus. Leider steckt der Teufel im Detail und es ist mir nicht gelungen, auch diese letzte Unschönheiten noch zu beseitigen. Vor allen Dingen zwei Sachen stören:
(1) Ich würde die Hinzufügen Buttons gerne am rechten Rand des Trees ausrichten, so dass sie alle untereinander stehen. Momentan sieht das nämlich nicht so toll aus:
Leider weiss ich nicht so recht, wie ich das Bewerkstelligen kann...
(2) Das zweite Problem ist noch viel schlimmer. Zum Anzeigen der Beschreibung nutze ich eine JTextArea. Leider sieht das Ding nach dem Aufklappen der Node folgendermaßen aus:
Zum einen nimmt die TextArea also nicht den gesamten horizontalen Platz ein, der zur Verfügung steht, sondern zwängt sich in die linke Ecke.
Zum anderen scheint es da einen Fehler mit den Scroll-Bars zu geben, denn diese funktionieren leider nicht. Normalerweise muss man dafür doch nicht einen extra Listener implementieren, oder?
Und last but not least stimmt irgendwas mit der horizontalen Größe nicht. Ich hätte ja erwartet, dass alle JTextArea-Controls in etwa die gleiche Höhe haben, aber wie man auf dem Bild sieht, ist das nichtmal im Ansatz der Fall.
Ich wäre sehr froh, wenn mir jemand bei einigen dieser Probleme weiterhelfen könnte. Sorry, falls das recht triviale Fragen sein sollten, allerdings mache ich das wie gesagt zum ersten Mal und ich sitze nun schon seit einiger Zeit ratlos davor.
Hier der Quellcode für den Renderer:
Danke schonmal für alle Vorschläge, Hinweise, Hilfestellungen etc....
m.a.k.
P.S.: Bevor ich es vergesse: Vielleicht wäre jemand noch so nett mir einen Tipp zu geben, wie ich am besten die Listener für die Buttons implementieren könnte? Da habe ich nämlich bisher noch gar keine Idee zu.
Wie der Titel schon vermuten lässt, bin ich gerade dabei, mir die JTree Komponente ein wenig an meine Bedürfnisse anzupassen. Leider habe ich damit momentan noch größte Schwierigkeiten (u.a. weil ich das zum ersten Mal mache) und hoffe, jemand ist so nett mir bei dem ein oder anderen Problem zu helfen.
Folgendes soll am Ende rauskommen:
Ich schreibe gerade ein Programm welches vom Layout (und später auch von der Funktionalität) her dem Windows Update von Microsoft ähnlich sein soll.
Es gibt also einen Baum und dort sind alle verfügbaren Updates als Einträge aufgeführt. Jeder Eintrag hat ein kleines Icon, rechts daneben einen Text (den Namen des Updates) und daneben rechts noch einen Button, mit welchem das Update zu einer Liste (die hier nicht weiter wichtig ist) hinzugefügt werden soll.
Wenn man den Eintrag aufklappt, dann erscheint als Child-Node eine kleine Beschreibung.
Zu diesem Zweck habe ich nun also den Standard-Renderer für den JTree durch meinen eigenen ersetzt, und auf den ersten Blick sah das Ergebnis dann auch schonmal gar nicht so schlecht aus. Leider steckt der Teufel im Detail und es ist mir nicht gelungen, auch diese letzte Unschönheiten noch zu beseitigen. Vor allen Dingen zwei Sachen stören:
(1) Ich würde die Hinzufügen Buttons gerne am rechten Rand des Trees ausrichten, so dass sie alle untereinander stehen. Momentan sieht das nämlich nicht so toll aus:
Leider weiss ich nicht so recht, wie ich das Bewerkstelligen kann...
(2) Das zweite Problem ist noch viel schlimmer. Zum Anzeigen der Beschreibung nutze ich eine JTextArea. Leider sieht das Ding nach dem Aufklappen der Node folgendermaßen aus:
Zum einen nimmt die TextArea also nicht den gesamten horizontalen Platz ein, der zur Verfügung steht, sondern zwängt sich in die linke Ecke.
Zum anderen scheint es da einen Fehler mit den Scroll-Bars zu geben, denn diese funktionieren leider nicht. Normalerweise muss man dafür doch nicht einen extra Listener implementieren, oder?
Und last but not least stimmt irgendwas mit der horizontalen Größe nicht. Ich hätte ja erwartet, dass alle JTextArea-Controls in etwa die gleiche Höhe haben, aber wie man auf dem Bild sieht, ist das nichtmal im Ansatz der Fall.
Ich wäre sehr froh, wenn mir jemand bei einigen dieser Probleme weiterhelfen könnte. Sorry, falls das recht triviale Fragen sein sollten, allerdings mache ich das wie gesagt zum ersten Mal und ich sitze nun schon seit einiger Zeit ratlos davor.
Hier der Quellcode für den Renderer:
Code:
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTree;
import javax.swing.tree.TreeCellRenderer;
class TreeRenderer implements TreeCellRenderer
{
JPanel pnlNode;
JButton btnPriority;
JLabel lblTitle;
JButton btnAddRemove;
JPanel pnlLeaf;
JTextArea txtDescription;
public TreeRenderer()
{
GridBagLayout gblNode = new GridBagLayout();
GridBagLayout gblLeaf = new GridBagLayout();
GridBagConstraints gbc = new GridBagConstraints();
//panel for the nodes
pnlNode = new JPanel(gblNode);
btnPriority = new JButton();
lblTitle = new JLabel();
btnAddRemove = new JButton();
//priority icon
gbc.gridx = 0;
gbc.gridy = 0;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.weightx = 0;
gbc.weighty = 0;
gbc.anchor = GridBagConstraints.WEST;
gbc.fill = GridBagConstraints.NONE;
gbc.insets = new Insets(0, 10, 0, 10);
gblNode.setConstraints(btnPriority, gbc);
//title
gbc.gridx = 1;
gbc.gridy = 0;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.weightx = 1;
gbc.weighty = 1;
gbc.anchor = GridBagConstraints.CENTER;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.insets = new Insets(0, 10, 0, 10);
gblNode.setConstraints(lblTitle, gbc);
//add / remove button
gbc.gridx = 2;
gbc.gridy = 0;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.weightx = 0;
gbc.weighty = 0;
gbc.anchor = GridBagConstraints.EAST;
gbc.fill = GridBagConstraints.NONE;
gbc.insets = new Insets(0, 10, 0, 10);
gblNode.setConstraints(btnAddRemove, gbc);
pnlNode.add(btnPriority);
pnlNode.add(lblTitle);
pnlNode.add(btnAddRemove);
//panel for the leafs
pnlLeaf = new JPanel(gblLeaf);
txtDescription = new JTextArea();
txtDescription.setLineWrap(true);
JScrollPane scrollDescription = new JScrollPane(txtDescription);
//description
gbc.gridx = 0;
gbc.gridy = 0;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.weightx = 1;
gbc.weighty = 1;
gbc.anchor = GridBagConstraints.CENTER;
gbc.fill = GridBagConstraints.BOTH;
gbc.insets = new Insets(10, 10, 10, 10);
gblLeaf.setConstraints(scrollDescription, gbc);
pnlLeaf.add(scrollDescription);
}
public Component getTreeCellRendererComponent(JTree Tree, Object Value, boolean bSelected, boolean bExpanded,
boolean bIsLeaf, int nRow, boolean bHasFocus)
{
if(bIsLeaf)
{
txtDescription.setText(Value.toString());
return pnlLeaf;
}
else
{
lblTitle.setText(Value.toString());
btnAddRemove.setText("Hinzufügen");
return pnlNode;
}
}
}
Danke schonmal für alle Vorschläge, Hinweise, Hilfestellungen etc....
m.a.k.
P.S.: Bevor ich es vergesse: Vielleicht wäre jemand noch so nett mir einen Tipp zu geben, wie ich am besten die Listener für die Buttons implementieren könnte? Da habe ich nämlich bisher noch gar keine Idee zu.