Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben
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
Geschrieben

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

Geschrieben
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

Geschrieben

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

Geschrieben

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.

blume.gif[sorry, musste sein, Gruß Jaraz :D ]

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

Geschrieben
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;

  }

}

----------------------------------------------------------

Geschrieben

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.

Geschrieben
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

Geschrieben
Original geschrieben von chepro

ist aber leichtsinnig. was ist, wenn mehrere buttons "bearbeiten" als aufschrift haben?

Ich wußte das das kommt. :rolleyes:

Hallo, es ist ein Beispiel. ;):D

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

Geschrieben

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();

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...