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
-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
Du haut se trouvent MainPanel, TaskRegisterPanel et TaskEditPanel.
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 ...
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
Je veux être prudent car le timing du nouveau peut être appliqué non seulement au swing mais aussi à d'autres applications java.
Recommended Posts