GUI Frame wechseln

Symfuhny

Mitglied
Ich bin neu dabei im Programmieren und versuche grad heraus zu finden wie ich ein Fenster Wechsel mit einem Button klick.
In der Main Methode hab ich die 2 frames erstellt und dann 2 weitere klassen für die jeweiligen frames. So wie ich es mir gedacht habe mit dem ActionListener funktioniert es nicht und ich weiß grad nicht weiter.

Mein Ziel war es herauszufinden wie ich ein frame Wechsel per Button klick. Leider weiß ich nicht weiter.
changeView heißt das erste fenster
frame heißt das zweite fenster


view:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class changeView extends JFrame{
    
    JButton change ;
    
    
    public changeView() {
        
        setSize(400,400) ;
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
        setLayout(null) ;
        setLocation(500, 300);
        
        change = new JButton ("Change") ;
        change.setBounds(100, 50, 50, 20);
        add(change) ;
        
        viewChange view1 = new viewChange();
        
        change.addActionListener(view1);
        
        
        setVisible(true) ;
    }
    
    public class viewChange implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            String    string = " " ;
            if (e.getSource() == change )
                changeView.setVisible(false);
                frame.setVisible(true);
            
    
            
                
            
        }

        
        
    }
}
 
Zuletzt bearbeitet:

Symfuhny

Mitglied
Damit der aktuelle Event-Dispatch nicht noch irgendwo dazwischenfunkt, wäre zu überlegen, das per SwingUtilities.invokeLater in ein eigenes Event zu verschieben:
Danke erstmal für die seite. Mh ich weiß jetzt nicht genau wie ich deine Wörter umsetzen soll. Also kann ich auch ohne einen ActionListener die vIew ändern ? oder muss das sozusagen in den actionlistener also ausführung was er zu tuen hat sozusagen
 

Symfuhny

Mitglied
Genau, der Code muss in den ActionListener des Buttons.
Ich hab es mal so gemacht und da kommt das "Cannot make a static reference to the non-static method setVisible(boolean) from the type Window" und ich kann damit leider nicht so wirklich was anfangen. Heißt das dass man die methode in einenn nicht static block aufrufen muss?

sry bin neu zu java

kann komischerweise keinen code posten wie es grade aussieht
 
K

kneitzel

Gast
setVisible ist eine Methode, die Du auf einer Instanz aufrufen musst. Du kannst es nicht direkt auf einer Klasse aufrufen.
 
K

kneitzel

Gast
Das Problem ist, dass Du nicht schreibst, was genau nicht geht. Du hast ja eben eine Antwort gepostet ... daher scheint es erst einmal zu gehen ...
 

Blender3D

Top Contributor
Mein Ziel war es herauszufinden wie ich ein frame Wechsel per Button klick. Leider weiß ich nicht weiter.
Test:
public class Test {
    public static void main(String[] args) {
        ChangeFrame frame = new ChangeFrame(400, 400);
        frame.setVisible(true);
    }
}
ChangeFrame:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Iterator;
import java.util.Random;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class ChangeFrame extends JFrame {
    private final static Random rnd = new Random(System.currentTimeMillis());
    private static int cnt = 0;
    private int nr;
    private static Vector<ChangeFrame> active = new Vector<ChangeFrame>();
    private JButton add = new JButton("add");
    private JButton next = new JButton("next");

    public ChangeFrame(int width, int height) {
        setPreferredSize(new Dimension(width, height));
        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(width, height));
        panel.add(next);
        panel.add(add);
        add(panel);
        nr = cnt++;
        setTitle("Frame (" + nr + ")");
        active.add(this);
        setLocation(rnd.nextInt(width / 2), rnd.nextInt(height / 2));
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.out.println("frame nr " + nr + " closed!");
                JFrame frame = getNextFrame();
                active.remove(ChangeFrame.this);
                if (frame != ChangeFrame.this)
                    frame.setVisible(true);
                else
                    System.exit(1);
            }

            @Override
            public void windowOpened(WindowEvent e) {
                System.out.println("frame nr " + nr + " opened!");
                ChangeFrame frame = null;
                Iterator<ChangeFrame> it = active.iterator();
                while (it.hasNext()) {
                    frame = it.next();
                    if (!frame.equals(ChangeFrame.this))
                        frame.setVisible(false);
                }
            }
        });
        panel.setBackground(getRndColor());
        setResizable(false);
        pack();
        next.addActionListener(e -> {
            ChangeFrame frame = getNextFrame();
            if (frame != null) {
                setVisible(false);
                frame.setVisible(true);
            }
        });
        add.addActionListener(e -> {
            ChangeFrame frame = new ChangeFrame(getWidth(), getHeight());
            frame.setVisible(true);
        });
    }

    private ChangeFrame getNextFrame() {
        Iterator<ChangeFrame> it = active.iterator();
        while (it.hasNext()) {
            ChangeFrame frame = it.next();
            if (frame == this) {
                if (it.hasNext())
                    return it.next();
                return active.iterator().next();
            }
        }
        return null;
    }

    private Color getRndColor() {
        return new Color(rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256));
    }
}
 

