Por si a alguien que estuviera en mi misma situación le interesara, expongo el código a partir del cual conseguí hacer funcionar mi programa como quería: desde el main escojo la ventana a la que ir mediante botones, cerrando y abriendo respectivamente, y pudiendo volver a la ventana inicial desde otro botón en la secundaria.
Hasta yo lo entiendo

(es broma, Xerelo)
El main:
Código:
import javax.swing.*;
import java.awt.event.*;
public class Login extends JFrame implements ActionListener {
private JPanel panelLogin;
Login(){
panelLogin = new JPanel();
panelLogin.setLayout(null);
setBounds(50,50,400,400);
setTitle("Ventana de Login");
setContentPane(panelLogin);
JButton btnLogin1 = new JButton("Ventana 1");
btnLogin1.setBounds(150,100,100,50);
btnLogin1.setActionCommand("ventana1");
btnLogin1.addActionListener(this);
panelLogin.add(btnLogin1);
JButton btnLogin2 = new JButton("Ventana 2");
btnLogin2.setBounds(150,250,100,50);
btnLogin2.setActionCommand("ventana2");
btnLogin2.addActionListener(this);
panelLogin.add(btnLogin2);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
public static void main(String[] args) {
new Login();
}
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("ventana1")) {
new Ventana1(this);
}
else if (e.getActionCommand().equals("ventana2")) {
new Ventana2(this);
}
}
}
La clase Ventana1, idéntica a Ventana2 con las salvedades evidentes, es decir, sustituir los "1" por "2" y listo:
Código:
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
class Ventana1 extends JFrame implements ActionListener {
JFrame ventanaLogin;
private JPanel panel1;
Ventana1(JFrame ventanaLogin) {
this.ventanaLogin = ventanaLogin;
ventanaLogin.setVisible(false);
panel1 = new JPanel();
setTitle("Ventana 1");
panel1.setLayout(null);
setBounds(200,200,400,400);
setContentPane(panel1);
JButton btnP1 = new JButton("Salir 1");
btnP1.addActionListener(this);
panel1.add(btnP1);
btnP1.setBounds(150,200,100,50);
this.setVisible(true);
// Con la linea sig. saldría de la aplicación
// Sin la linea sig. vuelve a Login si clic en X, igual que botón "salir"
// this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.addWindowListener(new Ventana1.ManejadorDeVentana1());
}
private void activarVentanaLogin() {
this.setVisible(false);
ventanaLogin.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
activarVentanaLogin();
}
class ManejadorDeVentana1 extends WindowAdapter{
public void windowClosing(WindowEvent e) {
activarVentanaLogin();
}
}
}