Как показать значение текстового поля одной карты на другой карте в CardLayout Swap

Я пытаюсь отобразить имя пользователя на следующей карточке после того, как пользователь вошел в систему, и мне не повезло.

Я использую CardLayout и определил две карты: одну карту для ввода пользователем имени и пароля, а вторую — для отображения приветственного сообщения с именем пользователя, вошедшим в систему. Я изучаю Java и Swing самостоятельно, а не экспертом. Буду очень признателен за любую помощь, включая исправление этого кода или ссылки, о которых я мог бы прочитать.

Вот мой текущий код (еще нужно добавить код для обновления текстового поля экрана приветствия):

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class CardTest
{   
    private JFrame frame;
    public static final String CARD_LOGIN =  "Card Login"; 
    public static final String CARD_DEPARTMENT = "Card Department";
    public static final String CARD_TEAM = "Card Team";
    public static JPanel cards;
    public Employee employee = null;
    public CardLogin cardLogin = null;
    public CardDepartment cardDepartment = null;
    public CardTeam cardTeam = null;

    public CardTest()
    {
        Employee employee = new Employee();

        frame = new JFrame("Card Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationByPlatform(true);

        cards = new JPanel();
        cards.setLayout(new CardLayout(20, 20));

        cardLogin = new CardLogin(this, employee);
        cardDepartment = new CardDepartment(this, employee);
        cardTeam = new CardTeam(this, employee);

        cards.add(cardLogin, CARD_LOGIN);       
        cards.add(cardDepartment, CARD_DEPARTMENT);
        cards.add(cardTeam, CARD_TEAM);

        frame.getContentPane().add(cards);
        frame.pack();
        frame.setVisible(true);
    }

    public void swapView(String key) 
    {
        CardLayout cardLayout = (CardLayout) cards.getLayout();
        cardLayout.show(cards, key);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new CardTest();
            }
        });
    }
}

class CardLogin extends JPanel 
{ 
    private ActionListener action; 
    private JTextField tfUsername= null; 
    Employee employee;
    CardTest cardTest;

    public CardLogin(CardTest cardTest, Employee employee) 
    { 
        this.cardTest = cardTest;
        this.employee = employee;
        init(); 
    } 

    private void init() 
    { 
        JPanel panel = new JPanel(new GridBagLayout());
        GridBagConstraints gc = new GridBagConstraints();

        gc.fill = GridBagConstraints.HORIZONTAL;

        JLabel lbCardName = new JLabel("Login Card ");
        gc.gridx = 1;
        gc.gridy = 0;
        gc.gridwidth = 2;
        panel.add(lbCardName, gc);

        JLabel lbUsername = new JLabel("Username: ");
        gc.gridx = 0;
        gc.gridy = 2;
        gc.gridwidth = 1;
        panel.add(lbUsername, gc);

        tfUsername = new JTextField(20);
        gc.gridx = 1;
        gc.gridy = 2;
        gc.gridwidth = 2;
        panel.add(tfUsername, gc);

        JLabel lbPassword = new JLabel("Password: ");
        gc.gridx = 0;
        gc.gridy = 3;
        gc.gridwidth = 1;
        panel.add(lbPassword, gc);

        JPasswordField pfPassword = new JPasswordField(20);
        gc.gridx = 1;
        gc.gridy = 3;
        gc.gridwidth = 2;
        panel.add(pfPassword, gc);

        final JButton loginButton = new JButton("Login"); 

        action = new ActionListener() 
        { 
            public void actionPerformed(ActionEvent ae) 
            {
                if (tfUsername.getDocument().getLength() > 0)   
                {
                    employee.setUserName(tfUsername.getText());
                    cardTest.swapView(cardTest.CARD_DEPARTMENT);
                }
            } 
        }; 

        loginButton.addActionListener(action); 

        JPanel bp = new JPanel();
        bp.add(loginButton);

        setSize( 640, 480);

        add(panel, BorderLayout.CENTER);
        add(bp, BorderLayout.PAGE_END);
    } 
} 

class CardDepartment extends JPanel 
{ 
    private ActionListener actionNext; 
    private ActionListener actionLogout; 
    private JTextField tfDepartment= null; 
    private String department= null;
    Employee employee;
    CardTest cardTest;
    CardLogin cardLogin;

    public CardDepartment(CardTest cardTest, Employee employee) 
    { 
        this.employee = employee;
        this.cardTest = cardTest;
        init(); 
    } 

    private void init() 
    { 
        JPanel panel = new JPanel(new GridBagLayout());
        GridBagConstraints gc = new GridBagConstraints();
        gc.fill = GridBagConstraints.HORIZONTAL;

        JLabel lbCardName = new JLabel("Department Card ");
        gc.gridx = 1;
        gc.gridy = 0;
        gc.gridwidth = 2;
        panel.add(lbCardName, gc);

        JLabel lbWelcome = new JLabel("Welcome ");
        gc.gridx = 0;
        gc.gridy = 2;
        gc.gridwidth = 1;
        panel.add(lbWelcome, gc);

        gc.gridx = 1;
        gc.gridy = 2;
        gc.gridwidth = 2;
        panel.add(new JLabel(employee.getUserName()), gc);

        JLabel lbDepartment = new JLabel("Enter Department: ");
        gc.gridx = 0;
        gc.gridy = 3;
        gc.gridwidth = 1;
        panel.add(lbDepartment, gc);

        tfDepartment = new JTextField(20);
        gc.gridx = 1;
        gc.gridy = 3;
        gc.gridwidth = 2;
        panel.add(tfDepartment, gc);

        final JButton nextButton = new JButton("Next"); 
        actionNext = new ActionListener() 
        { 
            public void actionPerformed(ActionEvent ae) 
            {
                if (tfDepartment.getDocument().getLength() > 0)   
                {
                    department = tfDepartment.getText();
                    cardTest.swapView(cardTest.CARD_TEAM);
                }
            } 
        }; 

        final JButton logoutButton = new JButton("Logout"); 
        actionLogout = new ActionListener() 
        { 
            public void actionPerformed(ActionEvent ae) 
            {
                    cardTest.swapView(cardTest.CARD_LOGIN);
            } 
        }; 

        nextButton.addActionListener(actionNext); 
        logoutButton.addActionListener(actionLogout); 

        JPanel bp = new JPanel();
        bp.add(panel);
        bp.add(logoutButton);
        bp.add(nextButton);

        add(panel);
        add(bp); 
    } 
}

class CardTeam extends JPanel 
{ 
    private ActionListener actionPrev; 
    private ActionListener actionLogout; 
    private JTextField tfTeam= null; 
    Employee employee;
    CardTest cardTest;

    public CardTeam(CardTest cardTest, Employee employee) 
    { 
        this.cardTest = cardTest;
        this.employee = employee;
        init(); 
    } 

    private void init() 
    { 
        JPanel panel = new JPanel(new GridBagLayout());
        GridBagConstraints gc = new GridBagConstraints();
        gc.fill = GridBagConstraints.HORIZONTAL;

        JLabel lbCardName = new JLabel("Team Card ");
        gc.gridx = 1;
        gc.gridy = 0;
        gc.gridwidth = 2;
        panel.add(lbCardName, gc);

        JLabel lbWelcome = new JLabel("Welcome ");
        gc.gridx = 0;
        gc.gridy = 2;
        gc.gridwidth = 1;
        panel.add(lbWelcome, gc);

        gc.gridx = 1;
        gc.gridy = 2;
        gc.gridwidth = 2;
        panel.add(new JLabel(employee.getUserName()), gc);

        JLabel lbDepartment = new JLabel("Department: ");
        gc.gridx = 0;
        gc.gridy = 3;
        gc.gridwidth = 1;
        panel.add(lbDepartment, gc);

        gc.gridx = 1;
        gc.gridy = 3;
        gc.gridwidth = 2;
        panel.add(new JLabel(employee.getDepartment()), gc);

        JLabel lbTeam = new JLabel("Enter Team: ");
        gc.gridx = 0;
        gc.gridy = 4;
        gc.gridwidth = 1;
        panel.add(lbTeam, gc);

        tfTeam = new JTextField(20);
        gc.gridx = 1;
        gc.gridy = 4;
        gc.gridwidth = 2;
        panel.add(tfTeam, gc);

        final JButton prevButton = new JButton("Prev"); 
        actionPrev = new ActionListener() 
        { 
            public void actionPerformed(ActionEvent ae) 
            {
                    cardTest.swapView(cardTest.CARD_DEPARTMENT);
            } 
        }; 

        final JButton logoutButton = new JButton("Logout"); 
        actionLogout = new ActionListener() 
        { 
            public void actionPerformed(ActionEvent ae) 
            {
                    cardTest.swapView(cardTest.CARD_LOGIN);
            } 
        }; 

        prevButton.addActionListener(actionPrev); 
        logoutButton.addActionListener(actionLogout); 

        JPanel bp = new JPanel();
        bp.add(logoutButton);
        bp.add(prevButton);

        add(panel);
        add(bp); 
    } 
}

class Employee
{ 
    private String userName = null;
    private String department = null;
    private String team = null;

    public Employee() {
        super();
    }

    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getDepartment() {
        return department;
    }
    public void setDepartment(String department) {
        this.department = department;
    }
    public String getTeam() {
        return team;
    }
    public void setTeam(String team) {
        this.team = team;
    }
}

person Arif Hameed    schedule 06.03.2012    source источник
comment
@AtifHameed: Пожалуйста, проверьте этот CardLayoutCode, который я немного изменил, это один из способов обновить информацию на более поздняя стадия. Пожалуйста, предоставьте мне код или папку проекта, чтобы я мог взглянуть на проект в целом.   -  person nIcE cOw    schedule 09.03.2012


Ответы (2)


Вы объявляете и инициализируете JPanel cards дважды в своем коде, один раз как переменную экземпляра и второй раз внутри конструктора класса CardLayoutLoginTest. Поскольку у вас пошаговая штука, лучше добавить свои JPanel, которые действуют как Cards, один за другим к CardLayout. Поскольку, если LoginFails вам не понадобятся, просто когда вход в систему действителен, добавьте то, что вы хотите добавить в CardLayout.

Используйте setLocationByPlatform(true) ; вместо setLocationRelativeTo(null);. Первый лучше, как объяснил @Andrew Thompson в одном из своих сообщений, Как лучше всего позиционировать Swing Графический интерфейс Я изменил ваш код, посмотрите и дайте мне знать, если чего-то не хватает.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class CardTest
{   
    private JFrame frame;
    public static final String CARD_LOGIN =  "Card Login"; 
    public static final String CARD_WELCOME = "Card Welcome";
    public static JPanel cards;
    public CardLogin cardLogin = null;

    public CardTest()
    {
        frame = new JFrame("Card LOGIN");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationByPlatform(true);

        cards = new JPanel();
        cards.setLayout(new CardLayout(20, 20));

        cardLogin = new CardLogin(this);
        cards.add(cardLogin, CARD_LOGIN);       

        frame.getContentPane().add(cards);
        frame.pack();
        frame.setVisible(true);
    }

    public void swapView(String key) 
    {
        CardLayout cardLayout = (CardLayout) cards.getLayout();
        cardLayout.show(cards, key);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new CardTest();
            }
        });
    }
}

class CardLogin extends JPanel 
{ 
    private ActionListener action; 
    CardTest cardLayoutLoginTest;
    /*
     *  Made JTextField an instance variable so that
     * ActionListener can access it or you can make 
     * it final.
     */
    private JTextField tfUsername= null; 
    private String username = null;

    public CardLogin(CardTest cardLayoutLoginTest) 
    { 
        this.cardLayoutLoginTest = cardLayoutLoginTest;
        init(); 
    } 

    private void init() 
    { 

        JPanel panel = new JPanel(new GridBagLayout());
        GridBagConstraints gc = new GridBagConstraints();

        gc.fill = GridBagConstraints.HORIZONTAL;

        JLabel lbUsername = new JLabel("Username: ");
        gc.gridx = 0;
        gc.gridy = 0;
        gc.gridwidth = 1;
        panel.add(lbUsername, gc);

        tfUsername = new JTextField(20);
        gc.gridx = 1;
        gc.gridy = 0;
        gc.gridwidth = 2;
        panel.add(tfUsername, gc);

        JLabel lbPassword = new JLabel("Password: ");
        gc.gridx = 0;
        gc.gridy = 1;
        gc.gridwidth = 1;
        panel.add(lbPassword, gc);

        JPasswordField pfPassword = new JPasswordField(20);
        gc.gridx = 1;
        gc.gridy = 1;
        gc.gridwidth = 2;
        panel.add(pfPassword, gc);

        final JButton loginButton = new JButton("Login"); 

        action = new ActionListener() 
        { 
            public void actionPerformed(ActionEvent ae) 
            {

                    // Here need code to update text filed of welcome card
                /*
                 * Here we are first checking if there is any text inside
                 * the JTextField for USERNAME, if found we will send it to the
                 * next JPanel which will be serving as a new Card.
                 */ 
                if (tfUsername.getDocument().getLength() > 0)   
                {
                    username = tfUsername.getText();
                    CardWelcome cardWelcome = new CardWelcome(cardLayoutLoginTest.cardLogin);
                    CardTest.cards.add(cardWelcome, cardLayoutLoginTest.CARD_WELCOME);
                    cardLayoutLoginTest.swapView(cardLayoutLoginTest.CARD_WELCOME);
                }
            } 
        }; 

        loginButton.addActionListener(action); 

        JPanel bp = new JPanel();
        bp.add(loginButton);

        /*set size of the frame*/
        setSize( 640, 480);

        add(panel, BorderLayout.CENTER);
        add(bp, BorderLayout.PAGE_END);

    } 

    public String getUserName()
    {
        return username;
    }
} 

class CardWelcome extends JPanel 
{ 
    private JTextField textField;
    private CardLogin cardLogin;

    public CardWelcome(CardLogin cl) 
    { 
        cardLogin = cl;
        init(); 
    } 

    private void init() 
    { 
        setLayout(new GridLayout(1, 1)); 
        JLabel userLabel = new JLabel("Welcome "); 
        textField = new JTextField(); 
        textField.setText(cardLogin.getUserName());
        System.out.println("UserName : " + cardLogin.getUserName());

        add(userLabel); 
        add(textField); 
    } 
}

