Mit Button neues Fenster öffnen

JavaQ3

Mitglied
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)


Java:
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. :

Java:
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
 
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.
 
Zuletzt bearbeitet von einem Moderator:
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
 
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.
 
Zuletzt bearbeitet von einem Moderator:
So wie du das meinst ist es doch so oder?

Java:
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
 
So etwa:
Java:
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.
 
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.
 
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
Java:
new Test2();
einfach ein neues Objekt vom Typ Test2 erzeugen und hast dein neues Fenster.

Gruß Vanny
 
Wie sieht denn deine Klasse Test2 aus? Poste die doch mal hier, dann sieht man evtl. auch gleich, wo der Fehler liegt.
 
Okay hier mal die beiden Klassen:
Java:
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:
Java:
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
Test2 test=new Test2(this);
^
Test.java:50:10: non-static method setVisible(boolean) cannot be referenced from a static context
Test2.setVisible(true);// TODO hier Quelltext einfügen
^
2 errors

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

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

Den Aufruf des Dialogs kannst du gleich bei Button in den ActionListener reinschreiben:
Java:
...
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.
 
Zuletzt bearbeitet von einem Moderator:
Danke,

also nach folgender Version klappt es jetzt:
Java:
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

}
Java:
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
 
Oder einfach innerhalb der Klasse setzen:
Java:
setTitle("Titel");
 
Und das sieht auch ein bisschen komisch aus (Klasse Test2):
Java:
...
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.
 
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
 
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...
 
Zuletzt bearbeitet von einem Moderator:

Zurück
Oben