P
Patneu
Gast
Hallo,
ich bin momentan ein klein wenig verwirrt. Ich schreibe gerade ein kleines Programm, dass unter anderem ein Fenster erzeugen soll, das sieht momentan so aus:
[JAVA=229]class Eingabefenster extends JFrame implements ActionListener
{
String seite;
JPanel kopfPanel;
JPanel klassePanel;
JPanel schiffPanel;
JPanel partikelAngriffPanel;
JPanel energieAngriffPanel;
JPanel schildePanel;
JPanel panzerPanel;
JPanel antriebPanel;
JPanel hitpointsPanel;
JPanel anzahlPanel;
JPanel fehlerPanel;
JPanel hinzufügenPanel;
JLabel kopfLabel;
JLabel klasseLabel;
JLabel schiffLabel;
JLabel partikelAngriffLabel;
JLabel energieAngriffLabel;
JLabel schildeLabel;
JLabel panzerLabel;
JLabel antriebLabel;
JLabel hitpointsLabel;
JLabel anzahlLabel;
JLabel fehlerLabel;
JComboBox klasseListe;
JComboBox schiffListe;
JTextField partikelAngriffTextField;
JTextField energieAngriffTextField;
JTextField schildeTextField;
JTextField panzerTextField;
JTextField antriebTextField;
JTextField hitpointsTextField;
JTextField anzahlTextField;
JButton hinzufügenButton;
public Eingabefenster(String titel)
{
super(titel);
seite = titel;
setLayout(new FlowLayout());
kopfPanel = new JPanel();
kopfLabel = new JLabel("Bitte Werte und Anzahl des/der Schiffs/Schiffe eingeben!");
kopfPanel.add(kopfLabel);
add(kopfPanel);
klassePanel = new JPanel();
klasseLabel = new JLabel("Klasse: ");
klasseLabel.setPreferredSize(new Dimension(70, 20));
String[] klasseStrings = new String[9];
klasseStrings[0] = "<Bitte auswählen!>";
klasseStrings[1] = "Stahlchassis";
klasseStrings[2] = "Titanidchassis";
klasseStrings[3] = "Freedom-Class (Menschen)";
klasseStrings[4] = "Hellfire-Chassis (Ti-Roc)";
klasseStrings[5] = "Prallfeldgenerator (Tradoner)";
klasseStrings[6] = "Hyperiums-Class (Beraluten)";
klasseStrings[7] = "Shelloptress-Class (Myrianer)";
klasseStrings[8] = "Turtle Technik (Se'ze Lux)";
klasseListe = new JComboBox(klasseStrings);
klasseListe.setEditable(false);
klasseListe.setSelectedItem(0);
klasseListe.addActionListener(this);
klasseListe.setActionCommand("klasse");
klassePanel.add(klasseLabel, BorderLayout.CENTER);
klassePanel.add(klasseListe, BorderLayout.LINE_END);
add(klassePanel);
schiffPanel = new JPanel();
schiffLabel = new JLabel("Schiff: ");
schiffLabel.setPreferredSize(new Dimension(130, 20));
String[] schiffStrings = new String[7];
schiffStrings[0] = "<Bitte auswählen!>";
schiffListe = new JComboBox(schiffStrings);
schiffListe.setEditable(false);
schiffListe.setSelectedItem(0);
schiffListe.setEnabled(false);
schiffListe.addActionListener(this);
schiffListe.setActionCommand("schiff");
schiffPanel.add(schiffLabel, BorderLayout.CENTER);
schiffPanel.add(schiffListe, BorderLayout.LINE_END);
add(schiffPanel);
partikelAngriffPanel = new JPanel();
partikelAngriffLabel = new JLabel("Partikel-Angriff: ");
partikelAngriffLabel.setPreferredSize(new Dimension(100, 20));
partikelAngriffTextField = new JTextField(15);
partikelAngriffTextField.setEditable(false);
partikelAngriffPanel.add(partikelAngriffLabel, BorderLayout.CENTER);
partikelAngriffPanel.add(partikelAngriffTextField, BorderLayout.LINE_END);
add(partikelAngriffPanel);
energieAngriffPanel = new JPanel();
energieAngriffLabel = new JLabel("Energie-Angriff: ");
energieAngriffLabel.setPreferredSize(new Dimension(100, 20));
energieAngriffTextField = new JTextField(15);
energieAngriffTextField.setEditable(false);
energieAngriffPanel.add(energieAngriffLabel, BorderLayout.CENTER);
energieAngriffPanel.add(energieAngriffTextField, BorderLayout.LINE_END);
add(energieAngriffPanel);
schildePanel = new JPanel();
schildeLabel = new JLabel("Schilde: ");
schildeLabel.setPreferredSize(new Dimension(100, 20));
schildeTextField = new JTextField(15);
schildeTextField.setEditable(false);
schildePanel.add(schildeLabel, BorderLayout.CENTER);
schildePanel.add(schildeTextField, BorderLayout.LINE_END);
add(schildePanel);
panzerPanel = new JPanel();
panzerLabel = new JLabel("Panzer: ");
panzerLabel.setPreferredSize(new Dimension(100, 20));
panzerTextField = new JTextField(15);
panzerTextField.setEditable(false);
panzerPanel.add(panzerLabel, BorderLayout.CENTER);
panzerPanel.add(panzerTextField, BorderLayout.LINE_END);
add(panzerPanel);
antriebPanel = new JPanel();
antriebLabel = new JLabel("Antrieb: ");
antriebLabel.setPreferredSize(new Dimension(100, 20));
antriebTextField = new JTextField(15);
antriebTextField.setEditable(false);
antriebPanel.add(antriebLabel, BorderLayout.CENTER);
antriebPanel.add(antriebTextField, BorderLayout.LINE_END);
add(antriebPanel);
hitpointsPanel = new JPanel();
hitpointsLabel = new JLabel("Hitpoints: ");
hitpointsLabel.setPreferredSize(new Dimension(100, 20));
hitpointsTextField = new JTextField(15);
hitpointsTextField.setEditable(false);
hitpointsPanel.add(hitpointsLabel, BorderLayout.CENTER);
hitpointsPanel.add(hitpointsTextField, BorderLayout.LINE_END);
add(hitpointsPanel);
anzahlPanel = new JPanel();
anzahlLabel = new JLabel(" Anzahl: ");
anzahlLabel.setPreferredSize(new Dimension(115, 20));
anzahlTextField = new JTextField(15);
anzahlTextField.setEditable(false);
anzahlPanel.add(anzahlLabel, BorderLayout.CENTER);
anzahlPanel.add(anzahlTextField, BorderLayout.LINE_END);
add(anzahlPanel);
fehlerPanel = new JPanel();
fehlerLabel = new JLabel("Fehler! Bitte Eingaben überprüfen!");
fehlerLabel.setForeground(Color.red);
fehlerLabel.setVisible(false);
fehlerPanel.add(fehlerLabel);
add(fehlerPanel);
hinzufügenPanel = new JPanel();
hinzufügenButton = new JButton("Schiff(e) hinzufügen");
hinzufügenButton.addActionListener(this);
hinzufügenButton.setActionCommand("hinzufügen");
hinzufügenPanel.add(hinzufügenButton);
add(hinzufügenPanel);
setBounds(300, 130, 340, 470);
setResizable(false);
setVisible(true);
setDefaultCloseOperation(HIDE_ON_CLOSE);
}
public void actionPerformed (ActionEvent ereignis)
{
}
}[/code]
Ganz fertig ist es, wie zu sehen, noch nicht. Wie zu sehen ist, soll das Fenster mit "setDefaultCloseOperation(HIDE_ON_CLOSE)" versteckt bzw. unsichtbar gemacht werden, wenn der Nutzer auf das "X" klickt. Im Fall, dass der Nutzer den Button "hinzufügenButton" drückt, soll u.a. später dasselbe passieren (ist hier noch nicht zu sehen), wahrscheinlich einfach mit "setVisible(false)".
Da das Fenster im Verlauf der Nutzung des Programms sehr häufig geöffnet und geschlossen wird, war mein Hintergedanke dabei, das Eingabefenster-Objekt müsste ja nicht jedesmal "zerstört" werden, sondern nur versteckt und später wieder sichtbar gemacht.
Um das Eingabefenster-Objekt anfänglich zu erzeugen bzw. wieder sichtbar zu machen, verfügt ein anderes Fenster des Programms über einen Button, der, wenn vom Nutzer betätigt, das tut:
[JAVA=152]if(ereignis.getActionCommand().equals("gegnerHinzufügen"))
{
if(gegnerEingabefenster == null)
{
Eingabefenster gegnerEingabefenster = new Eingabefenster("Gegnerische Schiffe hinzufügen");
}
else
{
gegnerEingabefenster.setVisible(true);
gegnerEingabefenster.klasseListe.setSelectedItem(0);
gegnerEingabefenster.schiffListe.setSelectedItem(0);
gegnerEingabefenster.schiffListe.setEnabled(false);
gegnerEingabefenster.partikelAngriffTextField.setEditable(false);
gegnerEingabefenster.partikelAngriffTextField.setText(null);
gegnerEingabefenster.energieAngriffTextField.setEditable(false);
gegnerEingabefenster.energieAngriffTextField.setText(null);
gegnerEingabefenster.schildeTextField.setEditable(false);
gegnerEingabefenster.schildeTextField.setText(null);
gegnerEingabefenster.panzerTextField.setEditable(false);
gegnerEingabefenster.panzerTextField.setText(null);
gegnerEingabefenster.antriebTextField.setEditable(false);
gegnerEingabefenster.antriebTextField.setText(null);
gegnerEingabefenster.hitpointsTextField.setText(null);
gegnerEingabefenster.anzahlTextField.setEditable(false);
gegnerEingabefenster.anzahlTextField.setText(null);
gegnerEingabefenster.anzahlLabel.setPreferredSize(new Dimension(115, 20));
gegnerEingabefenster.fehlerLabel.setVisible(false);
}
}[/code]
Sollte das Eingabefenster-Objekt also noch nicht existieren, soll es erzeugt werden; existiert es bereits, soll es mit "setVisible(true)" wieder sichtbar gemacht und einige Eigenschaften, die der Nutzer evtl. geändert haben könnte (Textfeldeingaben etc.), zurückgesetzt werden.
Nun wollte ich das Programm aber testen und es sieht so aus als wird das Eingabefenster-Objekt doch jedes mal neu erzeugt, auch wenn es bereits existieren sollte.
Meine Frage ist also: Was genau tun HIDE_ON_CLOSE und setVisible(false)?
"Verstecken" sie das Eingabefenster-Objekt tatsächlich nur oder "zerstören" sie es?
Und ist es eigentlich sinnvoll ein Objekt nur zu "verstecken" oder könnte ich es auch x-mal "zerstören" und wieder erzeugen? Welchen Unterschied würde das machen? Würde dabei nicht eine Menge "Datenmüll" anfallen?
Und falls ja, wie kann ich ein Objekt tatsächlich nur "verstecken"?
Ich hoffe mein Problem ist einigermaßen deutlich geworden, wenn nicht, bitte einfach nachfragen.
Ich bedanke mich schon im Voraus für alle Antworten.
ich bin momentan ein klein wenig verwirrt. Ich schreibe gerade ein kleines Programm, dass unter anderem ein Fenster erzeugen soll, das sieht momentan so aus:
[JAVA=229]class Eingabefenster extends JFrame implements ActionListener
{
String seite;
JPanel kopfPanel;
JPanel klassePanel;
JPanel schiffPanel;
JPanel partikelAngriffPanel;
JPanel energieAngriffPanel;
JPanel schildePanel;
JPanel panzerPanel;
JPanel antriebPanel;
JPanel hitpointsPanel;
JPanel anzahlPanel;
JPanel fehlerPanel;
JPanel hinzufügenPanel;
JLabel kopfLabel;
JLabel klasseLabel;
JLabel schiffLabel;
JLabel partikelAngriffLabel;
JLabel energieAngriffLabel;
JLabel schildeLabel;
JLabel panzerLabel;
JLabel antriebLabel;
JLabel hitpointsLabel;
JLabel anzahlLabel;
JLabel fehlerLabel;
JComboBox klasseListe;
JComboBox schiffListe;
JTextField partikelAngriffTextField;
JTextField energieAngriffTextField;
JTextField schildeTextField;
JTextField panzerTextField;
JTextField antriebTextField;
JTextField hitpointsTextField;
JTextField anzahlTextField;
JButton hinzufügenButton;
public Eingabefenster(String titel)
{
super(titel);
seite = titel;
setLayout(new FlowLayout());
kopfPanel = new JPanel();
kopfLabel = new JLabel("Bitte Werte und Anzahl des/der Schiffs/Schiffe eingeben!");
kopfPanel.add(kopfLabel);
add(kopfPanel);
klassePanel = new JPanel();
klasseLabel = new JLabel("Klasse: ");
klasseLabel.setPreferredSize(new Dimension(70, 20));
String[] klasseStrings = new String[9];
klasseStrings[0] = "<Bitte auswählen!>";
klasseStrings[1] = "Stahlchassis";
klasseStrings[2] = "Titanidchassis";
klasseStrings[3] = "Freedom-Class (Menschen)";
klasseStrings[4] = "Hellfire-Chassis (Ti-Roc)";
klasseStrings[5] = "Prallfeldgenerator (Tradoner)";
klasseStrings[6] = "Hyperiums-Class (Beraluten)";
klasseStrings[7] = "Shelloptress-Class (Myrianer)";
klasseStrings[8] = "Turtle Technik (Se'ze Lux)";
klasseListe = new JComboBox(klasseStrings);
klasseListe.setEditable(false);
klasseListe.setSelectedItem(0);
klasseListe.addActionListener(this);
klasseListe.setActionCommand("klasse");
klassePanel.add(klasseLabel, BorderLayout.CENTER);
klassePanel.add(klasseListe, BorderLayout.LINE_END);
add(klassePanel);
schiffPanel = new JPanel();
schiffLabel = new JLabel("Schiff: ");
schiffLabel.setPreferredSize(new Dimension(130, 20));
String[] schiffStrings = new String[7];
schiffStrings[0] = "<Bitte auswählen!>";
schiffListe = new JComboBox(schiffStrings);
schiffListe.setEditable(false);
schiffListe.setSelectedItem(0);
schiffListe.setEnabled(false);
schiffListe.addActionListener(this);
schiffListe.setActionCommand("schiff");
schiffPanel.add(schiffLabel, BorderLayout.CENTER);
schiffPanel.add(schiffListe, BorderLayout.LINE_END);
add(schiffPanel);
partikelAngriffPanel = new JPanel();
partikelAngriffLabel = new JLabel("Partikel-Angriff: ");
partikelAngriffLabel.setPreferredSize(new Dimension(100, 20));
partikelAngriffTextField = new JTextField(15);
partikelAngriffTextField.setEditable(false);
partikelAngriffPanel.add(partikelAngriffLabel, BorderLayout.CENTER);
partikelAngriffPanel.add(partikelAngriffTextField, BorderLayout.LINE_END);
add(partikelAngriffPanel);
energieAngriffPanel = new JPanel();
energieAngriffLabel = new JLabel("Energie-Angriff: ");
energieAngriffLabel.setPreferredSize(new Dimension(100, 20));
energieAngriffTextField = new JTextField(15);
energieAngriffTextField.setEditable(false);
energieAngriffPanel.add(energieAngriffLabel, BorderLayout.CENTER);
energieAngriffPanel.add(energieAngriffTextField, BorderLayout.LINE_END);
add(energieAngriffPanel);
schildePanel = new JPanel();
schildeLabel = new JLabel("Schilde: ");
schildeLabel.setPreferredSize(new Dimension(100, 20));
schildeTextField = new JTextField(15);
schildeTextField.setEditable(false);
schildePanel.add(schildeLabel, BorderLayout.CENTER);
schildePanel.add(schildeTextField, BorderLayout.LINE_END);
add(schildePanel);
panzerPanel = new JPanel();
panzerLabel = new JLabel("Panzer: ");
panzerLabel.setPreferredSize(new Dimension(100, 20));
panzerTextField = new JTextField(15);
panzerTextField.setEditable(false);
panzerPanel.add(panzerLabel, BorderLayout.CENTER);
panzerPanel.add(panzerTextField, BorderLayout.LINE_END);
add(panzerPanel);
antriebPanel = new JPanel();
antriebLabel = new JLabel("Antrieb: ");
antriebLabel.setPreferredSize(new Dimension(100, 20));
antriebTextField = new JTextField(15);
antriebTextField.setEditable(false);
antriebPanel.add(antriebLabel, BorderLayout.CENTER);
antriebPanel.add(antriebTextField, BorderLayout.LINE_END);
add(antriebPanel);
hitpointsPanel = new JPanel();
hitpointsLabel = new JLabel("Hitpoints: ");
hitpointsLabel.setPreferredSize(new Dimension(100, 20));
hitpointsTextField = new JTextField(15);
hitpointsTextField.setEditable(false);
hitpointsPanel.add(hitpointsLabel, BorderLayout.CENTER);
hitpointsPanel.add(hitpointsTextField, BorderLayout.LINE_END);
add(hitpointsPanel);
anzahlPanel = new JPanel();
anzahlLabel = new JLabel(" Anzahl: ");
anzahlLabel.setPreferredSize(new Dimension(115, 20));
anzahlTextField = new JTextField(15);
anzahlTextField.setEditable(false);
anzahlPanel.add(anzahlLabel, BorderLayout.CENTER);
anzahlPanel.add(anzahlTextField, BorderLayout.LINE_END);
add(anzahlPanel);
fehlerPanel = new JPanel();
fehlerLabel = new JLabel("Fehler! Bitte Eingaben überprüfen!");
fehlerLabel.setForeground(Color.red);
fehlerLabel.setVisible(false);
fehlerPanel.add(fehlerLabel);
add(fehlerPanel);
hinzufügenPanel = new JPanel();
hinzufügenButton = new JButton("Schiff(e) hinzufügen");
hinzufügenButton.addActionListener(this);
hinzufügenButton.setActionCommand("hinzufügen");
hinzufügenPanel.add(hinzufügenButton);
add(hinzufügenPanel);
setBounds(300, 130, 340, 470);
setResizable(false);
setVisible(true);
setDefaultCloseOperation(HIDE_ON_CLOSE);
}
public void actionPerformed (ActionEvent ereignis)
{
}
}[/code]
Ganz fertig ist es, wie zu sehen, noch nicht. Wie zu sehen ist, soll das Fenster mit "setDefaultCloseOperation(HIDE_ON_CLOSE)" versteckt bzw. unsichtbar gemacht werden, wenn der Nutzer auf das "X" klickt. Im Fall, dass der Nutzer den Button "hinzufügenButton" drückt, soll u.a. später dasselbe passieren (ist hier noch nicht zu sehen), wahrscheinlich einfach mit "setVisible(false)".
Da das Fenster im Verlauf der Nutzung des Programms sehr häufig geöffnet und geschlossen wird, war mein Hintergedanke dabei, das Eingabefenster-Objekt müsste ja nicht jedesmal "zerstört" werden, sondern nur versteckt und später wieder sichtbar gemacht.
Um das Eingabefenster-Objekt anfänglich zu erzeugen bzw. wieder sichtbar zu machen, verfügt ein anderes Fenster des Programms über einen Button, der, wenn vom Nutzer betätigt, das tut:
[JAVA=152]if(ereignis.getActionCommand().equals("gegnerHinzufügen"))
{
if(gegnerEingabefenster == null)
{
Eingabefenster gegnerEingabefenster = new Eingabefenster("Gegnerische Schiffe hinzufügen");
}
else
{
gegnerEingabefenster.setVisible(true);
gegnerEingabefenster.klasseListe.setSelectedItem(0);
gegnerEingabefenster.schiffListe.setSelectedItem(0);
gegnerEingabefenster.schiffListe.setEnabled(false);
gegnerEingabefenster.partikelAngriffTextField.setEditable(false);
gegnerEingabefenster.partikelAngriffTextField.setText(null);
gegnerEingabefenster.energieAngriffTextField.setEditable(false);
gegnerEingabefenster.energieAngriffTextField.setText(null);
gegnerEingabefenster.schildeTextField.setEditable(false);
gegnerEingabefenster.schildeTextField.setText(null);
gegnerEingabefenster.panzerTextField.setEditable(false);
gegnerEingabefenster.panzerTextField.setText(null);
gegnerEingabefenster.antriebTextField.setEditable(false);
gegnerEingabefenster.antriebTextField.setText(null);
gegnerEingabefenster.hitpointsTextField.setText(null);
gegnerEingabefenster.anzahlTextField.setEditable(false);
gegnerEingabefenster.anzahlTextField.setText(null);
gegnerEingabefenster.anzahlLabel.setPreferredSize(new Dimension(115, 20));
gegnerEingabefenster.fehlerLabel.setVisible(false);
}
}[/code]
Sollte das Eingabefenster-Objekt also noch nicht existieren, soll es erzeugt werden; existiert es bereits, soll es mit "setVisible(true)" wieder sichtbar gemacht und einige Eigenschaften, die der Nutzer evtl. geändert haben könnte (Textfeldeingaben etc.), zurückgesetzt werden.
Nun wollte ich das Programm aber testen und es sieht so aus als wird das Eingabefenster-Objekt doch jedes mal neu erzeugt, auch wenn es bereits existieren sollte.
Meine Frage ist also: Was genau tun HIDE_ON_CLOSE und setVisible(false)?
"Verstecken" sie das Eingabefenster-Objekt tatsächlich nur oder "zerstören" sie es?
Und ist es eigentlich sinnvoll ein Objekt nur zu "verstecken" oder könnte ich es auch x-mal "zerstören" und wieder erzeugen? Welchen Unterschied würde das machen? Würde dabei nicht eine Menge "Datenmüll" anfallen?
Und falls ja, wie kann ich ein Objekt tatsächlich nur "verstecken"?
Ich hoffe mein Problem ist einigermaßen deutlich geworden, wenn nicht, bitte einfach nachfragen.
Ich bedanke mich schon im Voraus für alle Antworten.