# Frame über Button öffnen



## Blacksun91 (21. Mrz 2011)

Hi,

ich stehe gerade vor dem Problem ein Frame mit Objekten aus einer anderen -java-Datei per Buttonklick zu öffnen.
Mir ist es bisher nur gelungen einen Frame Dynamisch zu erzeugen, nicht aber einen bestehenden Frame zu laden. 

Der genutzte Code zum  dynamischen erstellen des Frames ist folgender:


```
public void jButton1_ActionPerformed(ActionEvent evt) {
    Container cp = getContentPane();
    cp.setLayout(null);
    JFrame f = new JFrame(profiledit);
    f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    f.setSize( 600, 400 );
    f.setVisible( true );
    cp.add(f);

  }
```

Nun wird hier aber nur ein leerer Frame ohne jegliche Objekte erstellt. 

Gruß


----------



## Michael... (21. Mrz 2011)

Auf dem Frame ist ja auch nichts drauf.

Wenn eine bereits vorhandener Frame angezeigt werden sollt, dann muss:
1. dieser bereits existieren ;-)
2. eine Referenz auf den Frame auch in der Methode verfügbar sein

Überlicherweise arbeitet man mit einem JFrame und mehreren JDialog(s) wenn ein zusätzliches Fenster angezeigt werden soll.


----------



## Blacksun91 (21. Mrz 2011)

