Bildschirmübergang mit Swing, Java

Hallo, das ist ein bestimmter Firmeningenieur.

Ich habe eine Webanwendung für das Aufgabenmanagement mit Swing zum Lernen erstellt. Ein Memorandum, weil der Bildschirmübergang zu dieser Zeit unerwartet problematisch war. Klicken Sie hier für verwandte frühere Artikel ↓ https://qiita.com/Ohtak/items/1be20a4b06b5833c3d61

1. Systemstruktur

-MainFrame als übergeordnetes Element, MainPanel als untergeordnetes Element, TaskRegisterPanel, TaskEditPanel -Panel-Erstellung, Bildschirmübergang, Reload-Management mit nur MainFrame

2. Bildschirm

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

Von oben sind MainPanel, TaskRegisterPanel und TaskEditPanel.

3. Code

Es ist endlich der Code. Zuerst vom übergeordneten mainFrame

MainFrame.java



public class MainFrame extends JFrame{
	public String[] PanelNames = {"main","register","edit"};//Geben Sie das Panel mit diesem Namen an
	
	//Erstellen Sie verschiedene Panels
	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);
    }
    
    //Zum erneuten Zeichnen von Seiten
    //Wenn das mainPanel dies nicht tut, werden die Änderungen nicht in der Anzeige angezeigt.
    //Vorerst sind die beiden anderen Panels ...
    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);
    	}
    }
    
    //Panel-Übergangsmethode
    //Eine Methode zum Erstellen aller Panels im Voraus und zum Umschalten zwischen Anzeige und Nichtanzeige
    
    //Hauptfenster anzeigen
    public void showMainPanel(JPanel nowPanel){
    	nowPanel.setVisible(false);
        mainPanel.setVisible(true);
    }
    
    //Anzeigen des Aufgabenregistrierungsfelds
    public void showRegisterPanel(JPanel nowPanel){
    	nowPanel.setVisible(false);
        taskRegisterPanel.setVisible(true);
    }
    
    //Aufgabenbearbeitungsfenster anzeigen
    public void showEditPanel(JPanel nowPanel, TaskDto task){
    	nowPanel.setVisible(false);
        //Legen Sie die anfängliche Zeichenfolge fest
        taskEditPanel.setEditString(task);
        taskEditPanel.setVisible(true);
    }
}

Fast wie kommentiert. Festlegen, welches Bedienfeld angezeigt werden soll

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

Ich mache es. Ich habe versucht, nicht so viele öffentliche Variablen wie möglich einzufügen, aber nur die Panel-Spezifikation von außerhalb der Klasse hat nicht funktioniert Das ist alles übrig ...

Als nächstes der Zugriffsteil zum Hauptrahmen anderer Bedienfelder

MainPanel.java


public class MainPanel extends JPanel{
	
    MainFrame mainFrame;
    
    //Panel-Erstellung
    MainPanel(MainFrame mf,String  name){
    	mainFrame = mf;
    	this.setName(name);

    	[Unterlassung]

    	//Tastenlayout
    	JPanel buttonPanel = new JPanel();
    	JButton createButton = new JButton("Erstelle neu");
    	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("Aufgabe bearbeiten");
    	editButton.setPreferredSize(new Dimension(100,50));
    	editButton.addActionListener(new ActionListener(){
    		public void actionPerformed(ActionEvent e){
    			//Stellen Sie das ausgewählte Element auf dto, wenn die Taste gedrückt wird
    			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);
    }
}

Ich habe nur das Hauptpanel eingefügt, aber die anderen beiden sind auch so. Übrigens wird beim Übergang von den beiden anderen Bedienfeldern zum mainPanel mainFrame.reloadPage aufgerufen, um die Anzeige zurückzusetzen. Da ich beim Übergang zum Bearbeitungsbildschirm die ursprüngliche Zeichenfolge anzeigen wollte, hat nur panelChangeToEdit ein Argument.

Ich benutze auch Dto, aber dies ist ein anderer Artikel ...

4. Eindrücke

Die Eltern-Kind-Struktur von Frame und Panel war problematischer als ich es mir vorgestellt hatte ... Wenn Sie das Timing von Neu und Hinzufügen nicht kennen, werden Sie verwirrt sein, welche Variable angezeigt wird. Das Folgende ist ein Beispiel für einen Fehler.

MainFrame_Fehlerbeispiel.java


    public void reloadPage(String panelName, JPanel jp){
    	
    	MainFrame mainFrame = new MainFrame();//Ich habe einen neuen Rahmen
    	mainFrame.setDefaultCloseOperation(EXIT_ON_CLOSE);
    	mainFrame.setVisible(true);

    	if(reloadPanelName == PanelNames[0]){
    		mainFrame.remove(jp);//Ich versuche, aus einem neuen zu entfernen, anstatt dem, den ich zu Beginn erstellt habe.
    		MainPanel mainPanel = new MainPanel(this,PanelNames[0]);
    		mainFrame.add(mainPanel);//Und ich füge hinzu.
    	}
    	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);
    	}
    }

