Transition d'écran avec swing, java

Bonjour, c'est un certain ingénieur d'entreprise.

J'ai créé une application web de gestion de tâches avec swing pour étudier. Un mémorandum car la transition d'écran à ce moment-là était inopinément gênante. Cliquez ici pour consulter les articles précédents ↓ https://qiita.com/Ohtak/items/1be20a4b06b5833c3d61

1. Structure du système

-MainFrame comme parent, MainPanel comme enfant, TaskRegisterPanel, TaskEditPanel -Création de panneau, transition d'écran, gestion du rechargement avec juste MainFrame -Appelez simplement chaque méthode de MainFrame à partir de l'enfant

2. Écran

スクリーンショット 2018-01-02 11.04.22.png スクリーンショット 2018-01-02 11.04.43.png スクリーンショット 2018-01-02 11.05.11.png

Du haut se trouvent MainPanel, TaskRegisterPanel et TaskEditPanel.

3. Code

C'est finalement le code. D'abord depuis le mainFrame parent

MainFrame.java



public class MainFrame extends JFrame{
	public String[] PanelNames = {"main","register","edit"};//Spécifiez le panneau avec ce nom
	
	//Créer divers panneaux
	MainPanel mainPanel = new MainPanel(this,PanelNames[0]);
    TaskRegisterPanel taskRegisterPanel = new TaskRegisterPanel(this,PanelNames[1]);
    TaskEditPanel taskEditPanel = new TaskEditPanel(this,PanelNames[2]);
    
    public MainFrame(){
        this.add(mainPanel);
        mainPanel.setVisible(true);
        
        this.add(taskRegisterPanel);
        taskRegisterPanel.setVisible(false);
        
        this.add(taskEditPanel);
        taskEditPanel.setVisible(false);
        
        this.setBounds(100, 100, 1200, 800);
    }
    
    public static void main(String[] args) {
        MainFrame mainFrame = new MainFrame();
        mainFrame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        mainFrame.setVisible(true);
    }
    
    //Pour la mise à jour de la page
    //Si le mainPanel ne le fait pas, les modifications ne seront pas reflétées à l'écran.
    //Pour le moment, les deux autres panneaux ...
    public void reloadPage(String reloadPanelName){
    	if(reloadPanelName == PanelNames[0]){
    		this.remove(this.mainPanel);
    		MainPanel mainPanel = new MainPanel(this,PanelNames[0]);
    		this.add(mainPanel);
    	}
    	else if(reloadPanelName == PanelNames[1]){
    		this.remove(this.taskRegisterPanel);
    		TaskRegisterPanel taskRegisterPanel = new TaskRegisterPanel(this,PanelNames[1]);
    		this.add(taskRegisterPanel);
    	}
    	else if(reloadPanelName == PanelNames[2]){
    		this.remove(this.taskEditPanel);
    		TaskEditPanel taskEditPanel = new TaskEditPanel(this,PanelNames[2]);
    		this.add(taskEditPanel);
    	}
    }
    
    //Méthode de transition de panneau
    //Une méthode pour créer tous les panneaux à l'avance et basculer entre l'affichage et le non-affichage
    
    //Afficher le panneau principal
    public void showMainPanel(JPanel nowPanel){
    	nowPanel.setVisible(false);
        mainPanel.setVisible(true);
    }
    
    //Afficher le panneau d'enregistrement des tâches
    public void showRegisterPanel(JPanel nowPanel){
    	nowPanel.setVisible(false);
        taskRegisterPanel.setVisible(true);
    }
    
    //Afficher le panneau de modification de la tâche
    public void showEditPanel(JPanel nowPanel, TaskDto task){
    	nowPanel.setVisible(false);
        //Définir la chaîne de caractères initiale
        taskEditPanel.setEditString(task);
        taskEditPanel.setVisible(true);
    }
}

Presque comme commenté. Spécification du panneau à afficher

public String[] PanelNames = {"main","register","edit"};

Je le fais. J'ai essayé de ne pas mettre autant de variables publiques que possible, mais seule la spécification du panneau de l'extérieur de la classe ne fonctionnait pas C'est tout à gauche ...

Ensuite, la partie d'accès au cadre principal des autres panneaux

MainPanel.java


public class MainPanel extends JPanel{
	
    MainFrame mainFrame;
    
    //création de panneaux
    MainPanel(MainFrame mf,String  name){
    	mainFrame = mf;
    	this.setName(name);

    	[Omission]

    	//Disposition des boutons
    	JPanel buttonPanel = new JPanel();
    	JButton createButton = new JButton("Créer un nouveau");
    	createButton.setPreferredSize(new Dimension(100,50));
    	createButton.addActionListener(new ActionListener(){
    		public void actionPerformed(ActionEvent e){
    			panelChangeToRegister(mainFrame.PanelNames[1]);
    		}
    	});
    	buttonPanel.add(createButton);

    	JButton editButton = new JButton("Modifier la tâche");
    	editButton.setPreferredSize(new Dimension(100,50));
    	editButton.addActionListener(new ActionListener(){
    		public void actionPerformed(ActionEvent e){
    			//Réglez l'élément sélectionné sur dto lorsque le bouton est enfoncé
    			TaskDto task = setTaskDtoFromSelectedString();
    			if(!isNotSelectedError){
    				panelChangeToEdit(mainFrame.PanelNames[2], task);
    			}
    		}
    	});
    	buttonPanel.add(editButton);
    }