Neumi5694

Top Contributor
Was ich schon mal grundsätzlich seltsam finde, ist dass eine Liste von Fenstern im Fenster abgespeichert wird. Diese Liste ist diesen Fenstern übergeordnet, sollte außerhalb stehen, ebenso die Methoden zum Wechseln des Fensters.
An die einzelnen Fenster wird im ActionListener die Referenz auf die Klasse übergeben, welche die Methode zum wechseln anbietet.

Ein Iterator ist hier nur bedingt geeignet. Mein Ansatz wäre, in der Liste von Fenstern (verwende ArrayList und nicht Vector, Vector ist veraltet)
1. zu prüfen, ob sie mehr als ein Element hat. Falls nicht, hat sich das mit dem Wechsel eh erledigt.
2. mit indexOf den Index des aktuellen Fensters zu ermitteln. Dann diesen um 1 zu erhöhen, gegebenenfalls (falls das Ende der Liste erreicht ist) auf 0 zu setzen. Das geht ganz einfach mit einem Modulo-Operator.

Java:
int nextIndex = list.isEmpty() ? -1 : (list.indexOf(currentFrame)+1) % list.length();

Kleiner Tip. Lass dir im jeden Schritt der Methode was ausgeben, wie die Indizes z.B. oder in deinem Fall, was bei den Bedingungen mit dem Iterator passiert ist. So kriegst du dann auch gleich eine Rückmeldung, ob die Methode überhaupt angesprochen wurde, bzw. der Actionlistener aktiviert wurde.
"Geht nicht gibt's nicht".

Java:
if (it.hasNext()) {
    System.out.println("it has next. Returning it.next()");
    return it.next();
} else {
    System.out.println("it has no next element. Doing something else");
    return active.iterator().next();
}

Sobald's funktioniert, kannst du die Log-Einträge wieder rauslöschen.
 

Symfuhny

Mitglied
Test:
public class Test {
    public static void main(String[] args) {
        ChangeFrame frame = new ChangeFrame(400, 400);
        frame.setVisible(true);
    }
}
ChangeFrame:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Iterator;
import java.util.Random;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class ChangeFrame extends JFrame {
    private final static Random rnd = new Random(System.currentTimeMillis());
    private static int cnt = 0;
    private int nr;
    private static Vector<ChangeFrame> active = new Vector<ChangeFrame>();
    private JButton add = new JButton("add");
    private JButton next = new JButton("next");

    public ChangeFrame(int width, int height) {
        setPreferredSize(new Dimension(width, height));
        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(width, height));
        panel.add(next);
        panel.add(add);
        add(panel);
        nr = cnt++;
        setTitle("Frame (" + nr + ")");
        active.add(this);
        setLocation(rnd.nextInt(width / 2), rnd.nextInt(height / 2));
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.out.println("frame nr " + nr + " closed!");
                JFrame frame = getNextFrame();
                active.remove(ChangeFrame.this);
                if (frame != ChangeFrame.this)
                    frame.setVisible(true);
                else
                    System.exit(1);
            }

            @Override
            public void windowOpened(WindowEvent e) {
                System.out.println("frame nr " + nr + " opened!");
                ChangeFrame frame = null;
                Iterator<ChangeFrame> it = active.iterator();
                while (it.hasNext()) {
                    frame = it.next();
                    if (!frame.equals(ChangeFrame.this))
                        frame.setVisible(false);
                }
            }
        });
        panel.setBackground(getRndColor());
        setResizable(false);
        pack();
        next.addActionListener(e -> {
            ChangeFrame frame = getNextFrame();
            if (frame != null) {
                setVisible(false);
                frame.setVisible(true);
            }
        });
        add.addActionListener(e -> {
            ChangeFrame frame = new ChangeFrame(getWidth(), getHeight());
            frame.setVisible(true);
        });
    }

    private ChangeFrame getNextFrame() {
        Iterator<ChangeFrame> it = active.iterator();
        while (it.hasNext()) {
            ChangeFrame frame = it.next();
            if (frame == this) {
                if (it.hasNext())
                    return it.next();
                return active.iterator().next();
            }
        }
        return null;
    }

    private Color getRndColor() {
        return new Color(rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256));
    }
}
Erstmal danke fpr den Code aber bringt mir leider nix wenn ich es nicht nachvollziehen kann und dann nicht selber umsetzen kann. Trz danke für deinen Beitrag
 