Was ich tun wollte war

  1. Löschen Sie das dem Rahmen hinzugefügte Bedienfeld einmal
  2. Neu, neu hinzufügen In diesem Beispiel wurde jedoch in Schritt 1 ein neuer Frame erstellt und von dort gelöscht. Natürlich wurde es nicht aus dem Originalrahmen gelöscht. Infolgedessen werden zwei identische Bedienfelder überlappend angezeigt. Ich verstehe die Bedeutung von Variablennamen von Zeit zu Zeit nicht ... Der in [3. Code] eingefügte ist behoben,

Ich möchte vorsichtig sein, da das Timing von new nicht nur auf Swing, sondern auch auf andere Java-Anwendungen angewendet werden kann.

Recommended Posts

Bildschirmübergang mit Swing, Java
[Java Swing] Bildschirmübergang durch CardLayout
Bildschirmübergang nach Post-Methode [Java]
Bildschirmübergangsmethode
Bildschirmübergangsmemorandum
[Android Studio] Bildschirmübergang über die Schaltfläche [Java]
Installieren Sie Java mit Homebrew
Wechseln Sie die Plätze mit Java
Installieren Sie Java mit Ansible
Bequemer Download mit JAVA
Schalten Sie Java mit direnv
Java-Download mit Ansible
Lass uns mit Java kratzen! !!
Erstellen Sie Java mit Wercker
Java Swing, SWT, JavaFX
Endian-Konvertierung mit JAVA
[Android / Java] Bildschirmübergang und Rückgabeverarbeitung in Fragmenten
[Android 9.0 Pie Java] Chat-Listenbildschirm im LINE-Stil → Übergangsanimation für den persönlichen Chat-Bildschirm implementiert (mit Beispiel-App)
(Java) Einfache BDD mit Spektrum?
Verwenden Sie Lambda-Ebenen mit Java
Erstellen Sie mit Gradle ein Java-Multiprojekt
Erste Schritte mit Java Collection
Java-Konfiguration mit Spring MVC
Grundlegende Authentifizierung mit Java 11 HttpClient
Experimentieren wir mit der Java-Inline-Erweiterung
Führen Sie Batch mit Docker-Compose mit Java-Batch aus
[Vorlage] MySQL-Verbindung mit Java
Schreiben Sie Java Try-Catch mit Optional neu
[Java] JSON-Kommunikation mit Jackson
Java zum Spielen mit Function
Versuchen Sie eine DB-Verbindung mit Java
Aktivieren Sie Java EE mit NetBeans 9
[Java] JavaConfig mit statischer innerer Klasse
Versuchen Sie gRPC mit Java, Maven
Lassen Sie uns Excel mit Java betreiben! !!
Android-Entwicklung ~ Bildschirmübergang (Absicht) ~
Java-Versionsverwaltung mit SDKMAN
RSA-Verschlüsselung / Entschlüsselung mit Java 8
Paging PDF mit Java + PDFBox.jar
Sortieren Sie Zeichenfolgen als charakteristische Funktion mit Java
Objektorientiert mit Strike Gundam (Java)
[Hinweis] Szenenübergang mit JavaFX
[Java] Inhaltserfassung mit HttpCliient
Java-Versionsverwaltung mit jenv
Fehlerbehebung mit Java Flight Recorder
Optimieren Sie Java-Tests mit Spock
Stellen Sie mit Java eine Verbindung zu MySQL 8 her
Fehler beim Spielen mit Java
Verwenden von Mapper mit Java (Spring)
Java Study Memo 2 mit Progate
Erste Schritte mit Java Basics
Saisonale Anzeige mit Java-Schalter
Bildschirmübergang Memorandum zur Informationsübertragung
Verwenden Sie SpatiaLite mit Java / JDBC
Lernen von Java mit Progate Note 1
Vergleichen Sie Java 8 Optional mit Swift
HTML-Analyse (Scraping) mit JAVA
Java Unit Test mit Mockito
Ich möchte mit Kotlin und Java zum vorherigen Bildschirm zurückkehren!