Переход между экранами приложения можно организовать так:
Создать для каждого экрана экземпляр класса JPanel. Этот элемент выступит контейнером для остальных элементов экрана.
Добавить нужные элементы в созданный JPanel.
Окно приложения (например, JFrame) по умолчанию уже содержит экземпляр класса JPanel. Метод setContentPane заменяет его на другой.
Затем нужно вызвать метод repaint у окна, чтобы перерисовать экран приложения.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Main {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setBounds(10, 10, 400, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(null);
// Панель №1 (экран № 1)
JPanel panel1 = new JPanel();
panel1.setLayout(null);
panel1.setSize(frame.getWidth(), frame.getHeight());
JButton button = new JButton("Привет!!");
button.setBounds(10, 10, 100, 40);
panel1.add(button);
// Панель №2 (экран № 2)
JPanel panel2 = new JPanel();
panel2.setLayout(null);
panel2.setSize(frame.getWidth(), frame.getHeight());
JTextField textField = new JTextField("Привет!! Я TextField");
textField.setBounds(10, 10, 100, 40);
panel2.add(textField);
// Панель №3 (экран № 3)
JPanel panel3 = new JPanel();
panel3.setLayout(null);
panel3.setSize(frame.getWidth(), frame.getHeight());
JTextField textField1 = new JTextField("Привет!!");
textField1.setBounds(10, 10, 100, 40);
panel3.add(textField1);
JLabel label = new JLabel("Привет!! Я Label");
label.setBounds(10, 60, 100, 40);
panel3.add(label);
////......
frame.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
// При нажатии на клавишу 1 будет показана panel1
if (e.getKeyCode() == KeyEvent.VK_1){
frame.setContentPane(panel1);
frame.repaint();
}
// При нажатии на клавишу 2 будет показана panel2
if (e.getKeyCode() == KeyEvent.VK_2){
frame.setContentPane(panel2);
frame.repaint();
}
// При нажатии на клавишу 3 будет показана panel3
if (e.getKeyCode() == KeyEvent.VK_3){
frame.setContentPane(panel3);
frame.repaint();
}
}
});
frame.setVisible(true);
}
}
Можно перенести логику работы каждого экрана в отдельный java-файл. Это можно реализовать используя наследование:
Создадим класс для "нового" экрана.
Унаследуем его от класса JPanel:
public class MainPanel extends JPanel
Реализуем конструктор класса, который будет принимать один аргумент - экземпляр родительского окна (JFrame):
public MainPanel(JFrame window)
Реализуем остальную логику
Код класса (MainPanel.java):
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MainPanel extends JPanel {
JFrame window;
public MainPanel(JFrame window) {
this.window = window;
setSize(window.getWidth(), window.getHeight());
setLayout(null);
// Заполняем компонентами
JLabel label = new JLabel("Панель № 1");
label.setBounds(10, 10, 100, 40);
add(label);
JButton button = new JButton("Перйти на другую панель");
button.setBounds(10, 60, 300, 40);
add(button);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// При нажатии на кнопку переходим на SecondPanel
window.setContentPane(new SecondPanel(window));
window.repaint();
}
});
}
}
Код еще одного класса с панелью (SecondWindow.java):
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class SecondPanel extends JPanel {
JFrame window;
public SecondPanel(JFrame window) {
this.window = window;
setSize(window.getWidth(), window.getHeight());
setLayout(null);
JTextField textField = new JTextField("Это другая панель");
textField.setBounds(10, 10, 100, 40);
add(textField);
JButton button = new JButton("На первую панель");
button.setBounds(10, 60, 300, 40);
add(button);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// При нажатии на кнопку переходим обратно на MainPanel
window.setContentPane(new MainPanel(window));
window.repaint();
}
});
}
}
Основной класс (Main.java):
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Main {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setBounds(10, 10, 400, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(null);
frame.add(new MainPanel(frame)); // Сначала отображаем MainPanel
frame.repaint();
frame.setVisible(true);
}
}