Symfuhny

Mitglied
Das Problem ist, dass Du nicht schreibst, was genau nicht geht. Du hast ja eben eine Antwort gepostet ... daher scheint es erst einmal zu gehen ...
So wie es im Code ist funktioniert es zwar aber mit sehr vielen Fehler und glaube ist nicht so richtig. Ich hab im ActionListener das frame neu deklarieren müssen damit es funktioniert.

Ich denke da gibt es einfache Methode das umzusetzen. Müsste es nicht einfach gehen das wenn der Button gedrückt wird dann setVisbile(true) um das neue fenster zu erscheinen und dann setVisible (false) für das andere Fenster damit es schließt.


view:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;

public class changeView extends JFrame{
    
    JButton change ;
    
    
    public changeView() {
        
        setSize(400,400) ;
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
        setLayout(null) ;
        setLocation(500, 300);
        
        change = new JButton ("Change") ;
        change.setBounds(100, 50, 50, 50);
        add(change) ;
        
        viewChange view1 = new viewChange();
        
        change.addActionListener(view1);
        
        
        setVisible(true) ;
        
        
    }
    
    public class viewChange implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            
            if (e.getSource() == change )
                SwingUtilities.invokeLater(() -> {
                    frame frame = new frame();
                    frame.setVisible(true);
                    frame.toFront();
                    changeView changeView = new changeView();
                    changeView.setVisible(false);
                });
            
    
            
                
            
        }

        
        
    }
}
 

mihe7

Top Contributor
Hier ein Beispiel:
Java:
import java.awt.event.*;
import javax.swing.*;

public class Test {

    private JFrame frame1;
    private JFrame frame2;

    private void showOtherFrame(ActionEvent e) {
        JComponent comp = (JComponent) e.getSource();
        JFrame frame = (JFrame) SwingUtilities.getWindowAncestor(comp);

        JFrame toShow = frame == frame1 ? frame2 : frame1;
        JFrame toHide = frame == frame1 ? frame1 : frame2;
        switchFrames(toShow, toHide);
    }

    private void switchFrames(JFrame toShow, JFrame toHide) {
        SwingUtilities.invokeLater(() -> {
            toShow.setVisible(true);
            toShow.toFront();
            toHide.setVisible(false);
        });
    }

    public void run() {
        frame1 = buildFrame("Frame 1");
        frame2 = buildFrame("Frame 2");
        frame1.setVisible(true);
    }

