# Nächste GUI in einer anderen Klasse aufrufen



## Diverson (5. Feb 2013)

Hallo Leute,

ich habe folgendes problem:

Ich habe ein Fenster mit Swing programmiert. Eine Klasse ConfigutationWindow und eine Klasse SearchWindow. Nachdem ich in dem einen fenster den OK Button gedrückt habe wollte ich, dass sich das nächste Fenster öffnet und sich das alte Fenster schliesst. Kann mir bitte einer sagen, wie ich die nächste GUI aufrufe? Einen ActionListener hab ich bereits, müsste nur die andere Klasse aufrufen... Nur wie? 

Danke,
Basti


----------



## anti-held (5. Feb 2013)

Du musst auf das nächste Objekt 
	
	
	
	





```
setVisible(true)
```
 sichtbar machen und den anderen Frame mit 
	
	
	
	





```
dispose()
```
 oder 
	
	
	
	





```
setVisible(false)
```
 beenden oder unsichtbar machen.


----------



## VfL_Freak (5. Feb 2013)

Moin,



Diverson hat gesagt.:


> Ich habe ein Fenster mit Swing programmiert. Eine Klasse ConfigutationWindow und eine Klasse SearchWindow. Nachdem ich in dem einen fenster den OK Button gedrückt habe wollte ich, dass sich das nächste Fenster öffnet und sich das alte Fenster schliesst. Kann mir bitte einer sagen, wie ich die nächste GUI aufrufe? Einen ActionListener hab ich bereits, müsste nur die andere Klasse aufrufen... Nur wie?


So ganz verstehe ich Deine Frage nicht ....

im Listener des OK-Button:

```
aktuellesFenster.dispose();  // oder auch ".setVisible( false);

...

neuesFenster.setVisible( true );
```

Poste mal Deinen Code!

Gruß
Klaus


----------



## Diverson (5. Feb 2013)

Klasse ConfigurationWindow:

[JAVA=42]package exercises.project;

import java.util.Locale;
import java.util.ResourceBundle;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;

public class ConfigurationWindow extends JFrame {

  private static final String PATH = "path";
  private static final String OPTION = "option";
  private static final String LANGUAGE = "language";
  private static final String RDB_GET_USERDATA = "rdbGetUserdata";
  private static final String RDB_SEARCH_USER = "rdbSearchUser";
  private static final String LIST_SEARCH = "listSearch";
  private ResourceBundle bundle;
  private JPanel panel;
  private JTextField filePath = new JTextField("");
  private JButton Ok;
  private JButton Cancel;
  private JButton File;

  public ConfigurationWindow() {
    super("Choose your activity");
    setSize(360, 250);
    setLocation(300, 300);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Locale.setDefault(Locale.ENGLISH);

    bundle = ResourceBundle.getBundle(getClass().getPackage().getName() + ".resources");

    panel = new JPanel();
    panel.setLayout(null);
    getContentPane().add(panel);

    JLabel options = new JLabel(bundle.getString(OPTION));
    panel.add(options);
    options.setBounds(10, 10, 200, 20);

    //JComboBox mit Sprachen
    JLabel languageLabel = new JLabel(bundle.getString(LANGUAGE));
    panel.add(languageLabel);
    languageLabel.setBounds(20, 30, 200, 20);

    String LanguageList[] = { "English", "German"};
    JComboBox language = new JComboBox(LanguageList);
    language.setBounds(20, 50, 100, 25);

    panel.add(language);

    //JLabel
    JLabel listorSearch = new JLabel(bundle.getString(LIST_SEARCH));
    panel.add(listorSearch);
    listorSearch.setBounds(20, 80, 200, 20);

    //RadioButtons & ButtonGroup
    JRadioButton rb1 = new JRadioButton(bundle.getString(RDB_GET_USERDATA));
    JRadioButton rb2 = new JRadioButton(bundle.getString(RDB_SEARCH_USER));
    rb1.setSelected(true);
    ButtonGroup btngrpoup = new ButtonGroup();
    btngrpoup.add(rb1);
    btngrpoup.add(rb2);

    //Zuweisung der Buttons
    panel.add(rb1);
    rb1.setBounds(20, 100, 100, 15);
    panel.add(rb2);
    rb2.setBounds(150, 100, 100, 15);

    JLabel pathLabel = new JLabel(bundle.getString(PATH));
    panel.add(pathLabel);
    pathLabel.setBounds(20, 130, 200, 15);

    filePath.setEditable(false);
    panel.add(filePath);
    filePath.setBounds(20, 150, 200, 20);

    //JButton          
    Ok = new JButton("OK");
    Cancel = new JButton("Cancel");
    File = new JButton("Durchsuchen");

    panel.add(Ok);
    Ok.setBounds(215, 15, 75, 30);
    panel.add(Cancel);
    Cancel.setBounds(215, 50, 75, 30);
    panel.add(File);
    File.setBounds(222, 150, 115, 19);

    Ok.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(java.awt.event.ActionEvent e) {
        check();
      }
    });
    Cancel.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(java.awt.event.ActionEvent e) {
        System.exit(0);
      }
    });
    File.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(java.awt.event.ActionEvent e) {
        FileChoose();
      }
    });
    setVisible(true);
  }

  public static void main(String[] args) {
    ConfigurationWindow cw = new ConfigurationWindow();
    cw.setVisible(true);
  }

  public void FileChoose() {
    JFileChooser chooser = new JFileChooser();
    chooser.showDialog(null, "Open");
    String select = chooser.getSelectedFile().toString();
    filePath.setText(select);
  }

  public void check() {
    if (filePath.equals("")) {
      JOptionPane.showMessageDialog(null, "Path can't be empty!", "Error",
          JOptionPane.ERROR_MESSAGE);
    }
  }
}[/code]


