Packet trotz richtiger Addressierung nicht auffindbar?

tun3d

Mitglied
Hallo! Ich habe das Problem das ich Mit Netbeans und dem Integrierten GUI-Builder eine Swing app schreiben möchte. Diese soll per Knopfdruck ein Platzhalterpanel in mein gewünschtes Panel ändern.
Leider wird das Package in dem ich das Zielpanel gespeichert habe nicht gefunden.

Die Struktur sieht wiefolgt aus:
SA_PersonalDB
+crosscut (package)
+data (package)
-logic (package)
--viewLogic (package)
---PanelLoader.java
-view (package)
--testGUI (package)
---AddPanel.java
--GUI.java
----------------------------------------------------------------------
-Es gibt Eine PanelLoader Klasse:

[CODE lang="java" title="Panel Loader"]package SA_PersonalDB.logic.viewLogic;

import javax.swing.JPanel;

public class PanelLoader {

public void panelLoader(JPanel panel) {
SA_PersonalDB.view.GUI guiObjekt = new SA_PersonalDB.view.GUI();
guiObjekt.getPnlMain();
guiObjekt.setPnlMain(panel);
}
}
[/CODE]

-Ein Zielpanel welches aufgerufen werden soll (Der Code wurde vom GUI-Builder von Netbeans erstellt)

[CODE lang="java" title="Zielpanel mit dem GUI Builder Erstellt"]package SA_PersonalDB.view.testGUI;

public class AddPanel extends javax.swing.JPanel {


public AddPanel() {
initComponents();
}

/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {

jLabel1 = new javax.swing.JLabel();

setToolTipText("");

jLabel1.setFont(new java.awt.Font("Comic Sans MS", 1, 18)); // NOI18N
jLabel1.setText("Das hier ist das ADD PANEL");

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 400, Short.MAX_VALUE)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(72, Short.MAX_VALUE)
.addComponent(jLabel1)
.addContainerGap(72, Short.MAX_VALUE)))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 300, Short.MAX_VALUE)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(115, Short.MAX_VALUE)
.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 42, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(143, Short.MAX_VALUE)))
);
}// </editor-fold>//GEN-END:initComponents


// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JLabel jLabel1;
// End of variables declaration//GEN-END:variables
}
[/CODE]
-Ich habe ein GUI klasse welche das Panel welches zu ändern ist und den Button(in dem fall wegen der Optik auch ein Panel) enthält. Hier die Aufrufe und der Kopf der Klasse:
[CODE lang="java" title="Kopf der GUI Klasse"]package SA_PersonalDB.view;

import javax.swing.JPanel;
import SA_PersonalDB.view.testGUI.AddPanel;

public class GUI extends javax.swing.JFrame {

public GUI() {
initComponents();
}
[/CODE]

In GUI Aufruf der Methode:
[CODE lang="java" title="in GUI" highlight="3"] private void pnlPassBarMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_pnlPassBarMouseClicked
SA_PersonalDB.logic.viewLogic.ColorChanges.sidebarButtonsClicked(pnlPassBar);
SA_PersonalDB.logic.viewLogic.PanelLoader.panelLoader(SA_PersonalDB.view.testGUI.AddPanel);
}//GEN-LAST:event_pnlPassBarMouseClicked
[/CODE]

Leider Bekomme ich immer den fehler das das Packet in welchem sich das Panel befindet nicht existiert :

"cannot find symbol
symbol: class testGUI
location: package SA_PersonalDB.view"

ich habe schon alles mögliche versucht und weis einfach nich wodran es liegt...

danke für eure Hilfe!
 
Zuletzt bearbeitet:
Eigentlich musst du in der Zeile 3 der Methode ein Objekt übergeben.
Du übergibst die Klasse. Erwartet wird ein Objekt JPanel.
Muss ich also vorab nochmal irgendwo ein Objekt dieser Klasse erstellen ?

Ich habe ja die Klasse "AddPanel" geschrieben welche nur das panel enthalten soll ,welche ich also komplett einladen möchte. Die idee ist halt später noch viele weiter panels in die einzelnen Packages zu packen und somit einzelne dialoge zu erhalten bzw zu erstellen.

Muss ich dann für jeden Panelwechsel ein Objekt des neuen Panels erstellen? Gibts dazu irgendwelche sinnvollen Stukturen wie man sowas macht (Ich will nicht irgendwie was hinschustern sondern es gleich richtig lernen)?
 
Die Klasse ist nur der Bauplan. Willst du ihn benutzen brauchst du ein Objekt davon
Eigentlich ist auch schon
SA_PersonalDB.logic.viewLogic.PanelLoader.panelLoader nur die Klasse und kein Objekt davon.

