Fragen zur OOP! Wie arbeite ich ohne Instanzen? :confused:
-
Hallo,
ich stehe gerade vor einem Problem.
Ich bin gerade am programmieren an einem Forum in Java (Swing).
Ich wollte eine Hauptklasse die abgeleitet ist von JFrame. Kein problem.
So nun habe ich gedacht um es etwas übersichtlich zu halten erstelle weitere Klasse die meine JPanels zusammenbaut. (d.h. Board, Login, Beiträge erstellen,....)
Nun gut. Aber um auf die Methoden der Klasse mit den Panels zu zugreifen muss ich von der Klasse eine Instanz erzeugen. Da aber meine Klasse mit den Panels eine Abgeleitete Klasse von der Hauptklasse ist erstellt sie somit wieder ein neues Frame da die Hauptklasse ja von Frame abgeleitet ist. Am schluss hab ich 1000 Instanzen....
Was ich möchte ist einfach nur das ich von der Hauptklasse auf die die Methoden meiner anderen Klasse zugreifen kann ohne das ich eine Instanz erzeugen muss. Ist dies möglich?
So ich poste mal mein Code, der glaube ich total falsch angegangen ist.
Hier die Hauptklasse (main) - MainFrame.java:
package de.bboard.java; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class MainFrame extends JFrame implements ActionListener{ protected Container contentPane = null; protected MainFrame thisFrame = null; //protected PanelBoard BoardPanel = new PanelBoard(); protected PanelBoard BoardPanel; PanelLogin LoginPanel; public MainFrame() { contentPane = getContentPane(); } /** * */ public static void main(String[] args) { //MainFrame thisFrame = new MainFrame(); PanelBoard BoardPanel = new PanelBoard(); //BoardPanel.Initialize(); BoardPanel.ShowBoard(BoardPanel); BoardPanel.setVisible(true); BoardPanel.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void actionPerformed(ActionEvent e) { System.out.println("Hello There"); } public void Initialize(){ //ShowBoard(); } public void ShowBoard(PanelBoard ActivPanel){ //BoardPanel = new PanelBoard(); setTitle("Bulletin Board - Board"); contentPane.removeAll(); contentPane.setLayout(new BorderLayout()); contentPane.add(ActivPanel.GetPanelNorth(), BorderLayout.NORTH); contentPane.add(ActivPanel.GetPanelCenter(), BorderLayout.CENTER); setSize(400,500); validate(); } public void ShowLogin(){ LoginPanel = new PanelLogin(); this.setTitle("Bulletin Board - Login"); contentPane.removeAll(); contentPane.add(LoginPanel.GetPanel()); System.out.println("ShowLogin Function..."); pack(); validate(); } }
So hier wird das Panel für das Board zusammengefügt.
PanelBoard.java:package de.bboard.java; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.*; import javax.swing.*; public final class PanelBoard extends MainFrame implements ActionListener{ JPanel PanelNorth = null; JPanel PanelCenter = null; JButton ButtonRegister = null; JButton ButtonLogin = null; JTree TreeBoard = null; public JPanel GetPanelNorth(){ PanelNorth = new JPanel(new GridLayout(1, 0)); ButtonRegister = new JButton("Registrieren"); PanelNorth.add(GetButtonLogin()); PanelNorth.add(ButtonRegister); return PanelNorth; } public JPanel GetPanelCenter(){ PanelCenter = new JPanel(new BorderLayout()); TreeBoard = new JTree(); PanelCenter.add(TreeBoard); return PanelCenter; } public JButton GetButtonLogin(){ if (ButtonLogin == null){ ButtonLogin = new JButton(); ButtonLogin.setText("Login..."); ButtonLogin.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent e) { System.out.println("MouseClicket on login..."); ShowLogin(); validate(); } }); } return ButtonLogin; } }
Hier wird das Panel für das Loginfenster zusammengeflickt.
PanelLogin.java:package de.bboard.java; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.*; import javax.swing.*; public final class PanelBoard extends MainFrame implements ActionListener{ JPanel PanelNorth = null; JPanel PanelCenter = null; JButton ButtonRegister = null; JButton ButtonLogin = null; JTree TreeBoard = null; public JPanel GetPanelNorth(){ PanelNorth = new JPanel(new GridLayout(1, 0)); ButtonRegister = new JButton("Registrieren"); PanelNorth.add(GetButtonLogin()); PanelNorth.add(ButtonRegister); return PanelNorth; } public JPanel GetPanelCenter(){ PanelCenter = new JPanel(new BorderLayout()); TreeBoard = new JTree(); PanelCenter.add(TreeBoard); return PanelCenter; } public JButton GetButtonLogin(){ if (ButtonLogin == null){ ButtonLogin = new JButton(); ButtonLogin.setText("Login..."); ButtonLogin.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent e) { System.out.println("MouseClicket on login..."); ShowLogin(); validate(); } }); } return ButtonLogin; } }
Würde mich sehr freuen, wenn mir jemand helfen könnte. Hoffe das ihr mein Code versteht
Grüße
-
Für diese Uhrzeit ist mir dein Code zu unübersichtlich, daher ein allgemeiner "Tipp" der eventuell passt:
Wenn du von Object B auf eine Methode von Objekt A zugreifen willst, ist es der falsche Weg eine neue Instanz vom Typ A zu erstellen, denn dann hast du Objekt C und nicht A. Vermutlich genauso unverständlich.
Wenn du also keine Referenz auf deine "Hauptklasse" hast, du aber davon ausgehen kannst das es niemals mehr als eine Instanz geben wird, kannst du einfach eine statische Referenz erzeugen.
Die Hauptklasse bekommt also eine statische Membervariable im Stile von
public static MainFrame instance;
die im Konstruktor initialisiert wird:
instance = this;
danach kannst du von überall drauf zugreifen:
Mainframe::instance.WasAuchImmer()
-
Hey,
besten Dank. Das könnte mir weiter helfen Hab aber jetzt alles umgeschrieben. Ich hab jetzt meine Panels in der Hauptklasse geschrieben somit muss ich nur von der Abgeleiteten Klasse nur noch eine Instanz erzeugen und es funktioniert. Muss das aber auch mal Probieren was du mir das gesagt hast.
Danke dir.
Grüße