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
, как ранее предлагалось в комментариях.
Предложения, которые я даю, являются лишь общими рекомендациями, так как я не знаю деталей ваших потребностей.