----------



## Diverson (5. Feb 2013)

Klasse SearchWindow:

[JAVA=42]package exercises.project;

import java.util.Locale;
import java.util.ResourceBundle;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class SearchWindow extends JFrame {

  private static final String SEARCH_MAIN = "searchMain";
  private JPanel panel;
  private ResourceBundle bundle;

  public SearchWindow() {
    super("Search");
    setSize(250, 250);
    setLocation(300, 300);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Locale.setDefault(Locale.ENGLISH);

    bundle = ResourceBundle.getBundle(getClass().getPackage().getName() + ".resources");

    panel = new JPanel();
    panel.setLayout(null);
    getContentPane().add(panel);

    JLabel searchHead = new JLabel(bundle.getString(SEARCH_MAIN));
    panel.add(searchHead);
    searchHead.setBounds(10, 10, 200, 20);

    JLabel searchField = new JLabel(bundle.getString("searchField"));
    panel.add(searchField);
    searchField.setBounds(20, 30, 80, 20);

    JTextField search = new JTextField();
    panel.add(search);
    search.setBounds(20, 55, 150, 20);
  }

  public static void main(String[] args) {
    SearchWindow sw = new SearchWindow();
    sw.setVisible(true);
  }
}
[/code]

Jetzt will ich die Klasse SearchWindow im ActionListener vom OK Button im ConfigurationWindow aufrufen, sodass sich das SearchWindow öffnet... Da steh ich glaub gerade total auf dem Schlauch...


----------



## Timothy Truckle (5. Feb 2013)

Diverson hat gesagt.:


> Ich habe ein Fenster mit Swing programmiert. Eine Klasse ConfigutationWindow und eine Klasse SearchWindow. Nachdem ich in dem einen fenster den OK Button gedrückt habe wollte ich, dass sich das nächste Fenster öffnet und sich das alte Fenster schliesst. Kann mir bitte einer sagen, wie ich die nächste GUI aufrufe? Einen ActionListener hab ich bereits, müsste nur die andere Klasse aufrufen... Nur wie?


Die Frage ist: willst Du wirklich den ganzen Farme schließen oder "nur" einen neuen Inhalt anzeigen? Wenn Du einen neuen Frame aufmachst sind die Einstellungen, die der Anwender am (alten) Frame gemacht hat verloren. Würdes Du ein Programm benutzen wollen, das ständig zu seiner Standardgröße zurückkehrt?

Wenn Du Dir mal typische Anwendungen ansiehts wirst Du feststellen, dass es in deren Frame einige unveränderliche Komponenten (z.B. das Hauptmenü und einige grundlegende Navigations-Butons, ein Statusbar) gibt und einen Bereich, in dem sich die Inhalte ändern. 

In Java erreicht man das üblicher Weise, in dem man dem Frame ein [JAPI]BorderLayout[/JAPI] gibt, die Komponenten, die immer Sichtbar sein sollen in die Ränder des BorderLayout legt und die Komponente in der Mitte austauscht.
Ob dieses Austauschen über 
	
	
	
	





```
removeLayoutComponent()
```
/
	
	
	
	





```
add()
```
, ein [JAPI]CardLayout[/JAPI], ein [JAPI]TabbedPane[/JAPI] oder eine andere Technik erreicht wird ist dann nur noch Detail.

Für Dich heist das:
Lass Deine Klassen nicht von JFrame erben, benutze einen! 
Überlege gut, ob sie überhaupt von einer GUI-Klasse erben müssen (also deren Verhalten ändern) oder ob Du sie einfach nur benutzen/konfigurieren kannst. 
Lass Deine GUI-bezogenen Klassen nicht direkt miteinander reden sondern nutze ein Modell, das die  Daten deiner Anwendung ganz ohne Bezug zur GUI rein "fachlich" organisiert. 
(das Stichwort für's Weiterlesen ist MVC-Pattern.)
Und das sollte man auch gelesen haben: Trail: Creating a GUI With JFC/Swing (The Java™ Tutorials)

bye
TT


----------



## Diverson (5. Feb 2013)

Also das heisst, wenn ich das eine Frame mit System.exit(0) schliesse sind meine Konfigurationen im nächsten Frame verloren? (Die ich eigentlich als Zustände über alle Frames bräuchte)



> Lass Deine Klassen nicht von JFrame erben, benutze einen!


Das verstehe ich nicht genau. ???:L


----------



## MrClave (5. Feb 2013)

Ein System.exit(0) beendet die VM, nicht den Frame. (Ok, so gesehen auch den Frame)

Statt 
	
	
	
	





```
extends JFrame
```
, solltest du schreiben:


```
private JFrame frame;

public "Klassenname"() {
frame = new JFrame();
frame.setSize( 800, 600 );
// usw.
}
```


----------