    private JFrame buildFrame(String title) {
        JButton toggle = new JButton("Zum anderen Fenster...");
        toggle.addActionListener(this::showOtherFrame);

        JPanel panel = new JPanel();
        panel.add(toggle);

        JFrame frame = new JFrame(title);
        frame.add(panel);
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                frame1.dispose();
                frame2.dispose();
            }
        });
        frame.setSize(600, 400);
        return frame;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Test().run());
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Exportierte JAR öffnet zweiten Frame nicht mehr Java Basics - Anfänger-Themen 7
C Erkennen ob Frame geschlossen wurde Java Basics - Anfänger-Themen 2
C Erste Schritte Spieler an anderen Frame weitergeben Java Basics - Anfänger-Themen 23
G Probleme bei Frame aufgaben Java Basics - Anfänger-Themen 6
CptK Interface Klasse Frame (extends JFrame) aus anderer Klasse schließen Java Basics - Anfänger-Themen 7
S Interface (WindowBuilder) Panels in einen Frame einfügen Java Basics - Anfänger-Themen 10
S Nach dem Herüberschieben eines Arrays zwischen 2 Frames öffnet sich das Frame nicht mehr Java Basics - Anfänger-Themen 12
S in ActionListener auf Eingabe aus anderem Frame warten Java Basics - Anfänger-Themen 2
D Interface Frame doppelt durch Aufruf der GUI Klasse Java Basics - Anfänger-Themen 1
M Erste Schritte Neuen Frame nur einmal offen haben Java Basics - Anfänger-Themen 6
schoenosrockos JButton füllt immer das ganze frame Java Basics - Anfänger-Themen 1
R Erste Schritte Frame mit Ladebalken und BestätigungsButton Java Basics - Anfänger-Themen 10
das_leon Interface Frame in einem Frame (Window Builder) Java Basics - Anfänger-Themen 2
Anfänger2011 Frame zeigt nicht gewünschtes Ergebnis an ... Java Basics - Anfänger-Themen 5
Z Object Kreis am Frame abprallen lassen! Java Basics - Anfänger-Themen 12
D Bild in Frame einfügen Java Basics - Anfänger-Themen 11
I Methoden Schwierikeiten mit Protokollfenster (Frame Objekt) Java Basics - Anfänger-Themen 4
A mehrere Panels in eigenen Klasssen in einem Frame Java Basics - Anfänger-Themen 16
J Extra Fenster (Frame) Java Basics - Anfänger-Themen 20
W Frame in anderer Klasse anzeigen lassen Java Basics - Anfänger-Themen 1
E Von Instanz des Dialogs auf das Frame zugreifen Java Basics - Anfänger-Themen 8
E 2. JFrame erkennt 1. Frame Java Basics - Anfänger-Themen 6
C Bild ins Frame laden und Objekte drüber legen Java Basics - Anfänger-Themen 1
R File chooser Dateien in frame anzeigen lassen Java Basics - Anfänger-Themen 5
L bestimmten Frame anzeigen lassen? Java Basics - Anfänger-Themen 6
H Textfeldinhalt löschen nachdem Frame geschlossen wird Java Basics - Anfänger-Themen 8
L Kalender Java Frame Java Basics - Anfänger-Themen 7
A Frame Java Basics - Anfänger-Themen 3
P Verwirrung mit AWT Frame und main Methode Java Basics - Anfänger-Themen 19
A Frame java Java Basics - Anfänger-Themen 3
D Frame schließt gleich alle Frames Java Basics - Anfänger-Themen 5
T udp -> bytearray -> image -> ausgabe via frame Java Basics - Anfänger-Themen 6
J Erste Schritte Speichern / Speichern unter / title Frame Java Basics - Anfänger-Themen 5
F Frame in Frame Java Basics - Anfänger-Themen 3
U GUI - resize frame Java Basics - Anfänger-Themen 13
J Open reading Frame Java Basics - Anfänger-Themen 4
J Erstelltes Frame wird nicht angezeigt Java Basics - Anfänger-Themen 2
K Frame öffnen klappt nicht?! Java Basics - Anfänger-Themen 36
JAVAnnik Anwendung nach Schließen vom letzen Frame Java Basics - Anfänger-Themen 9
B Referenz zu anderen Frame Java Basics - Anfänger-Themen 10
A Frame Background Java Basics - Anfänger-Themen 21
S Klassen Klassenname = Frame? Java Basics - Anfänger-Themen 11
R Eingefärbtes Panel wird in Frame nicht angezeigt Java Basics - Anfänger-Themen 10
I Java - Text in neuem Frame wird nicht angezeigt Java Basics - Anfänger-Themen 4
M Frame mit mehreren areas Java Basics - Anfänger-Themen 14
B Frame über Button öffnen Java Basics - Anfänger-Themen 8
R Button soll neuen Frame öffnen Java Basics - Anfänger-Themen 21
L Variablen Frame Variablen-Schleife Java Basics - Anfänger-Themen 3
D Neues Frame öffnen Java Basics - Anfänger-Themen 7
V Frame bleibt grau Java Basics - Anfänger-Themen 5
G Polygon in Frame zeichnen Java Basics - Anfänger-Themen 3
F frame wird nicht angezeigt? Java Basics - Anfänger-Themen 10
S 2 Panels in einen Frame Java Basics - Anfänger-Themen 5
H Panels in Frame einbinden Java Basics - Anfänger-Themen 3
E Frame neu Zeichnen Java Basics - Anfänger-Themen 3
A Bild wird auf Frame nicht angezeigt! Keine Fehlermeldung Java Basics - Anfänger-Themen 3
O Grafik in Frame laden Java Basics - Anfänger-Themen 9
T Frame öffnen Java Basics - Anfänger-Themen 6
I 1 Frame und mehrere Panels klappt nicht Java Basics - Anfänger-Themen 4
I JTable in bestehenden Frame integrieren Java Basics - Anfänger-Themen 6
Y Hilfe: JOGL / OPENGL in Frame Java Basics - Anfänger-Themen 2
J Frame schließen, Ereignis behandeln, Vorgang abbrechen Java Basics - Anfänger-Themen 4
Luk10 Frame schließen Java Basics - Anfänger-Themen 2
A Frame schließen!? Help! Java Basics - Anfänger-Themen 5
A Frame reagiert nicht Java Basics - Anfänger-Themen 6
H Modalen JDialog schließen, ohne dabei das Parent-Frame zu schließen Java Basics - Anfänger-Themen 7
J Frame bleibt schwarz beim Laden Java Basics - Anfänger-Themen 11
ModellbahnerTT Unterschied zwischen zwei Frame close Varianten Java Basics - Anfänger-Themen 3
R Frame Inhalt ausrichten Java Basics - Anfänger-Themen 5
MisterSeven Java Swing - Wie Frame größe festlegen?! Java Basics - Anfänger-Themen 10
E Verständnisfrage Syntax: frame.getContentPane().add(button) Java Basics - Anfänger-Themen 11
Stillmatic1985 Label in einem Frame zentrieren Java Basics - Anfänger-Themen 4
A Grafik erstellen und in Frame einfügen Java Basics - Anfänger-Themen 17
A Java Frame per X schließen? Java Basics - Anfänger-Themen 7
H2SO3- image beim awt frame wegmachen Java Basics - Anfänger-Themen 2
kulturfenster Panel in Frame integrieren Java Basics - Anfänger-Themen 5
kulturfenster Per Button Frame schliessen Java Basics - Anfänger-Themen 2
C Frame, JFrame, JDialog Java Basics - Anfänger-Themen 12
I JButton zum frame schließen Java Basics - Anfänger-Themen 6
M Variable in Frame anzeigen Java Basics - Anfänger-Themen 11
O Beim Schließen JDialog, im Frame-Owner eine Methode starten Java Basics - Anfänger-Themen 6
hdi Desktop-Auflösung abfragen -> setLocation() von Frame Java Basics - Anfänger-Themen 5
hdi keylistener hat keinen fokus oder: listener ohne frame? Java Basics - Anfänger-Themen 10
S Übergabe von Frame-Objekt - kritisch? Java Basics - Anfänger-Themen 7
N Frame in Frame erstellen Java Basics - Anfänger-Themen 2
B Java-Frame Taschenrechner - String -> Int und umgekehrt Java Basics - Anfänger-Themen 8
G Bild wird im falschen Frame angezeigt Java Basics - Anfänger-Themen 5
G Frame soll Focus behalten Java Basics - Anfänger-Themen 2
H Frame schließen Java Basics - Anfänger-Themen 5
G Frame Applet oder doch was anderes Java Basics - Anfänger-Themen 2
M Frame zeigt Desktop als Hintergrund Java Basics - Anfänger-Themen 2
J Eine swf-datei in einen Frame einfügen? Java Basics - Anfänger-Themen 6
K Schrift und Farben im Frame (Anfänger) Java Basics - Anfänger-Themen 2
D Frame in Center Screen Java Basics - Anfänger-Themen 7
A Frame aus Applet erzeugen und mit Inhalt füllen Java Basics - Anfänger-Themen 5
G Problemme mit: Aufruf einer Klasse aus einem Frame Java Basics - Anfänger-Themen 5
M Frame Schließen Java Basics - Anfänger-Themen 5
H homepage in frame aufrufen Java Basics - Anfänger-Themen 2
G Hintergrundbild in Frame Java Basics - Anfänger-Themen 15
C JDialog Werte nach Frame übergeben Java Basics - Anfänger-Themen 10

Ähnliche Java Themen


Oben