TreeView anstatt Menü
-
Hallo Zusammen,
vielleicht kann mir Jemand mit einem schwierigen (??) Problem helfen. Ich knacke da jetzt schon seit Tagen dran herum und bekomme es nicht gelöst.
Ich habe eine Anwendung, die ein Menü enthält. Bei Auswahl eines Eintrages wird ein Dialog aufgepoppt, in dem dann die jeweilige Verarbeitung stattfindet.
Nun ist mir das aber zu trivial und eigentlich sehen Anwendungen ja auch ganz anders aus. Daher habe ich überlegt eine TreeView zu benutzen, die in den Blättern alle letztendlichen Funktionen enthält. Also praktisch die Umsetzung der Menüstruktur in die Baumstruktur. Das Problem ist jetzt, dass bei Druck auf ein Blatt der entsprechende Frame nicht angezeigt wird. Ich post mal etwas Code ...// TreeSelectionListener hinzufügen tree.addTreeSelectionListener( new TreeSelectionListener() { public void valueChanged(TreeSelectionEvent event) { TreePath tp = event.getNewLeadSelectionPath(); if (tp != null) { System.out.println(" Selektiert: " + tp.toString()); if (tp.toString().equals("[Konto 2003, Dateiverarbeitung, Import von Daten]")) { JDialog imp = new Import(); } if (tp.toString().equals("[Konto 2003, Ausgabe, Anzeige Datensätze]")) { za = new zeigeAuszugsdaten(centerPanel,0,0); System.out.println("Za : " + za); pane.add(za,"East"); za.show(); } if (tp.toString().equals("[Konto 2003, Beenden , Beenden]")) { System.exit(0); } } else { System.out.println(" Kein Element selektiert"); } } } );
Der Dialog "imp" wird angezeigt und man wählt eine Datei aus. Bei der 2. Auswahl handelt es sich um einen neuen Frame, dessen Funktionalität in einer anderen Klasse abgehandelt werden soll, d.h. das Zeichnen und die Verarbeitung der Events findet dort statt. Ich vermute mal, dass hier irgendwelche Referenzen von der Klasse, die die Baumstruktur enthält an die entsprechende Funktionsklasse übergeben werden muss. Die Elemente der Funktionsklasse sollen dann im "Center" der Menüklasse ablaufen. Also alles praktisch in einem Frame.
Ich hoffe, es ist deutlich geworden, was ich tun möchte. Da ich annehme, dass mein Vorhaben nicht so ganz ungewöhnlich ist, nehme ich an, dass Jemand so etwas schon mal gemacht hat!!??!! Kann Jemand mit einem Stückchen Code aushelfen oder vielleicht auch nur mit einem Tip??
Ich danke herzlichst im Voraus!
Gruss
Oliver
-
Hi,
hat da keiner einen Tip? Kann ich mir gar nicht vorstellen.
Wäre schön, wenn noch einer antworten würde? Zumindest, was ich mir für die Lösung des Problems anschauen muss.
Danke vorab
Gruss
Oliver
-
Vielleicht gibst du mal eine Downloadmöglichkeit deines Programmes damit man sich das mal ansehen kann. So kann ich mir ehrlich gesagt nicht vorstellen was konkret das Problem ist.
-
Hallo Cengiz,
danke ersteinmal. Da mein Programm doch sehr umfangreich ist, habe ich ein kleines Testprogramm geschrieben. Dieses sollte im Grunde dasselbe leisten, wie das eigentliche Programm. Also: In einem Borderlayout werden im Westen 3 Button dargestellt. Diese Button sollen jeweils für ein anderes JPanel im Center sorgen. Jedes JPanel im Center sollte durch Drücken eines anderen Button wieder verschwinden und im Center sollte das andere aufgerufene JPanel erscheinen. Also mein Problem ist jetzt, dass zwar die Label (im Moment sind es testweise nur Label) zwar einmalig erscheinen, aber mit Drücken eines anderen Button nun auch wieder gelöscht werden sollen und die jeweils anderen Label sollen dann gezeichnet werden. Für jeden Button (= Programmfunktion) soll eine eigene Klasse programmiert werden (hier test1 und test2). Ich hoffe, es ist so ein bisschen klarer geworden, was ich machen möchte. Ziel ist jetzt das Ganze nicht mit Button zu erstellen, sondern mit einem (Funktions-) Tree.
Hier der Code des Testprogramms:
--------------------------------* @author Oliver * * To change the template for this generated type comment go to * Window>Preferences>Java>Code Generation>Code and Comments */ import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Test extends JFrame implements ActionListener { Test1 test11; Test2 test21; JPanel buttonPanel = new JPanel(); JButton button1 = new JButton("Hallo 1"); JButton button2 = new JButton("Hallo 2"); JButton button3 = new JButton("Hallo 3"); JPanel pane = new JPanel(); public Test() { super("Test"); pane.setLayout(new BorderLayout()); setContentPane(pane); buttonPanel = new JPanel(); buttonPanel.add(button1); buttonPanel.add(button2); buttonPanel.add(button3); button1.addActionListener(this); button2.addActionListener(this); button3.addActionListener(this); pane.add(buttonPanel,"West"); this.setSize(800,600); this.show(); } public void actionPerformed(ActionEvent evt) { Object command = evt.getSource(); if (command == button1) { System.out.println("Hallo 1"); test11 = new Test1(this, "Button 1", "Hallo", "Welt from Button 1"); pane.add(test11,"Center"); setContentPane(pane); pane.setVisible(true); } else if (command == button2) { System.out.println("Hallo 2"); test21 = new Test2(this, "Button 2", "Hallo", "Welt from Button 2"); pane.add(test21,"Center"); setContentPane(pane); pane.setVisible(true); } else { // Hier vielleicht Panel löschen?????? } } public static void main(String[] args) { JFrame frame = new Test(); WindowListener l = new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }; frame.addWindowListener(l); } } // Klasse zu Test1 und Button 1 class Test1 extends JPanel implements ActionListener { Test frame; JLabel label1 = new JLabel(); JLabel label2 = new JLabel(); JLabel label3 = new JLabel(); Test1(Test parent, String l1, String l2, String l3) { frame = parent; add(new JLabel(l1, JLabel.RIGHT)); add(new JLabel(l2, JLabel.RIGHT)); add(new JLabel(l3, JLabel.RIGHT)); } public void actionPerformed(ActionEvent evt) { // leer } } /* * Created on 14.12.2003 * * To change the template for this generated file go to * Window>Preferences>Java>Code Generation>Code and Comments */ /** * @author Oliver * * To change the template for this generated type comment go to * Window>Preferences>Java>Code Generation>Code and Comments */ import java.awt.event.*; import javax.swing.*; class Test2 extends JPanel implements ActionListener { Test frame; JLabel label1 = new JLabel(); JLabel label2 = new JLabel(); JLabel label3 = new JLabel(); Test2(Test parent, String l1, String l2, String l3) { frame = parent; add(new JLabel(l1, JLabel.RIGHT)); add(new JLabel(l2, JLabel.RIGHT)); add(new JLabel(l3, JLabel.RIGHT)); } public void actionPerformed(ActionEvent evt) { // leer } }
Wäre super, wenn Du mir da unter die Arme greifen könntest. Danke schon jetzt!!
Gruss
Oliver
-
Ähh, ich weis nicht ob ich das richtig verstanden habe:
Also durch Drücken von ein paar Knöpfen im Westen soll ein das zentrierte Panel durch ein anderes ersetzt werden und das klappt nicht?
Also ich habe ein Programm, was sowas ähnliches kann und es klappt. Also ich habe´s z.B. so gelöst:
setVisible(false); remove(center); center.remove(output); GridBagLayout gbl = new GridBagLayout(); center.setLayout(gbl); GridBagConstraints gbc; gbc = createGbc(0, 0, 1, 4); gbc.fill = GridBagConstraints.BOTH; gbc.weightx = 100; gbc.weighty = 100; nordWest.add(new JScrollPane(path, JScrollPane.VERTICAL_SCROLLBAR_NEVER, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED)); path.setEditable(false); southNordWest.add(back); southNordWest.add(cont); nordWest.add(southNordWest); back.addActionListener(this); cont.addActionListener(this); west.add("North", nordWest); west.add("Center", files); gbl.setConstraints(west, gbc); center.add(west); gbc = createGbc(1, 0, 3, 4); gbc.fill = GridBagConstraints.BOTH; gbc.weightx = 100; gbc.weighty = 100; gbl.setConstraints(output, gbc); center.add(output); add("Center", center); setSize(800, 600); setVisible(true); first = false;
Nungut, ich weiß nicht ob es das ist was du brauchst und ich weiß auch nicht ob man das Fenster nun unbedingt ersteinmal verstecken muss. Is ja auch egal, vielleicht hilft´s dir. Ich habe eben die Komponente erstmal entfernt und dann bearbeitet und dann klappt´s auch!
-
Hallo Zusammen,
Danke ersteinmal an Pogo für seine Lösung. Ich habe nach einigem Suchen und Probieren nun doch noch die Lösung gefunden, die ich seit Tagen (Wochen??) suche. Also das Zauberwort heisst Invalidate/Validate. Die Klassen Test1 und Test2 werden richtig instanziiert und auch gezeichnet, aber das Center wird nicht neu gezeichnet. Hierzu muss die ContentPane erst "ungültig" gesetzt werden, um dann zum Neuzeichnen auf "gültig" gesetzt zu werden. Dies bewirkt ein Neuzeichnen und das neue Center wird dargestellt. Für Verbesserungsvorschläge zum Code bin ich aber immer offen. Also Abschuss freigegeben.
Anbei dann nochmal der Code:
----------------------------/* * Created on 06.12.2003 * * To change the template for this generated file go to * Window>Preferences>Java>Code Generation>Code and Comments */ /** * @author Oliver * * To change the template for this generated type comment go to * Window>Preferences>Java>Code Generation>Code and Comments */ import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Test extends JFrame implements ActionListener { Test1 test11; Test2 test21; JPanel buttonPanel = new JPanel(); JButton button1 = new JButton("Hallo 1"); JButton button2 = new JButton("Hallo 2"); JButton button3 = new JButton("- Validate -"); JPanel pane = new JPanel(); public Test() { super("Test"); setContentPane(pane); pane.setLayout(new BorderLayout()); buttonPanel = new JPanel(); buttonPanel.add(button1); buttonPanel.add(button2); buttonPanel.add(button3); button1.addActionListener(this); button2.addActionListener(this); button3.addActionListener(this); pane.add(buttonPanel,"West"); this.setSize(800,600); this.show(); } public void actionPerformed(ActionEvent evt) { Object command = evt.getSource(); if (command == button1) { System.out.println("Hallo 1"); test11 = new Test1(this); pane.add(test11,"Center"); pane.invalidate(); } else if (command == button2) { System.out.println("Hallo 2"); test21 = new Test2(this); pane.add(test21,"Center"); pane.invalidate(); } else { pane.validate(); } } public static void main(String[] args) { JFrame frame = new Test(); WindowListener l = new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }; frame.addWindowListener(l); } } /** * @author Oliver * * To change the template for this generated type comment go to * Window>Preferences>Java>Code Generation>Code and Comments */ import java.awt.event.*; import javax.swing.*; class Test1 extends JPanel implements ActionListener { Test frame; JLabel label1 = new JLabel(); JLabel label2 = new JLabel(); JLabel label3 = new JLabel(); JTextField tf1 = new JTextField("Hallo 1"); JTextField tf2 = new JTextField("Hallo 2"); Test1(Test parent ) { frame = parent; label1.setText("Hallo"); label2.setText("Welt "); label3.setText("aus Köln"); add(label1); add(label2); add(label3); add(tf1); add(tf2); } public void actionPerformed(ActionEvent evt) { // leer } } /* * Created on 14.12.2003 * * To change the template for this generated file go to * Window>Preferences>Java>Code Generation>Code and Comments */ /** * @author Oliver * * To change the template for this generated type comment go to * Window>Preferences>Java>Code Generation>Code and Comments */ import java.awt.event.*; import javax.swing.*; class Test2 extends JPanel implements ActionListener { Test frame; JLabel label1 = new JLabel(); JLabel label2 = new JLabel(); JLabel label3 = new JLabel(); JTextField tf1 = new JTextField("Hallo 3"); JTextField tf2 = new JTextField("Hallo 4"); Test2(Test parent) { frame = parent; label1.setText("Hallo"); label2.setText("Welt "); label3.setText("aus Bochum"); add(label1); add(label2); add(label3); add(tf1); add(tf2); } public void actionPerformed(ActionEvent evt) { // leer } }
Vielleicht hilft es Jemand bei der Lösung eines ähnlichen Problems.
Gruss und frohe Weihnachten an Alle in diesem Forum!
Oliver