In welcher Klasse ist der listener?
 
SA_PersonalDB.logic.viewLogic.PanelLoader.panelLoader nur die Klasse und kein Objekt davon.
Das soll bzw. ist eigentlich die Methode welche ich in der klasse PanelLoader aufrufe. Sollte ich sie umbenennen um es klarer zu machen?

Der listener wird automatisch in die gleiche klasse wie die events generiert also auch in SA_PersonalDB.view.GUI.java
 
Also der Code wird deutlich lesbarer, wenn Du imports nutzt und dann Klassen nur noch mit dem SimpleName angeben musst.

Die Probleme hat @Jw456 gut erkannt - ich will diese nur noch etwas ausführen:

a) Deine Methode panelLoader soll ein Argument vom Typ JPanel übergeben bekommen. Du übergibst aber nichts. Was Du da beim Aufruf hin geschrieben hast, ist nur ein Type. Das ist also schlicht keine gültige Java Syntax. Es musst eine JPanel Instanz übergeben werden!

b) Die Methode panelLoader ist nicht statisch, d.h. die Methode muss auf einer Instanz von PanelLoader aufgerufen werden.

Das ganze ist aber auch wenig durchdacht. Was für eine Aufteilung hast Du denn da gewählt? Kannst Du denn das, was da die einzelnen Klassen machen sollen, einmal in Worten beschreiben?

Wenn Du das in Worten beschreiben kannst, dann kommen hoffentlich auch sinnvolle Bezeichner. Ein PanelLoader der keine Panel Lädt. Statt dessen erzeugt er nur eine GUI Instanz und weist der noch ein Panel zu (Wäre ggf. einfach ein GUI Kontruktor, der ein Panel entgegen nimmt. - die ganze Klasse wäre dann sofort komplett weg).
 
Also der Code wird deutlich lesbarer, wenn Du imports nutzt und dann Klassen nur noch mit dem SimpleName angeben musst.
Also meinst du in diesem fall in GUI die Klasse "logic.viewLogic.PanelLoader" zu imporieren, um nicht den kompletten pfad angeben zu müssen ?
Das ganze ist aber auch wenig durchdacht. Was für eine Aufteilung hast Du denn da gewählt? Kannst Du denn das, was da die einzelnen Klassen machen sollen, einmal in Worten beschreiben?
Wenn Du das in Worten beschreiben kannst, dann kommen hoffentlich auch sinnvolle Bezeichner. Ein PanelLoader der keine Panel Lädt. Statt dessen erzeugt er nur eine GUI Instanz und weist der noch ein Panel zu (Wäre ggf. einfach ein GUI Kontruktor, der ein Panel entgegen nimmt. - die ganze Klasse wäre dann sofort komplett weg).
Also die idee ist eine 1 Fenster applikation zu erstellen welche mit klicken auf buttons unterschiedliche aufgaben erfüllt bzw unterschiedliche dialoge anstößt welche verfahren abbilden sollen. Hier mal meine Grundideen der Klassen und dazugehörigen pakete:

view (Package): Alles was mit der reinen Optik zutun hat

view.testGUI (package): Hier sollen alle unterschiedlichen pannels für die "test" verfahren rein. Die idee war für jedes Optisch unterschiedliche panel eine eigene Klasse zu erstellen und zugehörige pannels verfahrensweise in unterschiedlichen Packages zu sortieren. Auch um nach und nach weitere Panels und Verfahren hinzufügen zu können ohne andere sachen wieder anfassen zu müssen.

view.GUI.java : Dies hier sollte eine art mainmenu darstellen welches ein Platzhalter panel hat welches nach einem buttonklick ausgetauscht wird.

logic (package): controller klassen welche die eigentliche logik enthalten.

logic.viewLogic (package): Klassen welche logisch mit der Optik zutun haben z.b. das laden des Panels oder aber auch der mousehover Effekt der Buttons im GUI

logic.viewLogic.PanelLoader.java: Eigentlich eine Klasse welche die logik beinhalten soll um die Panels im "Hauptfenster" auszutauschen (wobei ich mir da jetzt nicht mehr so sicher bin xD)

Die Struktur die du am Anfang gegeben hast. Ist die von dir oder ist das eine Aufgabe die du bekommen hast?
Die Struktur kommt von mir. Allerdings lasse lasse ich mich gerne für sinnhaftere ansätze begeistern bin halt noch ziemlicher anfänger.
 
