[JAVA] Verschachtelte Elemente vernünftig ein/ausblenden
lima-city → Forum → Programmiersprachen → Java
ausblenden
benutzen
beschreibung
bewegen
code
dank
flag
flanke
grund
helfen
http
import
karte
layout
problem
programm
standard
string
test
url
-
Nabend allerseits,
kann mir jemand auf die Sprünge helfen?!
Sitze gerade an einem "Problem" fest. Mehr oder weniger.
In einer Java-App habe ich verschiedene Panes/Tabs/Labels etc. Diese werden mittels MenüBar gesteuert.
Gesteuert in dem Sinne, dass ich deren Sichtbarkeit auf "true/false" setze.
Ursprünglich waren es nicht viele "Ebenen", da hatte ich für jede der Ebenen einfach eine passende Methode geschrieben, die nichts anderes tat (mit einer gewissen Logik), als die anderen Ebenen auf "false" zu setzten.
Einer der Aufrufe sah z.B. so aus:
public void onOffEb2(Boolean flag) { Boolean flanke = flag; if (flag) { lblBild.setIcon(formPic); lblText.setVisible(flag); btnMatrix.setEnabled(flag); zeigeDatenTabelle(flag); flanke = false; } else { lblText.setVisible(flag); btnMatrix.setEnabled(flag); zeigeDatenTabelle(flag); } onOffEb1(flanke); onOffEb3(flanke); onOffEb4(flanke); }
Nun habe ich mein Programm um einiges erweitert und meine vorherige "Methode" ist jetzt kontraproduktiv geworden.
Zumal es viel Code ist (für sogesehen beinahe gleiche Funktionen) und er bläht (zwar nicht viel, aber dennoch) das Programm einfach unnütz zu stark auf. Ferner denke ich, dass es einfach ein schlechter Programmierstil ist.
Gibt es Strategien/"Kochrezepte" evtl. etwas Lecture zum Nachlesen für das o.g. Problem, die man ggf. für persönliches Vorhaben anpassen kann?
Wie wird das i.Allg. behandelt?
I-wie habe ich Zweifel, dass mein Ansatz richtig ist. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Wenn es um "Ebenen" von Komponenten geht, bei denen immer eine Ebene angezeigt und der Rest verdeckt wird, verwende ich java.awt.CardLayout. Ob das in diesem Falle anwendbar ist, kann ich weder aus der Beschreibung, noch dem Code entnehmen. Für kompliziertere "Umschaltaktionen" würde ich entweder mehrere CardLayouts anlegen oder die Komponenten in Arrays einsortieren, sodass man sie per Schleife durchgehen und schalten kann.
Der angegebene Code ist aus meiner Sicht äquivalent zu dieser kürzeren Variante
public void onOffEb2(Boolean flag) { if(flag) lblBild.setIcon(formPic); lblText.setVisible(flag); btnMatrix.setEnabled(flag); zeigeDatenTabelle(flag); onOffEb1(false); onOffEb3(false); onOffEb4(false); }
-
Bei mir sind schon mehrere Layouts vertreten. U.a. setzte ich verstärkt auf MigLayout.
Mit CardLayout hatte ich bisher noch keine Erfahrungen gemacht. Hole ich aber nach.
Deine Verbesserung erspart mir im Nu einige Zeilen.
Aber wie werden generell diese Geschichten mit Ein/Ausblenden geregelt?
Gibt es keine Muster nach denen man sich orientieren kann? Oder ist es immer Programmabhängig?
Danke für den Tipp mit dem Array. Scheint in meinem Fall gar nicht so verkehrt zu sein. -
Ich kenne kein allgemeingültiges Muster für diesen Fall, bin aber auch kein Design-Patterns Guru. Das CardLayout ist für einige dieser Probleme bestens geeignet -- für andere weniger. Es würde vielleicht helfen, wenn man mal einen Screenshot von der GUI sehen könnte, um nachzuvollziehen, was überhaupt erreicht werden soll. Ich habe davon immernoch kein klares Bild im Kopf.
Unter "verschachtelten Elementen" verstehe ich etwa folgendes (ich kenne mich mit Apps nicht aus, das hier ist standard Java):
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Test extends JFrame implements ActionListener { private static final int N = 3; private JPanel[] p; private Test() { super("Test"); Container cp = getContentPane(); cp.setLayout(new BorderLayout()); JPanel cpan = new JPanel(new BorderLayout()); cp.add("Center", cpan); JPanel btns = new JPanel(new FlowLayout(FlowLayout.LEFT)); p = new JPanel[N]; for(int i = 0; i < N; i++) { JButton btn = new JButton("S" + i); btn.setActionCommand(String.valueOf(i)); btn.addActionListener(this); btns.add(btn); p[i] = new JPanel(new BorderLayout(10, 10)); p[i].add("North", new JLabel("P " + i + " / N")); p[i].add("South", new JLabel("P " + i + " / S")); cpan.add("Center", p[i]); cpan = p[i]; } cp.add("South", btns); pack(); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void actionPerformed(ActionEvent ev) { int idx = Integer.parseInt(ev.getActionCommand()); p[idx].setVisible(!p[idx].isVisible()); } public static void main(String[] args) { new Test(); } }
Dafür kann ich auch mit CardLayout keine bessere Lösung finden -- ich weiß aber nicht, ob ich das Problem überhaupt richtig verstanden habe.
Beitrag zuletzt geändert: 21.9.2014 14:29:05 von masysma -
masysma schrieb:
... Unter "verschachtelten Elementen" verstehe ich etwa folgendes (ich kenne mich mit Apps nicht aus, das hier ist standard Java)...
Bei mir handelt es sich schon um ein Programm. Nicht um eine App. Sry wenn ich damit in die Irre geführt haben sollte.
Bin von NetBeans angewöhnt, Begriff App (wegen New Application...) zu benutzen.
Aber deine Testklasse tut, im Grunde genommen genau das, was ich vorhabe.
Selbst wenn es "nur" Labels ein/ausblendet. Hoffe, dass die Problemstellung damit jetzt deutlich geworden ist oder zumindest Du es verstanden hast.
Ich habe mir den CardLayout jetzt nochmals genauer betrachtet. Auf den ersten Blick eignet es sich hervorragend für mein Problem, sofern ich die Vorgehensweise von diesem Layout richtig verstanden habe.
Wenn ich es stark zusammenfassend beschreiben würde, dann lege ich damit einen Art "Stapel" von "Karten" an und kann mich beliebig zwischen diesen bewegen. Ähnlich wie in der DLL mittels next(), previous() etc.
Stimmt so? Oder habe ich was wichtiges außen vor gelassen"?
Bzgl. der Screens, einige Ausschnitte. Bezweifle jedoch, ob diese von Nutzen sind.
http://kozak.lima-city.de/sonstiges/guiScreen1.jpg
http://kozak.lima-city.de/sonstiges/guiScreen2.jpg
Im Grunde ist es ein "Calculator-Mix" aus dem Bereich MaschBau und Informatik, den ich zu Lernzwecken "entwickle".
Daher ist beinahe alles vertreten von jLabel bis jTable. Und da ich es evtl. in absehbarer Zeit dieses "kleines Projekt" erweitern werde, sofern mir die Lust dazu nicht vergeht, wollte ich "schlampigen" Code vermeiden. Falls dieser als solcher überhaupt in diesem Fall zutrifft und das "Umschalten" zwischen den Ebenen auf dem anderen Wege nicht realisierbar ist. -
kozak schrieb:Ich habe mir den CardLayout jetzt nochmals genauer betrachtet. Auf den ersten Blick eignet es sich hervorragend für mein Problem, sofern ich die Vorgehensweise von diesem Layout richtig verstanden habe.
Wenn ich es stark zusammenfassend beschreiben würde, dann lege ich damit einen Art "Stapel" von "Karten" an und kann mich beliebig zwischen diesen bewegen. Ähnlich wie in der DLL mittels next(), previous() etc.
Stimmt so? Oder habe ich was wichtiges außen vor gelassen"?
Auch wenn ich mich mit DLLs nicht auskenne -- das ist genau die Beschreibung. Den Screenshots nach zu urteilen ist es perfekt für diesen Anwendungszweck geeignet (mein Beispiel funktioniert zwar, ist aber hier nicht die richtige Vorgehensweise). Zusätzlich kann man nicht nur die "Karte" über/unter der momentanen Anzeigen, sondern sie per selbst zu vergebendem Namen direkt auswählen. -
Du kannst ja deine verschiedenen Gruppen in JPanel's beliebig verschachteln - und dann ganze JPanels mit all ihrem Inhalt ausblenden.
Als LayoutManager empfehle ich:
BorderLayout
Damit funktionieren auch 'prefered size' Angelegeheiten sehr gut.
Damit geht ungefähr alles - man muss evtl. nur mehr verschachtelte JPanel's benutzen.
google lieferte auf die schnelle:
http://www.bbs-1.de/bbs1/umat/java_kurs/SelfJAVA/java0504.htm
(siehe oberste Zeichnung, das erklärt es recht gut.
pro JPanel-Ebene kann man natürlich auch verschiedene LayoutManager einsetzen. -
Das hatte ich erst auch in Betracht gezogen. Musste dann jedoch wieder schnell verwerfen, da ich (verstärkt) mit jTabbedPane's arbeite und das Zusammenspiel gestaltete sich komplizierter als gedacht. U.a. weil sich dort die JPanels nicht einfachso ausblenden lassen (mit setVisible(false) ist es nicht getan) und ich manchmal nicht komplett die "ganze Ebene" bzw JPanel ausblenden möchte, sondern nur gewisse Komponente auf dieser. Das hatte zur Folge, dass es einfach zu unübersichtlich wurde, weil im Endeffekt viele JPanels zum Einsatz kamen. In meinen Augen würde es vlt. für "schlanke" Apps passen, für mich leider nicht. Aber danke für den Tipp!
Bisher fahre ich gut mit dem CardLayout, den masysma erwähnt hat. Eignet sich (bisher) optimal für mein Vorhaben. Mal schauen, wie er sich weiter mit zunehmender Komplexität schlägt. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage