Java-программа с несколькими окнами (JPanel), как их подключить к JFrame

У меня есть приложение библиотеки, которое позволяет пользователям войти в систему, и многое другое.

Я действительно не знаю, как сделать несколько окон (представлений), таких как логин, и если это успешно, закрытие текущего окна и открытие другого пользовательского интерфейса.

Я надеюсь, что мне было ясно.

1 ответ

Решение

Обновленный ответ: предположим, ваши три JPanel расширения называются MyLoginPanel, MyWelcomePanel, а также MyFormPanel, Я предполагаю, что упомянутая вами форма будет основным классом, а не фактическими компонентами, составляющими форму.

Каждая из этих панелей должна заботиться о своих собственных компонентах.

Глядя на код ниже, вам нужно только найти и заменить мои имена теми, которые вы используете.

Предложение: Сделайте так, чтобы ваш основной класс реализовал некоторый интерфейс для прослушивания изменений на трех разных панелях. Например: пользователь нажал на какую-то кнопку, которая должна заставить приложение перейти на следующую панель. Эта кнопка должна сообщить кому-то. Чтобы кто-то был разработчиком интерфейса.


enum AppState {
    LOGIN, WELCOME, FORM
}

interface ProgressListener {
    void progressFrom(AppState currentState);
}

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

public class MyForm implements Runnable, ProgressListener {
    // instance variables
    private JFrame frame;
    private MyLoginPanel loginPanel;
    private MyWelcomePanel welcomePanel;
    private MyFormPanel formPanel;

    /** Empty constructor of objects of class SomeClassUI. */
    public SomeClassUI() {
        // ...
    }

    /** Interface initialization. */
    @Override
    public void run() {
        // These should handle their own component initialization.
        // They should, at least, receive a reference to the listener.

        loginPanel = new MyLoginPanel(this);
        welcomePanel = new MyWelcomePanel(this);
        formPanel = new MyFormPanel(this);

        frame = new JFrame("Testing");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(loginPanel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    /** */
    @Override
    public void progressFrom(AppState whoTriggeredIt) {
        switch (whoTriggeredIt) {
            case LOGIN:
            frame.setContentPane(welcomePanel);
            frame.pack();
            return;

            case WELCOME:
            frame.setContentPane(formPanel);
            frame.pack();
            return;

            default: return;
        }
    }


    /** */
    public void go() {
        SwingUtilities.invokeLater(this);
    }


    /** */
    public static void main(String[] args) {
        new SomeClassUI().go();
    }
}

class MyLoginPanel extends JPanel implements ActionListener {
    private final ProgressListener listener;

    public MyLoginPanel(ProgressListener listener) {
        // Components, etc.
        this.listener = listener;
    }

        ...

    /** */
    @Override
    public void actionPerformed(ActionEvent e) {
        // Validate login, or whatever.
        // All went well, notify listener to progress.
        this.listener.progressFrom(AppState.LOGIN);
    }
}

Вместо добавления / удаления элементов непосредственно из JFrame вы можете захотеть сделать это на какой-то своей панели контента, которую вы храните как переменную экземпляра (см. JFrame.setContentPane()).

Если вы хотите, чтобы все панели были легкодоступными в одно и то же время, вместо этого пошагового изменения процедуры, вы можете рассмотреть CardLayout, как ранее предлагалось в комментариях.

Предложения, которые я даю, являются лишь общими рекомендациями, так как я не знаю деталей ваших потребностей.

Другие вопросы по тегам