Небольшой пример программы для обновления JLabel во время выполнения:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class UpdateLabel extends JFrame
{
    private int count = 0;
    public UpdateLabel()
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationByPlatform(true);

        final JPanel contentPane = new JPanel();
        contentPane.setLayout(new BorderLayout());

        final JLabel label = new JLabel("JLabel " + count);
        JButton button = new JButton("UPDATE JLABEL");
        button.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                count++;
                label.setText("JLabel " + count);
                contentPane.revalidate(); // sometimes you require to do this and the below line.
                contentPane.repaint();
            }
        });

        contentPane.add(label, BorderLayout.CENTER);
        contentPane.add(button, BorderLayout.PAGE_END);

        setContentPane(contentPane);
        pack();
        setVisible(true);
    }

    public static void main(String... args)
    {
        Runnable runnable = new Runnable()
        {
            public void run()
            {
                new UpdateLabel();
            }
        };
        SwingUtilities.invokeLater(runnable);
    }
}
person nIcE cOw    schedule 06.03.2012
comment
@ Ариф Хамид, вот ответ на ваш вопрос, пожалуйста, не забудьте принять этот ответ - person mKorbel; 06.03.2012
comment
@Gagandeep Bali, спасибо за быстрый ответ и за комментарии к дублирующему объявлению. Я боюсь, что это решение не подходит для реального проекта, так как у меня есть 7 карт, добавленных в колоду во время создания графического интерфейса, и пользователь может переключиться на любую карту, и некоторые данные будут переданы с активной карты на переключенную карту и даже при выходе из системы. с любой карты снова отобразит карту входа. Эту небольшую программу я создал для проверки функциональности передачи значений с одной карты на другую. Как мне обработать ситуацию с созданием нескольких экземпляров CardLayout в этом примере, как прокомментировал @mKorbel? - person Arif Hameed; 07.03.2012
comment
@ArifHameed: смотрите, вместо того, чтобы передавать значение следующей карте, вместо этого вы должны сделать это. Что бы вы ни вводили, этот ввод может в основном относиться к чему-то (для информации: студент, сотрудник, рабочий или что-то еще), поэтому вы можете создать отдельный класс для этого объекта. Поэтому при переходе от входа в окно приветствия сохраните имя пользователя и пароль для конкретного объекта в соответствующих переменных класса. - person nIcE cOw; 07.03.2012
comment
продолжение... Теперь вы можете просто передавать объекты этого класса на разные карты вместо того, чтобы передавать экземпляр каждой карты на другую карту. А чтобы вернуться к карточке входа после выхода пользователя из системы, вы можете проверить Первый метод CardLayout для возврата к первой карточке. - person nIcE cOw; 07.03.2012
comment
Более того, просто для доступа к одному единственному методу swapView(...) внутри CardLayoutLoginTest вы передаете объект, когда вы сделали свой JPanel несущий ‹kbd›CardLayout‹/kbd› статическим, почему бы вам просто не использовать его в других классах, чтобы получить на объект CardLayout's - person nIcE cOw; 07.03.2012
comment
@Gagandeep Bali: я следовал вашим инструкциям и создал класс Employee для хранения данных и объекта этого класса, который я передаю на разные карты, но все еще не могу заставить его работать. Теперь я расширил пример, добавив еще две карты, чтобы они выглядели точно так же, как мой реальный проект. Не могли бы вы взглянуть и сообщить мне, что я делаю неправильно? Я заменил приведенный выше пример обновленным. - person Arif Hameed; 08.03.2012
comment
продолжение... еще одна вещь, я заметил, что вы обновили значение карты перед добавлением ее в колоду, тогда как мне нужно сначала добавить все карты в колоду, прежде чем я обновлю любую карту! - person Arif Hameed; 08.03.2012
comment
@ArifHameed: Точно, не знаю, кажется, у меня есть флюиды, я также думаю об этом вопросе, как заставить его работать на вас. Я пытался сделать студенческий класс около 4 часов назад. Но так как вы добавляете их в начале, то изменения не могут быть внесены в уже инициализированный объект. Поэтому я также думаю о том, как заставить его работать, хотя я понял, что вам не нужно передавать это своим конструкторам JPanel, чтобы вы могли использовать метод swapView(...). - person nIcE cOw; 08.03.2012
comment
@ArifHameed: Если вы не возражаете, вы можете опубликовать весь свой код на PASTEBIN, я обязательно посмотрю на это и вернется обратно. - person nIcE cOw; 08.03.2012
comment
@Gagandeep Bali: Великолепно - это именно то, что я хочу для своего проекта, и теперь он работает! Большое спасибо за вашу помощь. По какой-то причине обновление JLabel не сработало, и мне пришлось изменить все поля JLabel на JText. Не могли бы вы объяснить? - person Arif Hameed; 13.03.2012
comment
@ArifHameed: Рад узнать, что я чем-то помог тебе в твоих начинаниях. Добро пожаловать и продолжайте улыбаться :-) Вы делаете эти обновления на EDT, и после внесения изменений вы выполняете panelObject.revalidate() и panelObject.repaint(), чтобы изменения вступили в силу, при использовании JLabel. - person nIcE cOw; 13.03.2012
comment
@Gagandeep Bali: Кстати, как я могу принять ваш ответ? Не можете найти кнопку или ссылку, чтобы нажать? - person Arif Hameed; 13.03.2012
comment
Прочтите это для этого, Как работает принятие ответа. Могу ли я сделать вам небольшую программу, чтобы продемонстрировать, как обновлять JLabel во время выполнения :-) - person nIcE cOw; 13.03.2012
comment
@Gagandeep Bali: Да, обновление EDT, и выполняется panelObject.revalidate(), но не panelObject.repaint(). Я думаю, именно поэтому изменения не вступили в силу! - person Arif Hameed; 13.03.2012
comment
@ArifHameed: небольшой пример программы, которую я добавляю, но если вы меняете только текст, то в основном без использования revalidate() и repaint() это работает. Более того, если вы делаете это внутри какого-то ActionListener actionPerformed(...) method, then it's automatically on EDT.Похоже, мне нужно увидеть код, чтобы узнать настоящую причину JLabel :-) - person nIcE cOw; 13.03.2012
comment
@Gagandeep Bali: Это было бы полезно, но теперь я столкнулся с более серьезной проблемой — одна из карт. У меня есть JTable с 3 столбцами и 10 строками. В первом столбце каждая ячейка имеет поле со списком, которое связано с 10 различными массивами описания и количества элементов. Когда выбрана 1-я комбинация, выбранное значение должно отображаться во 2-м столбце, а промежуточная сумма должна строиться в 3-м столбце. Это правило будет применяться ко всем комбо, и при случайном выборе комбо промежуточная сумма будет пересчитана. Любые предложения, пожалуйста? - person Arif Hameed; 13.03.2012
comment
@ArifHameed: я очень сожалею о JTable части, я никогда их не использовал :( . Но я могу попробовать, но для этого мне нужно увидеть ваш код, что вы делаете, и что именно нужно сделать, чтобы исправить изменения. Я для этого нужно прочитать учебники для JTable, поэтому мне нужен код для этого Никогда раньше не касался JTables :( - person nIcE cOw; 13.03.2012
comment
@Gagandeep Bali: нет проблем с совместным использованием кода, но все комбинации объединены в базу данных SQL, и копирование среды разработки было бы непростым делом. Завтра я посмотрю, смогу ли я создать упрощенную версию этого класса карт и опубликую здесь... - person Arif Hameed; 13.03.2012
comment
@ArifHameed: ЕСЛИ вы делаете упрощенную версию, почему бы не задать новый вопрос? Таким образом, вы получите много рук помощи для работы над одной и той же проблемой. - person nIcE cOw; 13.03.2012
comment
@Gagandeep Bali: хорошо, сойдет. - person Arif Hameed; 14.03.2012
comment
@Gagandeep Bali: вот мой новый вопрос, опубликованный stackoverflow.com/questions/9706878/ не могли бы вы взглянуть? Спасибо. - person Arif Hameed; 14.03.2012
comment
@ArifHameed: Конечно, я буду рад помочь вам в этом :-) - person nIcE cOw; 14.03.2012

вы повторно создаете CardLayout экземпляр каждый раз, когда JButton's Action срабатывает, создавайте его только один раз, например

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class OnTheFlyImageTest extends JFrame {

    private static final long serialVersionUID = 1L;
    private JPanel cardPanel;
    private CardLayout cardLayout;

    public OnTheFlyImageTest() {
        JPanel cp = new JPanel(new BorderLayout());
        cp.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        cardLayout = new CardLayout(5, 5);
        cardPanel = new JPanel(cardLayout);
        cp.add(cardPanel);
        for (int i = 0; i < 5; i++) {// Create random panels for testing.
            String name = "ImagePanel" + (i + 1);
            String image = (i & 1) == 0 ? "foo.gif" : "bar.gif";
            Color clr = (i & 1) == 0 ? Color.red : Color.blue;
            ImagePanel imgPanel = new ImagePanel(name, image, clr);
            cardPanel.add(imgPanel, name);
            cardLayout.addLayoutComponent(imgPanel, name);
        }
        JPanel buttonPanel = new JPanel(new GridLayout(1, 2, 5, 5));
        JButton prevButton = new JButton("< Previous");
        prevButton.setActionCommand("Previous");
        prevButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                cardLayout.previous(cardPanel);
            }
        });
        buttonPanel.add(prevButton);
        JButton nextButton = new JButton("Next >");
        nextButton.setActionCommand("Next");
        nextButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                cardLayout.next(cardPanel);
            }
        });
        buttonPanel.add(nextButton);
        JPanel temp = new JPanel(new BorderLayout());
        temp.add(buttonPanel, BorderLayout.LINE_END);
        cp.add(temp, BorderLayout.SOUTH);
        setContentPane(cp);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setTitle("Test");
        pack();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new OnTheFlyImageTest().setVisible(true);
            }
        });
    }
}

class ImagePanel extends JPanel {

    private static final long serialVersionUID = 1L;
    private String imgString;
    private JLabel imgLabel;

    public ImagePanel(String name, String imgString, Color backGround) {
        setName(name);
        this.imgString = imgString;
        setLayout(new BorderLayout());
        setBackground((backGround));
        // Ensure size is correct even before any image is loaded.
        setPreferredSize(new Dimension(400, 300));
    }

    @Override
    public void setVisible(boolean visible) {
        if (visible) {
            System.err.println(getName() + ": Loading and adding image");
            ImageIcon icon = new ImageIcon(imgString);
            imgLabel = new JLabel(icon);
            add(imgLabel);
        }
        super.setVisible(visible);
        if (!visible) { // Do after super.setVisible() so image doesn't "disappear".
            System.err.println(getName() + ": Removing image");
            if (imgLabel != null) { // Before display, this will be null
                remove(imgLabel);
                imgLabel = null; // Hint to GC that component/image can be collected.
            }
        }
    }
}
person mKorbel    schedule 06.03.2012