    public void panelChangeToRegister(String toPanelName){
    	mainFrame.showRegisterPanel((JPanel)this);
    }
    
    public void panelChangeToEdit(String toPanelName, TaskDto task){
    	mainFrame.showEditPanel((JPanel)this, task);
    }
}

J'ai collé uniquement le panneau principal, mais les deux autres sont également comme ça. À propos, lors de la transition des deux autres panneaux vers le mainPanel, mainFrame.reloadPage est appelé pour réinitialiser l'affichage. Puisque je voulais afficher la chaîne de caractères initiale lors de la transition vers l'écran d'édition, seul panelChangeToEdit a un argument.

J'utilise aussi Dto, mais c'est un autre article ...

4. Impressions

La structure parent-enfant de Frame et Panel était plus gênante que je ne l'imaginais ... Si vous ne connaissez pas le moment de nouveau et d'ajout, vous ne savez pas quelle variable est affichée. Voici un exemple d'échec.

MainFrame_Exemple d'échec.java


    public void reloadPage(String panelName, JPanel jp){
    	
    	MainFrame mainFrame = new MainFrame();//J'ai un nouveau cadre
    	mainFrame.setDefaultCloseOperation(EXIT_ON_CLOSE);
    	mainFrame.setVisible(true);

    	if(reloadPanelName == PanelNames[0]){
    		mainFrame.remove(jp);//J'essaie d'enlever un nouveau au lieu de celui que j'ai créé au début.
    		MainPanel mainPanel = new MainPanel(this,PanelNames[0]);
    		mainFrame.add(mainPanel);//Et j'ajoute.
    	}
    	else if(reloadPanelName == PanelNames[1]){
    		mainFrame.remove(jp);
    		TaskRegisterPanel taskRegisterPanel = new TaskRegisterPanel(this,PanelNames[1]);
    		mainFrame.add(taskRegisterPanel);
    	}
    	else if(reloadPanelName == PanelNames[2]){
    		mainFrame.remove(jp);
    		TaskEditPanel taskEditPanel = new TaskEditPanel(this,PanelNames[2]);
    		mainFrame.add(taskEditPanel);
    	}
    }

Ce que je voulais faire était

  1. Supprimez une fois le panneau ajouté au cadre
  2. Nouveau, ajouter un nouveau Cependant, dans cet exemple, un nouveau cadre a été créé à l'étape 1 et supprimé à partir de là. Bien entendu, il n'a pas été supprimé du cadre d'origine. En conséquence, deux panneaux identiques sont affichés en chevauchement. Je ne comprends pas la signification des noms de variables de temps en temps ... Celui collé dans [3. Code] est fixe,

Je veux être prudent car le timing du nouveau peut être appliqué non seulement au swing mais aussi à d'autres applications java.

Recommended Posts

Transition d'écran avec swing, java
[Java Swing] Transition d'écran par CardLayout
Transition d'écran par méthode Post [Java]
Méthode de transition d'écran
Mémorandum de transition d'écran
[Android Studio] Transition d'écran par le bouton [Java]
Installez java avec Homebrew
Changer de siège avec Java
Installez Java avec Ansible
Téléchargement confortable avec JAVA
Changer java avec direnv
Téléchargement Java avec Ansible
Raclons avec Java! !!
Construire Java avec Wercker
Java Swing, SWT, JavaFX
Conversion Endian avec JAVA
[Android / Java] Transition d'écran et traitement de retour par fragments
[Android 9.0 Pie Java] Écran de liste de discussion de style LINE → Animation de transition de l'écran de discussion personnelle implémentée (avec exemple d'application)
(Java) BDD facile avec Spectrum?
Utiliser des couches Lambda avec Java
Créer un multi-projet Java avec Gradle
Premiers pas avec Java Collection
Configuration Java avec Spring MVC
Authentification de base avec Java 11 HttpClient
Expérimentons l'expansion en ligne Java
Exécuter un lot avec docker-compose avec Java batch
[Template] Connexion MySQL avec Java
Réécrire Java try-catch avec facultatif
[Java] Communication JSON avec jackson
Java pour jouer avec Function
Essayez la connexion DB avec Java
Activer Java EE avec NetBeans 9
[Java] JavaConfig avec classe interne statique
Essayez gRPC avec Java, Maven
Exploitons Excel avec Java! !!
Développement Android ~ transition d'écran (intention) ~
Gestion des versions Java avec SDKMAN
Cryptage / décryptage RSA avec Java 8
Pagination de PDF avec Java + PDFBox.jar
Trier les chaînes comme une fonction caractéristique avec Java
Orienté objet avec Strike Gundam (java)
[Note] Transition de scène avec JavaFX
[Java] Acquisition de contenu avec HttpCliient
Gestion des versions Java avec jenv
Dépannage avec Java Flight Recorder
Rationalisez les tests Java avec Spock
Connectez-vous à MySQL 8 avec Java
Erreur lors de la lecture avec java
Utilisation de Mapper avec Java (Spring)
Mémo d'étude Java 2 avec Progate
Premiers pas avec les bases de Java
Affichage saisonnier avec commutateur Java
Transition d'écran Mémorandum de transfert d'informations
Utiliser SpatiaLite avec Java / JDBC
Étudier Java avec Progate Note 1
Comparez Java 8 en option avec Swift
Analyse HTML (scraping) avec JAVA
Test unitaire Java avec Mockito
Je veux revenir à l'écran précédent avec kotlin et java!