Kaustobiolith Geschrieben 11. August 2003 Geschrieben 11. August 2003 Hi, ich habe ein JPanel welches bei Betätigung eines Buttons, ein weiteres JPanel öffnet. 1. JPanel ist z.B. Kunde 2. ist z.B. Kunde_bearbeiten Nun möchte ich, wenn ich den Kunden bearbeitet habe, das Kunde_bearbeiten Panel schliessen und in das Kunden Panel zurück kommen. Ein System.exit(0); ist in diesem Falle nicht zu verwenden, da sonst das gesamte Programm geschlossen wird. Kann mir jemand sagen, mit welchem Befehl ich das Kunden_bearbeiten Panel geschlossen bekomme?! Danke für Eure Hilfe Zitieren
Peeter Geschrieben 11. August 2003 Geschrieben 11. August 2003 Kunden_bearbeiten.setVisible(false); Einfach mal die JDoc bemühen. Peet Zitieren
Schledo Geschrieben 11. August 2003 Geschrieben 11. August 2003 Wobei man da noch erwähnen sollte, dass man es damit nicht schließt, sondern lediglich unsichtbar setzt. D.h. das Objekt an sich ist immernoch vorhanden. Zitieren
Kaustobiolith Geschrieben 11. August 2003 Autor Geschrieben 11. August 2003 Original geschrieben von Schledo Wobei man da noch erwähnen sollte, dass man es damit nicht schließt, sondern lediglich unsichtbar setzt. D.h. das Objekt an sich ist immernoch vorhanden. Und genau das soll passieren. Unsichtbar machen hilft mir nicht weiter. Zu dem bekomme ich auch folgende Fehlermeldung bei der Verwendung der Visible-Geschichte: non-static method setVisible(boolean) cannot be referenced from a static context Zitieren
Jaraz Geschrieben 11. August 2003 Geschrieben 11. August 2003 Ja, zum Schließen solltest du es einfach vom Parent Container herunternehmen. Also mit add hast du es einem Parent Container hinzugefügt, mit remove entfernst du es wieder. Gruß Jaraz Zitieren
Jaraz Geschrieben 11. August 2003 Geschrieben 11. August 2003 Original geschrieben von Kaustobiolith Zu dem bekomme ich auch folgende Fehlermeldung bei der Verwendung der Visible-Geschichte: non-static method setVisible(boolean) cannot be referenced from a static context Das liegt daran, dass du nicht objektorientiert programmierst. Das Schlüsselwort static sollte man außer bei der main Methode nur benutzen, wenn man weiß wofür es da ist und nicht um irgendwelche anfänglichen Fehlermeldungen zu umgehen. Gruß Jaraz Zitieren
Kaustobiolith Geschrieben 11. August 2003 Autor Geschrieben 11. August 2003 Ich programmiere fast ausschliesslich unter NATURAL auf dem Grossrechner. Da ist OOP ein Fremdwort Mit JAVA habe ich erst vor ganz kurzem angefangen, daher wäre es nett, Jaraz, wenn Du das mit dem Remove vom Parent Container etwas näher erklären könntest. Momentan gehts bei meinem Programm um folgendes. Ich starte eine DB (hsqlDB), fülle diese mit Daten und lasse die Daten in der GUI ausgeben. Auf der ersten Maske werden die Kunden und ihre einzelnen Angebote angezeigt. Dann kann man den Kunden bei Bedarf editieren. Dies erfolgt auf der zweiten Maske (Kunde_bearbeiten). Und genau die, die zweite Maske bekomm ich einfach nicht über einen Button geschlossen. All die Informationen helfen euch jetzt zwar vermutlich nicht grossartig weiter, aber ich wollts halt mal gesagt haben Ich werde dann mal weiter nach Tutorials ausschau halten, die so ein Problem behandeln. greetz Zitieren
kingofbrain Geschrieben 11. August 2003 Geschrieben 11. August 2003 Servus, was Jaraz sagen wollte, war, das Du Dich erstmal mit den Grundzügen der Objektorientierten Programmierung beschäftigen solltest, bevor Du weiter Java prozedural missbrauchst. [sorry, musste sein, Gruß Jaraz ] Ein ganz gutes Buch, das Java und OOP umreisst, ist http://www.javabuch.de Ansonsten einfach mal googlen, es gibt tonnenweise Material zum Thema. Erst dann solltest Du weitermachen mit Deinem Programm. Es wird nämlich sonst nichts gescheites. Peter Zitieren
Jaraz Geschrieben 11. August 2003 Geschrieben 11. August 2003 Original geschrieben von kingofbrain was Jaraz sagen wollte, war, das Du Dich erstmal mit den Grundzügen der Objektorientierten Programmierung beschäftigen solltest, bevor Du weiter Java prozedural missbrauchst. Nur nicht ganz so hart ausgedrückt. Ich habe mal ein kleines besthendes Beispielprogramm an deine Bedürfnisse angepasst. Achtung es handelt sich um 4 Klassen die jeweils in eine eigene passend benannte Datei müssen, die Package Struktur musst du natürlich auch anlegen. Gruß Jaraz ---------------------------------------------------------- package de.domain.projekt; /* * Main Klasse startet den Frame */ public class Main { public static void main(String[] args) { ProgrammFrame frame = new ProgrammFrame(); } } ---------------------------------------------------------- package de.domain.projekt; import java.awt.*; import java.awt.event.*; import javax.swing.*; /* * ProgrammFrame Klasse * Kümmert sich in diesem Beispiel um die Daten: String kunde (Model) * um die angezeigten Panels. (View) * sowie um die Benutzeraktionen: actionPerformed (Controller) * Im Idealfall, programmiert man für jede Aufgabe min. eine eigene Klasse */ public class ProgrammFrame extends JFrame implements ActionListener{ private EditCustomerPanel editCustomerPanel; private ShowCustomerPanel showCustomerPanel; private Container rootContainer; private String kunde = "Meier"; public ProgrammFrame() { rootContainer = this.getContentPane(); showCustomerPanel = new ShowCustomerPanel(this); rootContainer.add(showCustomerPanel); this.pack(); this.setVisible(true); } public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("speichern")){ kunde = editCustomerPanel.getTextField().getText(); rootContainer.remove(editCustomerPanel); showCustomerPanel = new ShowCustomerPanel(this); rootContainer.add(showCustomerPanel); rootContainer.validate(); } if(e.getActionCommand().equals("bearbeiten")){ rootContainer.remove(showCustomerPanel); editCustomerPanel = new EditCustomerPanel(this); rootContainer.add(editCustomerPanel); rootContainer.validate(); } } public String getKunde() { return kunde; } public void setKunde(String string) { kunde = string; } } ---------------------------------------------------------- package de.domain.projekt; import java.awt.*; import javax.swing.*; public class ShowCustomerPanel extends JPanel { private JButton bearbeitenButton= new JButton("bearbeiten"); private JLabel kundeLabel = new JLabel(); public ShowCustomerPanel(ProgrammFrame mvc){ kundeLabel.setText(mvc.getKunde()); this.add(kundeLabel); bearbeitenButton.addActionListener(mvc); this.add(bearbeitenButton); } public JLabel getKundeLabel() { return kundeLabel; } public void setKundeLabel(JLabel label) { kundeLabel = label; } ---------------------------------------------------------- package de.domain.projekt; import java.awt.*; import javax.swing.*; public class EditCustomerPanel extends JPanel { private JTextField textField = new JTextField(); private JButton speichernButton= new JButton("speichern"); public EditCustomerPanel(ProgrammFrame mvc){ textField.setText(mvc.getKunde()); speichernButton.addActionListener(mvc); this.add(textField); this.add(speichernButton); } public JTextField getTextField() { return textField; } public void setTextField(JTextField field) { textField = field; } } ---------------------------------------------------------- Zitieren
kingofbrain Geschrieben 11. August 2003 Geschrieben 11. August 2003 Servus nochmal, hart wollte ich nicht sein. Ich wollte nur sagen, dass der Sinn von Java die objektorientierte Verwendung ist. Aber stellt Euch eine gemalte Blume neben meinem Satz vor. Peter Zitieren
chepro Geschrieben 12. August 2003 Geschrieben 12. August 2003 setVisble(false) ist falsch, da es dann noch speicher belegt. wenn das panel auf einem JFrame liegt, nimm frame.dispose(); damit ist das panel nicht mehr sichtbar, aus dem speicher und die anwendung läuft noch. Zitieren
Jaraz Geschrieben 12. August 2003 Geschrieben 12. August 2003 Original geschrieben von chepro panel.dispose(); dispose() ist keine API Funktion von JPanel sondern von java.awt.Window oder Dialog und deren Subclasses. Gruß Jaraz Zitieren
Peeter Geschrieben 12. August 2003 Geschrieben 12. August 2003 Original geschrieben von chepro setVisble(false) ist völlig falsch, da es dann noch speicher belegt. nimm panel.dispose(); damit ist das panel nicht mehr sichtbar, aus dem speicher und die anwendung läuft noch. Aber so wie ich das verstanden habe will er jedes mal wenn er einen Kunden bearbeitet hat dieses Panel neu aufbauen und wieder schließen. Warum baut er dann nicht das Panel nur ein mal und ändert durch set-Methoden die enstsprechenden Felder/Stellen und macht es nach der Bearbeitung "unsichtbar". Ist doch viel performanter als wenn er jedes mal das Panel neu aufbaut und wieder komplett schließt. Peet Zitieren
chepro Geschrieben 12. August 2003 Geschrieben 12. August 2003 e.getActionCommand().equals("bearbeiten") ist aber leichtsinnig. was ist, wenn mehrere buttons "bearbeiten" als aufschrift haben? Zitieren
Jaraz Geschrieben 12. August 2003 Geschrieben 12. August 2003 Original geschrieben von chepro ist aber leichtsinnig. was ist, wenn mehrere buttons "bearbeiten" als aufschrift haben? Ich wußte das das kommt. Hallo, es ist ein Beispiel. Sicher erstelle ich auch Zugriffsmethoden auf die Buttons und frage direkt die Source der Action ab, aber ich wollte nicht mehr als nötig reinpacken. Wie schon geschrieben würde ich die eine Klasse auch in min. 3 aufteilen und zusätzlich remove überschreiben und von Hand alle Listener abmelden, da ich mit Listenern im JDK schlechte Erfahrungen gemacht habe, aber wie gesagt würde das über das Ziel, Panels auszutauschen hinaus gehen. Gruß Jaraz Zitieren
Kaustobiolith Geschrieben 12. August 2003 Autor Geschrieben 12. August 2003 Erstmal danke für die Hilfe, auch wenn ich zu Beginn gedacht habe, dass man ein Programmiergott sein muss um hier Fragen stellen zu dürfen. Jeder hat schliesslich mal angefangen und wenn man vom Grossrechner kommt, wirds nicht grad einfacher. Ich habs jetzt übrigens so gelöst: ((JFrame) SwingUtilities.getRoot(this)).dispose(); Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.