Travailler avec plusieurs panneaux dans un cadre

J'ai un problème lorsque je veux un programme pour basculer entre plusieurs panneaux dans un même cadre. Les problèmes que je rencontre est que je ne peux définir la mise en page, lorsque les panneaux de l'interrupteur et après le passage du contenu est l'abaissement de pixel par pixel. Voici mon code.

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import javax.swing.JFrame;

public class Main {

    public static boolean logged_in = false;

    public static int width = 200, height = 400;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Dimension d = new Dimension(width, height);
                    First frame = new First();
                         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setSize(d);
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                    frame.setResizable(true);
                    frame.setLayout(new FlowLayout());  
                } catch (Exception e) { 
                    e.printStackTrace();    
                }
            }
        });
    }
}

et voici les deux classes qui contiennent des images.

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class First extends JFrame {
JPanel contentPane;
private JButton button_1;
private JTextField text;
public First(){
contentPane = new JPanel();
setContentPane(contentPane);
button_1 = new JButton("Second frame");
button_1.setVisible(true);
text = new JTextField(20);
text.setVisible(true);
contentPane.add(button_1);
contentPane.add(text);
thehandler handler = new thehandler();
button_1.addActionListener(handler);
}
private class thehandler implements ActionListener {
public void actionPerformed(ActionEvent event) {
if (event.getSource() == button_1) {
contentPane.removeAll();
contentPane.invalidate();
Second frame = new Second();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setResizable(true);
frame.setLayout(new FlowLayout());
frame.contentPane.setVisible(true);
contentPane.add(frame.contentPane);
((JPanel) contentPane).revalidate();
contentPane.setSize(200, 400);
contentPane.repaint();
}
}
}
}

et le second

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Second extends JFrame {
JPanel contentPane;
private JButton button_1;
private JTextField text;
public Second(){
contentPane = new JPanel();
setContentPane(contentPane);
button_1 = new JButton("First frame");
button_1.setVisible(true);
text = new JTextField(20);
text.setVisible(true);
contentPane.add(button_1);
contentPane.add(text);
thehandler handler = new thehandler();
button_1.addActionListener(handler);
}
private class thehandler implements ActionListener {
public void actionPerformed(ActionEvent event) {
if (event.getSource() == button_1) {
contentPane.removeAll();
contentPane.invalidate();
First frame = new First();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setResizable(true);
frame.setLayout(new FlowLayout());
frame.contentPane.setVisible(true);
contentPane.add(frame.contentPane);
((JPanel) contentPane).revalidate();
contentPane.setSize(200, 400);
contentPane.repaint();
}
}
}
}

Toute aide est appréciée. Veuillez garder à l'esprit que je ne suis pas si bon avec java GUI. Ty.

MODIFIER Après beaucoup de temps à la recherche d'une réponse que j'ai obtenu un. Il n'est probablement pas parfait, mais je le posterai à l'avenir ou si quelqu'un d'autre a besoin de cette solution. Voici le code.

Cadre principal qui tient les panneaux:

import javax.swing.JFrame;
import javax.swing.JPanel;
public class MainFrame extends JFrame {
public static JPanel main_panel;
private static FirstFrame first;
public MainFrame(){
setLayout(null);    
setSize(400, 400);
setLocationRelativeTo(null);
setResizable(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
main_panel = new JPanel();
main_panel.setBounds(0, 0, 400, 400);
add(main_panel);
main_panel.invalidate();
main_panel.removeAll();
first = new FirstFrame();
main_panel.add(first);
main_panel.revalidate();
main_panel.repaint();
}
public static void main(String[] args) {
MainFrame frame = new MainFrame();
frame.setVisible(true);
}
}

Premier panneau:

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;
public class FirstFrame extends JPanel {
private JButton button;
public FirstFrame() {
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(400, 400));
panel.setLayout(null);
button = new JButton("First");
button.setBounds(20, 20, 200, 40);
button.setVisible(true);
thehandler handler = new thehandler();
button.addActionListener(handler);
panel.add(button);
add(panel);
revalidate();
repaint();
}
private class thehandler implements ActionListener {
public void actionPerformed(ActionEvent event) {
if (event.getSource() == button) {
MainFrame.main_panel.invalidate();
MainFrame.main_panel.removeAll();
SecondFrame frame = new SecondFrame();
MainFrame.main_panel.add(frame);
MainFrame.main_panel.revalidate();
MainFrame.main_panel.repaint();
}
}
}
}

Deuxième:

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;
public class SecondFrame extends JPanel {
private JButton button;
public SecondFrame() {
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(400, 400));
panel.setLayout(null);
button = new JButton("Second");
button.setBounds(20, 20, 200, 40);
button.setVisible(true);
thehandler handler = new thehandler();
button.addActionListener(handler);
panel.add(button);
add(panel);
revalidate();
repaint();
}
private class thehandler implements ActionListener {
public void actionPerformed(ActionEvent event) {
if (event.getSource() == button) {
MainFrame.main_panel.invalidate();
MainFrame.main_panel.removeAll();
ThirdFrame frame = new ThirdFrame();
MainFrame.main_panel.add(frame);
MainFrame.main_panel.revalidate();
MainFrame.main_panel.repaint();
}
}
}
}

Et le troisième:

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;
public class ThirdFrame extends JPanel {
private JButton button;
public ThirdFrame() {
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(400, 400));
panel.setLayout(null);
button = new JButton("Third");
button.setBounds(20, 20, 200, 40);
button.setVisible(true);
thehandler handler = new thehandler();
button.addActionListener(handler);
panel.add(button);
add(panel);
revalidate();
repaint();
}
private class thehandler implements ActionListener {
public void actionPerformed(ActionEvent event) {
if (event.getSource() == button) {
MainFrame.main_panel.invalidate();
MainFrame.main_panel.removeAll();
FirstFrame frame = new FirstFrame();
MainFrame.main_panel.add(frame);
MainFrame.main_panel.revalidate();
MainFrame.main_panel.repaint();
}
}
}
}

Comme vous pouvez le voir, vous pouvez l'interrupteur du panneau 1 ->2 ->3 et retour à 1, mais pas la seconde.
Ty a tous pour vos réponses, elles ont été utiles. D'autres suggestions sont les bienvenus.

+1 pour la belle question 1. pourquoi CardLayout est là, 2. et un peu de l'autre (important peut-être pas, peut-être ...) des erreurs
pourquoi ne pas basculer le volet de contenu au lieu et revalidate()
Essayez CardLayout pour votre volet de contenu.
Pour chaque action, vous mettre une autre image dans une fenêtre de contenu (qui est alors dans un cadre dans un volet de contenu ...), c'est à dire la hiérarchie devient plus profonde et plus profonde.
Donc, c'est la raison pour laquelle il diminue à chaque fois? Si oui quelqu'un peut essayer et corriger le code de sorte qu'il fonctionne correctement. Ty

OriginalL'auteur user2319690 | 2013-04-25