# Mit Button neues Fenster öffnen



## JavaQ3 (26. Sep 2011)

Hallo,

ich bin neu hier im Forum und noch ziemlich unerfahren mit Java. Ich versuche grade, das sich, wenn ich einen Button anklicke sich eine  neue Klasse öfffnet.
Ich habe schon gegoogelt, und hilfreiche Sachen gefunden.
Wenn ich das Problem folgender Maßen löse(im ActionPerformer)



```
JDialog dlg = new JDialog(this);
dlg.setVisible(true);
```

dann öffnet sich ein neues Fenster, was keine größe und nix hat, aber es öffnet sich.

Doch ich versuche nun anstatt dieses Dialogfenster eine neue Klasse(Test) zu öffnen. :


```
public void Test_ActionPerformed(ActionEvent evt) {
    Test dlg = new Test(this);
    dlg.setVisible(true);// TODO hier Quelltext einfügen
  }
```

Der Button Test soll nun eine neue Klasse öffnen, die ich schon geschrieben habe.:rtfm:

Meine Frage ist jetzt, wie ich diese klasse importieren kann/muss oder ob ich das mit dem Dialog lösen kann????:L

grüße


----------



## Camino (26. Sep 2011)

Einem Dialog kannst du auch eine Grösse verpassen. Was ist denn Test für eine Klasse?

Ergänzung: Du könntest z.B. Test von JDialog erben lasen (extends JDialog) und dann in der actionPerformed-Methode (ja, die sollte so heissen) des Buttons mit new Test() den Dialog erstellen und anziegen lassen.


----------



## JavaQ3 (26. Sep 2011)

Also ich habe 2 Klassen, Test1 und Test2 in Test 1 habe ich einen Button mit dem ich die Klasse Test 2 öffnen möchte, ist das möglich oder sollte ich Test2 als Dialog darstellen?

grüße


----------



## Camino (26. Sep 2011)

JavaQ3 hat gesagt.:


> Also ich habe 2 Klassen, Test1 und Test2 in Test 1 habe ich einen Button mit dem ich die Klasse Test 2 öffnen möchte, ist das möglich oder sollte ich Test2 als Dialog darstellen?


Wenn du einen Dialog darstellen möchtest, dann muss du auch einen Dialog erstellen, also z.B. die Klasse Test2 von JDialog ableiten.

In Test1 hast du deinen Button mit einem ActionListener. In der actionPerformed-Methode erstellst du von Klasse Test2 (welche von JDialog erbt) mit new ein Objekt davon.


----------



## JavaQ3 (26. Sep 2011)

So wie du das meinst ist es doch so oder?


```
public void Test_ActionPerformed(ActionEvent evt) {
    Test2 dlg = new Test2(this);
    dlg.setVisible(true);// TODO hier Quelltext einfügen
  }
```

das Problem ist jedoch, dass er irgendwie nicht damit klarkomtm, dass ich in der Klasse Test1 nun aufeinaml Test2 erstellen möchte.
Wie müsste denn die Dialog- Variante aussehen?

grüße


----------



## Camino (26. Sep 2011)

So etwa:

```
public class Test2 extends JDialog {
    
    public Test2() {
        // Konstruktor: Grösse setzen, Titel, modal, Komponenten rein, usw...
        // mit setVisible(true) am Ende sichtbar machen
    }

}
```

Und dann in der Klasse Test1 ActionListener an den Button und die Methode für den ActionListener heisst actionPerformed. Vielleicht kannst du ja auch mal den relevanten Code (Klasse Test2 und die actionPerformed-Methode) hier posten, damit man genaueres sehen kann.


----------



## Camino (26. Sep 2011)

JavaQ3 hat gesagt.:


> das Problem ist jedoch, dass er irgendwie nicht damit klarkomtm, dass ich in der Klasse Test1 nun aufeinaml Test2 erstellen möchte.


Und du solltest dir angewöhnen, neben dem fehlerhaften Code am besten auch genauere Fehlerbeschreibungen abzugeben. Weil mit der oben genannten ("dass er irgendwie nicht damit klarkomtm") kann niemand so richtig was anfangen.


----------



## vanny (26. Sep 2011)

Vieleicht hältst du dir erst einmal vor Augen, dass eine Klasse eine Art Bauplan für ein Objekt ist.

Nun erzeugst du ja sicherlich irgendwo(wahrscheinlich in der main Methode) ein Objekt der Klasse Test1, die wie ich vermute von JFrame erbt oder ein Objekt vom Typ JFrame erzeugt.