Also meinst du in diesem fall in GUI die Klasse "logic.viewLogic.PanelLoader" zu imporieren, um nicht den kompletten pfad angeben zu müssen ?
Ja. Der "komplette Pfad" nennt sich übrigens vollständig qualifizierter Name oder fully qualified name, kurz FQN.

Ich würde erstmal via Strg+H den Part logic.viewLogic. erstmal durch nichts ersetzen und anschließend per Strg+Shift+I die Imports fixen.

Während des Tippens kannst Du einfach die Autovervollständigung nutzen (Teil des Klassennamens schreiben, Strg+Space).
 
Sorry für die späte Antwort. Deine Aufgliederung sieht schon relativ gut aus und entspricht in etwa dem MVC Pattern. Da erkennst Du: Das Model sollte noch irgendwo zu finden sein 🙂

Der PanelLoader kommt natürlich weg (Nur ein Vorschlag / meine Sicht).

Das mit dem logic.viewLogic habe ich noch nicht so ganz verstanden. Was genau soll da hinein kommen? Wenn Du spezielle Effekte hast, dann mag das in eigenständigen Klassen Sinn machen, aber ist das dann ein Controller (Der was mit dem Model macht und das dann einer View zur Verfügung stellt) oder ist das eher Teil einer View (Eine Visualisierung - der Controller hat gesagt, dass sich etwas ändert, also wird das visuell dargestellt)

Aber das sind dann Detail Fragen, die man sich immer stellen sollte und ohne Details ist es schwer, da wirklich sicher etwas zuzuordnen.

Wenn Du den Code etwas lesbarer gestaltet hast, dann kannst Du Ihn gerne noch einmal einstellen - dann kann man auch so Details noch absprechen (Natürlich nur, so du dies wünscht!).
 
Danke für die Rückmeldung !
Da erkennst Du: Das Model sollte noch irgendwo zu finden sein 🙂
Ich habe es so gelernt das Model mit "Data" gleichzusetzen ist. Handelt es sich dabei dann um eine Namenskonvention dann ändere ich das natürlich oder fehlt in meiner Überlegung etwas?
Das mit dem logic.viewLogic habe ich noch nicht so ganz verstanden. Was genau soll da hinein kommen?
Also ich dachte es währe sinnvoll alles was mit der Optik zutun hat nocheinmal von anderen logik vogängen zu unterscheiden weshalb ich nochmals ein eigenens Packet erstellt habe. Dort rein sollte alles was die optik betrifft aber nichts mit den vorgängen im hintergrund zutun hat also z.B.: Farbänderungen beim Klicken oder , das erstellen von optischen objekte (z.b. panels) etc. ich glaube die überlegung war eigentlich vorrangig so das ich es übersichtlicher fand, aber auch da : Wenn es dahingehend Konventionen oder "best practices" gibt immer her damit 😀


Ich kann halt überhaupt nicht einschätzen ob es sinnvoll bzw. Zielführens so "Kleinteilig" zu denken oder ob es bei der art der Applikation nicht "nötig" ist, da ich den aufwand der Aufgabe nur schwer einschätzen kann und hier etwas im freiflug und alleine bin.


Hinzu Kommt das ich auf einem Offline System arbeite und den Code erstelle und ein online System habe für Recherche welches es nicht zulässt Dateien zu bewegen oder irgendwas zu Installiern. Alles etwas suboptimal 🙂

zurück zum Topic: Ich habe es leider immernoch nicht geschafft Mein "Platzhalterpanel" mit einem individuellen pannel zu ersetzen. Irgendwie will nichts funktionieren... Ich habe als halblösung ein "CardLayout" gefunden wobei wenn man später unterschiedliche Ebenen mit unterschiedlichen Verfahren hat, welche jeweils mehrere Panels benötigen und unterschiedlichen Userrechten, wird das glaube ich nicht wirklich Zielführend sein....

Dies bzgl.: Ich habe versucht über getter und setter mein Panel zu ersetzen aber auch das will er irgendwie nicht... hierzu das:
[CODE lang="java" title="einmal der code vom Button"]AddPanel addPanelObjekt = new AddPanel();
pnlMain.removeAll();
getPnlMain();
setPnlMain(addPanelObjekt);
pnlMain.setVidible(true);
pnlMain.repaint(); //war der neuste versucht aber hat auch nichts geändert ...[/CODE]

getter und setter methoden habe ich via Alt+Einfügen automatisch erstellen lassen.

Ich weiß einfach nicht genau wie ichs angehen kann bzw. sollte.
 

Neue Themen


Zurück
Oben