Ich habe bereits einen kompletten Frame für meine Optionseigenschaften erstellt, den ich per Buttonklick anzeigen will. Gibt es keine Möglichkeiten diesen Frame einzubinden oder muss ich einen komplett neuen Jdialog machen? =(


----------



## AmunRa (21. Mrz 2011)

Je nach dem wie du den Frame erstellt hast gibts da unter scheidlich möglichkeiten.


Wenn du die klasse von Frame erben hast lassen dan gehts einfach mit 


```
public void jButton1_ActionPerformed(ActionEvent evt) {
    Klasse f = new Klasse(profiledit);
    f.setSize( 600, 400 );
    f.setVisible( true );
  }
```

wenn der Frame nur als Instanzvariable in einer Klasse ist musst du halt eine entsprechende Gettermethode oder so verwenden. 

Wie hast du den den Frame erstellt?


----------



## Blacksun91 (21. Mrz 2011)

Oh Gott, kann ich grad nicht sagen, weil ich erst anfange und noch nicht ganz viel Ahnung habe.

Hier ist das Frame was ich einbinden möchte:

```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.io.*;
import javax.swing.filechooser.FileSystemView;

/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 19.03.2011
  * @author
  */

public class profiledit extends JFrame{
  // Anfang Attribute
  private JButton exepfad = new JButton();
  private JTextField pfadtextfield = new JTextField();
  private JFileChooser pfad = new JFileChooser("C:/");
  private JTextField nametextfield = new JTextField();
  private JLabel pfadheadline = new JLabel();
  private JLabel nameheadline = new JLabel();

  private JLabel iconheadline = new JLabel();
    private String[] profilcomboData = {};
  private JComboBox profilcombo = new JComboBox(profilcomboData);
  private JLabel profilheadline = new JLabel();
  private JButton profiladd = new JButton();
  private JButton addprog = new JButton();
  private JTextField profiltextfield = new JTextField();
  private JLabel newprofilheadline = new JLabel();
  private JLabel iconbild = new JLabel();

  private JButton loeschen = new JButton();
  private JButton profildelete = new JButton();
  // Ende Attribute

  public profiledit(String title) {
    // Frame-Initialisierung
    super(title);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    int frameWidth = 620;
    int frameHeight = 307;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    Container cp = getContentPane();
    cp.setLayout(null);
    // Anfang Komponenten

    exepfad.setBounds(264, 176, 35, 25);
    exepfad.setText("...");
    exepfad.setMargin(new Insets(2, 2, 2, 2));
    exepfad.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        exepfad_ActionPerformed(evt);
      }
    });
    cp.add(exepfad);
    pfadtextfield.setBounds(8, 176, 249, 24);
    pfadtextfield.setText("");
    cp.add(pfadtextfield);
    nametextfield.setBounds(8, 120, 185, 24);
    nametextfield.setText("");
    cp.add(nametextfield);
    pfadheadline.setBounds(8, 152, 53, 16);
    pfadheadline.setText("Pfad : ");
    pfadheadline.setFont(new Font("MS Sans Serif", Font.BOLD, 13));
    cp.add(pfadheadline);
    nameheadline.setBounds(8, 96, 163, 16);
    nameheadline.setText("Name des Programms :");
    nameheadline.setFont(new Font("MS Sans Serif", Font.BOLD, 13));
    cp.add(nameheadline);

    iconheadline.setBounds(216, 96, 43, 16);
    iconheadline.setText("Icon :");
    iconheadline.setFont(new Font("MS Sans Serif", Font.BOLD, 13));
    cp.add(iconheadline);
    profilcombo.setBounds(8, 40, 145, 24);
    profilcombo.addFocusListener(new FocusAdapter() {
      public void focusGained(FocusEvent evt) {
        profilcombo_FocusGained(evt);
      }
    });
    cp.add(profilcombo);
    profilheadline.setBounds(8, 16, 122, 16);
    profilheadline.setText("Profil auswählen :");
    profilheadline.setFont(new Font("MS Sans Serif", Font.BOLD, 13));
    cp.add(profilheadline);
    profiladd.setBounds(488, 40, 49, 25);
    profiladd.setText("add");
    profiladd.setMargin(new Insets(2, 2, 2, 2));
    profiladd.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        profiladd_ActionPerformed(evt);
      }
    });
    cp.add(profiladd);
    addprog.setBounds(320, 176, 81, 25);
    addprog.setText("Hinzufügen");
    addprog.setMargin(new Insets(2, 2, 2, 2));
    addprog.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        addprog_ActionPerformed(evt);
      }
    });
    cp.add(addprog);
    profiltextfield.setBounds(312, 40, 161, 24);
    profiltextfield.setText("");
    cp.add(profiltextfield);
    newprofilheadline.setBounds(312, 16, 158, 16);
    newprofilheadline.setText("Neues Profil erstellen :");
    newprofilheadline.setFont(new Font("MS Sans Serif", Font.BOLD, 13));
    cp.add(newprofilheadline);
    loeschen.setBounds(320, 128, 83, 25);
    loeschen.setText("Löschen");
    loeschen.setMargin(new Insets(2, 2, 2, 2));
    loeschen.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        loeschen_ActionPerformed(evt);
      }
    });
    cp.add(loeschen);
    profildelete.setBounds(168, 40, 89, 25);
    profildelete.setText("Profil löschen");
    profildelete.setMargin(new Insets(2, 2, 2, 2));
    profildelete.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        profildelete_ActionPerformed(evt);
      }
    });
    cp.add(profildelete);
    // Ende Komponenten
    iconbild.setBounds(222, 115, 30,30);
    add(iconbild);
  
    setResizable(false);
    setVisible(true);
  }

  // Anfang Methoden
  public void exepfad_ActionPerformed(ActionEvent evt) {
  String pfadstring = pfadOpenFilename();

  iconbild.setIcon( null );
  FileSystemView fsv = FileSystemView.getFileSystemView();
  File f = new File(pfadstring);
  iconbild.setIcon(fsv.getSystemIcon(f));
  pfadtextfield.setText(pfadstring);



  }

  public String pfadOpenFilename() {
    pfad.setDialogTitle("Pfad auswählen");
    if (pfad.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {

      return pfad.getSelectedFile().getPath();
    } else {
      return null;
    }

  }





    public void profiladd_ActionPerformed(ActionEvent evt) {

            try{
                File neuprofil = new File(profiltextfield.getText() + ".txt");


               if ( neuprofil.exists()){
               fileexistsShowMessageDialog();

              }else if(profiltextfield.getText().length() < 5){

              profilnameleerShowMessageDialog();

              }else{
              neuprofil.createNewFile();
              profiltextfield.setText("");
              successShowMessageDialog();
              }




              }catch(IOException ioe){

                }

     }

  public void addprog_ActionPerformed(ActionEvent evt) {
    // TODO hier Quelltext einfügen
  }

  public void fileexistsShowMessageDialog() {
    JOptionPane.showMessageDialog(this, "Es existiert bereits ein Profil mit diesem Namen! Bitte wählen Sie einen anderen Namen aus.", "Fehler beim Erstellen", JOptionPane.ERROR_MESSAGE);
  }

  public void successShowMessageDialog() {
    JOptionPane.showMessageDialog(this, "Das Profil wurde erstellt.", "", JOptionPane.INFORMATION_MESSAGE);
  }






  public void profilcombo_FocusGained(FocusEvent evt) {
   profilcombo.removeAllItems();

  File dir = new File(System.getProperty("user.dir"));
  File[] files = dir.listFiles();
  if (files != null) {
    for (int i = 0; i < files.length; i++) {
    boolean filter = files[i].getName().endsWith(".txt");
    if (filter == true){
     profilcombo.addItem(files[i].getName());
    }
    }
  }
  }

  public void loeschen_ActionPerformed(ActionEvent evt) {
  iconbild.setIcon(null);
  pfadtextfield.setText("");
  nametextfield.setText("");
  }

  public void profildelete_ActionPerformed(ActionEvent evt) {
  File profil = new File(System.getProperty("user.dir")+ "/" + profilcombo.getSelectedItem());
  if(profil.exists()){
    profil.delete();
    profilcombo.removeItem(profilcombo.getSelectedItem());
  }else{
    profildeleteShowMessageDialog();

  }






  }

  public void profildeleteShowMessageDialog() {
    JOptionPane.showMessageDialog(this, "Profil existiert bereits nicht mehr!", "Fehler beim Löschen", JOptionPane.ERROR_MESSAGE);
  }

  public void profilnameleerShowMessageDialog() {
    JOptionPane.showMessageDialog(this, "Es wurde kein Profilname eingegeben.", "", JOptionPane.ERROR_MESSAGE);
  }

  // Ende Methoden

  public static void main(String[] args) {
    new profiledit("Profil");
  }
}
```



Und hier will ich das Frame mit dem Button öffnen(die ActionPerformed besteht bereits)


```
import java.awt.*;
import java.awt.event.*;

/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 21.03.2011
  * @author
  */

public class testframe extends Frame {
  // Anfang Attribute
  private Button button1 = new Button();
  // Ende Attribute

  public testframe(String title) {
    // Frame-Initialisierung
    super(title);
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent evt) { dispose(); }
    });
    int frameWidth = 300;
    int frameHeight = 300;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    Panel cp = new Panel(null);
    add(cp);
    // Anfang Komponenten

    button1.setBounds(40, 48, 75, 25);
    button1.setLabel("button1");
    button1.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        button1_ActionPerformed(evt);
      }
    });
    cp.add(button1);
    // Ende Komponenten

    setResizable(false);
    setVisible(true);
  }

  // Anfang Methoden
  public void button1_ActionPerformed(ActionEvent evt) {
    // Hier soll das Frame geöffnet werden!!!!
  }

  // Ende Methoden

  public static void main(String[] args) {
    new testframe("testframe");
  }
}
```


Könnte mir evt. einer kurz beschreiben, wie ich in Zukunft so ein JDialog erstelle/gestalte und das einbinde? (2 kurze Codebeispiele).
Vielen Danke 
Grüße


----------



## AmunRa (21. Mrz 2011)

Ja dein profile erbt von JFrame und daher kannst du 
in der deiner Methode 


```
public void button1_ActionPerformed(ActionEvent evt) {
    new profileedit("Editiere Profil")
  }
```

das hat aber nichts mit einem JDialog zu tun.


Weitere Punkte:
-profileedit ist eine Klasse und sollte daher mit einem Großbuchstaben beginnen. Ebenso testframe

-du mischt Swing mit AWT d.h. dein TestFrame erbt von Frame und ProfileEdit erbt von JFrame
du solltest TestFrame auch von JFrame erben lassen. wenn du dies aber machst musst du aufpassen da sich da auch ein Paar sachen dann in deinem Code ändern müssen.

Bezüglich Tutorials zu JDialog oder JFrame kannst du entweder im Forum in den Tutorials/FAQ lesen oder such in google nach "Tutorial Swing" oder tutorial JFrame oder tutorial JDialog da wirst du sicher etwas finden.


----------



## Blacksun91 (21. Mrz 2011)

Zu 2: wusste ich nicht.. versuche ich einzuführen
Zu 3: normalerweise mache ich das auch, aber ich hab das nur eben schnell flüchtig erstellt und nicht draufgeachtet.



```
new profiledit("Editiere Profil");
```
 funktioniert leider nicht. Er sagt mir "Cannot access"...was muss ich noch im sagen?

Rufe ich Jdialogs genauso auf ?


----------



## AmunRa (21. Mrz 2011)

Also bei mir funktioniert der Code ich habe jetzt die zwei Code stücke die du gepostet hast bei mir in Java-Files kopiert, kompiliert und ausgeführt und eben zuvor in die Methode so geändert

```
public void button1_ActionPerformed(ActionEvent evt) {
    new profiledit("Editiere Profil");
  }
```

ohne genaue Fehler meldung kann ich dir hier nicht helfen


JDialogs rufst du imprinzip genau gleich auf nur, dass sie einen andern Kontructor haben der mehr Werte entgegen nimmt. Siehe hierfür die API


----------



## Michael... (21. Mrz 2011)

In der Hinsicht sind JFrame und JDialog dasselbe. (JDialog kann z.B. eine Elternkomponente besitzen und wird nicht in der Taskbar angezeigt)

Dein Problem hat aber scheinbar nichts mit JFrame oder JDialog zu tun. Was Dir fehlt ist das grundlegende Wissen wie man "objektübergreifend" programmiert.
Wenn Du innerhalb einer Methode einer Klasse auf ein Objekt zugreifen willst, benötigt man einer Referenz auf dieses Objekt.
Entweder:
1. übergibt man diese Referenz unimttelbar der Methode 
2. oder die Instanz der Klasse hält bereits eine Referenz auf dieses Objekt (z.B. Übergabe per Konstruktor oder per "set" - Methode)
3. oder das Objekt wird unmittelbar in der Methode erstellt


----------