So deine Klasse Test2 sollte, wenn du ein extra Fenster Darstellen willst auch irgendwie ein Fenster beschreiben.
Da bietet sich der JDialog an.(ein weiterer JFrame würde natürlich auch gehen)

Wenn du nun also einen JButton mit deiner Test1 Klasse erzeugt hast und diesem dann auch erfolgreich einen ActionListener hinzugefügt hast, dann kannst du in der actionPerformed-Methode mit  
	
	
	
	





```
new Test2();
```
einfach ein neues Objekt vom Typ Test2 erzeugen und hast dein neues Fenster.

Gruß Vanny


----------



## Camino (26. Sep 2011)

Wie sieht denn deine Klasse Test2 aus? Poste die doch mal hier, dann sieht man evtl. auch gleich, wo der Fehler liegt.


----------



## JavaQ3 (27. Sep 2011)

Okay hier mal die beiden Klassen:

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


public class Test extends JFrame {
  // Anfang Attribute
  private JLabel headline = new JLabel();
  private JButton Testbutton = new JButton();
  // Ende Attribute

  public Test(String title) {
    // Frame-Initialisierung
    super(title);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    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);
    Container cp = getContentPane();
    cp.setLayout(null);
    // Anfang Komponenten

    headline.setBounds(66, 22, 128, 29);
    headline.setText("Überschrift");
    headline.setFont(new Font("MS Sans Serif", Font.BOLD, 21));
    cp.add(headline);
    Testbutton.setBounds(93, 125, 75, 25);
    Testbutton.setText("Testbutton");
    Testbutton.setMargin(new Insets(2, 2, 2, 2));
    Testbutton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        Testbutton_ActionPerformed(evt);
      }
    });
    cp.add(Testbutton);
    // Ende Komponenten

    setResizable(false);
    setVisible(true);
  }

  // Anfang Methoden
  public void Testbutton_ActionPerformed(ActionEvent evt) {
    Test2 test=new Test2(this);
    Test2.setVisible(true);// TODO hier Quelltext einfügen
  }

  // Ende Methoden

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

und hier die, die ich öffnen möchte:

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

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

public class Test2 extends JFrame {
  // Anfang Attribute
  private JLabel Test2 = new JLabel();
  // Ende Attribute

  public Test2(String title) {
    // Frame-Initialisierung
    super(title);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    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);
    Container cp = getContentPane();
    cp.setLayout(null);
    // Anfang Komponenten

    Test2.setBounds(90, 99, 80, 37);
    Test2.setText("Test2");
    Test2.setFont(new Font("MS Sans Serif", Font.PLAIN, 27));
    cp.add(Test2);
    // Ende Komponenten

    setResizable(false);
    setVisible(true);
  }

  // Anfang Methoden
  // Ende Methoden

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



> Test.java:49:16: cannot find symbol
> symbol  : constructor Test2(Test)
> 
> location: class Test2
> ...



kann ich durch eine import-Anweisung vielleicht die 2 Klassse in der ersten importieren, weil der hat halt das Problem, dass er die Klasse nicht kennt.

grüße


----------



## Camino (27. Sep 2011)

Siehste, da sieht man schon gleich den ersten Fehler: In der Klasse Test1 erzeugst du ein Objekt der Klasse Test2 mit new Test2(this). Dieses this ist eine Referenz auf das Objekt der Klasse Test1, in welcher du das Objekt der Klasse Test2 erzeugst. Aber in der Klasse Test2 hast du einen Konstruktor Test2(String title), der einen String erwartet. Test1 aber ist ein JFrame.

Also, solltest du entweder beim erzeugen des Objektes ein String übergeben: new Test2("Titel") oder den Konstruktor in Test2 ändern in Test2(Test1 test1).

Ausserdem würde ich Test2 nicht von JFrame sondern von JDialog ableiten.

Was ich auch gerade noch sehe: du hast in beiden Klassen eine main-Methode. Du soltest aber in deinem Programm nur eine davon haben, weil dies der Start/Einstiegspunkt für dein Programm ist. Also, am besten in Test2 die main-Methode raus, d.h. dein Programm startet mit dem JFrame (Test1) und dort rufst du den Dialog Test2 auf.


```
private JButton Testbutton = new JButton();
```
Objektnamen klein schreiben: JButton testbutton

Den Aufruf des Dialogs kannst du gleich bei Button in den ActionListener reinschreiben:

```
...
testbutton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        new Test2(this);
      }
    });
...
```
Dann brauchst du die Methode (Testbutton_ActionPerformed) weiter unten nicht mehr. Und das setVisible(true) kannste dann auch in der Klasse Test2 aufrufen, wenn du das als JDialog geändert hast.


----------



## JavaQ3 (27. Sep 2011)

Danke,

also nach folgender Version klappt es jetzt:

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

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

public class Test2 extends JDialog {
  // Anfang Attribute
  private JLabel Test2 = new JLabel();
  // Ende Attribute

  public Test2(String title) {
    // Frame-Initialisierung
    super();
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    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);
    Container cp = getContentPane();
    cp.setLayout(null);
    // Anfang Komponenten

    Test2.setBounds(90, 99, 80, 37);
    Test2.setText("Test2");
    Test2.setFont(new Font("MS Sans Serif", Font.PLAIN, 27));
    cp.add(Test2);
    // Ende Komponenten

    setResizable(false);
    setVisible(true);
  }

  // Anfang Methoden
  // Ende Methoden

}
```


```
mport java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;


public class Test extends JFrame {


  // Anfang Attribute
  private JLabel headline = new JLabel();
  private JButton testbutton = new JButton();
  // Ende Attribute

  public Test(String title) {
    // Frame-Initialisierung
    super(title);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    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);
    Container cp = getContentPane();
    cp.setLayout(null);
    // Anfang Komponenten

    headline.setBounds(66, 22, 128, 29);
    headline.setText("Überschrift");
    headline.setFont(new Font("MS Sans Serif", Font.BOLD, 21));
    cp.add(headline);
    testbutton.setBounds(93, 125, 75, 25);
    testbutton.setText("Testbutton");
    testbutton.setMargin(new Insets(2, 2, 2, 2));
    testbutton.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent evt) {
        new Test2("Titel");
      }
       });
    cp.add(testbutton);
    // Ende Komponenten

    setResizable(false);
    setVisible(true);
  }

  // Anfang Methoden
  // Ende Methoden

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

Jetzt hab ich nur noch eine Frage: Vorher wurde ja durch super(titel) der titel festgelegt, doch das geht ja anscheinend nur bei einem JFrame. Wie lege ich von dem Dialog den Tittel fest.

An dieser Stelle schonmal ein dickes fettes DANKESCHÖN


----------



## Gast2 (27. Sep 2011)

Es gibt ne Reihe von Konstruktoren in denen du den Titel übergeben kannst:
JDialog (Java Platform SE 7 )


----------



## Camino (27. Sep 2011)

Oder einfach innerhalb der Klasse setzen:

```
setTitle("Titel");
```


----------



## Camino (27. Sep 2011)

Und das sieht auch ein bisschen komisch aus (Klasse Test2):

```
...
Container cp = getContentPane();
cp.setLayout(null);
// Anfang Komponenten
 
Test2.setBounds(90, 99, 80, 37);
Test2.setText("Test2");
Test2.setFont(new Font("MS Sans Serif", Font.PLAIN, 27));
cp.add(Test2);
...
```
Du musst ja Test2 nicht mehr dem JDialog (der ja schon Test2 ist) hinzufügen, sondern kannst andere Komponenten dem Test2 hinzufügen. Null-Layout ist auch nicht so besonders prima. Lieber einen LayoutManager nehmen. Da gibt es in der FAQ hier im Forum eine gute Übersicht.


----------



## JavaQ3 (27. Sep 2011)

Naja, es läuft ja erstmal und macht das was es soll 
War ja nur ein Test, für etwas das wir mit unserem Infokurs programmieren werden.

Eine Frage habe ich noch: System.exit(0);     -->schließt alle Fenster, ich möchte jedoch nur 1 Fenster schließen?

grüße und vielen dank


----------



## Camino (27. Sep 2011)

Dialoge kannst du mit dispose() schliessen.
Oder welches Fenster wolltest du damit schliessen?

Du musst auch mal schauen, für Dialoge gibt es noch ein paar Besonderheiten, wie z.B. modal setzen, dann kannst du in deinem Frame (der den Dialog aufgerufen hat) nichts mehr machen, bis der Dialog wieder geschlossen wurde.

Aber es ist wohl grundsätzlich schon besser, wenn du die anderen Fehler auch behebst, auch wenn es trotzdem laufen sollte...


----------



## JavaQ3 (27. Sep 2011)

hab die fehler behoben und noch nen button angelegt, der fenster2 schließt, danke!


----------

