[Java] Probleme mit Fenstergestaltung (Swing)

DarkMo

Lötkolbengott/-göttin
huhu,

ich sitze gerade an nem client server progrämmchen mit multithreading als prüfungsbegleitendes projekt und ich verzweifel - an der fenstergestaltung -.-

folgender aufbau: ich versuch halt nen chat zu bauen und nen "mini irc" zu erstellen. hab als grund layout ein borderlayout gewählt in dem ich oben nen headerbereich habe (noch unbestimmt, was da mal reinkommen soll ^^), unten die eingabe zeile (also wo man selber seinen text schreibt und enter drückt bla), links sollen die channels dargestellt werden und rechts die user im channel. also einer unterm anderen. in der mitte groß und zentral ne textarea eben mit dem chat an sich.

soweit das grundkonzept. jetzt häng ich grad bei der channel liste. atm hab ich ne liste für die channels mit ner methode, mir nen button zu erstellen (nach typ des channels ne gewisse farbe und eben mit dem channel namen versehen - und buttons, weil ich später mit klick auf den button eben in den chan wechseln möchte). nun möcht ich gern dass die verfügbaren chanel-buttons von oben nach unten aufgeführt werden und dabei gleich breit sind. punkt. ist das zuviel verlangt? scheinbar *seuftz*

meine bisherigen versuche:
- einfach nen flowlayout. er baut die buttons oben beginnend nach unten, genau wie ichs mir wünsch - nur dass die buttons alle na andre breite haben -.-
- gridbaglayout - von allen gefeiert >< gut, ich habs hinbekommen, dass die buttons alle gleich breit sind und von oben nach unten angeordnet werden - nur füllen die den gesammten platz von oben nach unten aus xD die sollen aber nur so hoch sein wie nötig und oben kleben, fertig. ne geht wieder ned -.-
- gridlayout. wollte irgendwie auch ned funktionieren. da hat er alle nebeneinander gebaut statt untereinander *seuftz*
- grouplayout. sieht ganz gut aus, will aber ned funktionieren -.-

ergo meine frage in die runde: hat einer ne lösung, wie das funktionieren könnte? einfach in nem panel komponenten anordnen (in meinem fall buttons) die von oben beginnend untereinander angeordnet werden sollen und dabei die selbe breite besitzen? kann doch ned sein, das sowas simples nich umsetzbar is :what:
 
Moin,
probiers mal mit flowlayout und benutze
setPreferredSize

Code:
...
b2.setPreferredSize(b1.getPreferredSize()); 
b3.setPreferredSize(b1.getPreferredSize());                             
...
Lg.
 
eben probiert.

hab der channel klasse ne static variable für die breite gegeben und die immer aktualisiert. dummerweise haben die keine werte dafür, solange sie ned gezeichnet wurden :klatsch: bei sowas fragt man sich einfach, was die sich dabei gedacht haben... da haste solche möglichkeiten und sie sind ned nutzbar lol. naja, ich reg mich jetz ned auf.

gut, danach hab ichs mit set pref size und set size probiert - 0 erfolgo. es räumt den buttons den platz ein ja, aber sie nutzen ihn nich xD ja ne, wieso auch? wäre ja nur logisch und widerspricht damit dem vorherigen versuchsergebnis...

am ende hab ich jetz nen hässlichen workaround der erstmal funktioniert:
- gridlayout mit soviel zeilen wie channels in der liste
- in jede zeile nen button
... 3ma dürft ihr raten was er macht - er streched nen einzelnen button (oder generell wenig buttons) über die ganze höhe :ugly: jetz hab ichs mit ner hilfs variablen gelöst. er soll mind 20 zeilen machen oder eben soviele wie channels da sin. is aber ganz sicher auch ned kuhl, wenn man bei 50 channels nen fenster hat, was 2ma so groß wie der bildschirm is :P ABER, es geht erstma.

Code:
    private void updateChannelList() {
        if(this.channelPanel != null) this.getContentPane().remove(this.channelPanel);
        
        this.channelPanel = new JPanel();
        int size = 20;
        if(this.channels.size() > size) size = this.channels.size();
        this.channelPanel.setLayout(new GridLayout(size, 1));
        boolean active;
        for(int i = 0; i < this.channels.size(); i++) {
            active = false;
            if(this.channels.get(i).getName().equals(this.activeChannel.getName()))
                active = true;
            this.channelPanel.add(this.channels.get(i).getButton(active));
        }
        
        this.getContentPane().add(this.channelPanel, BorderLayout.WEST);
        this.getContentPane().invalidate();
        this.getContentPane().validate();
    }

also echt, sowas unnötig kompliziertes hab ich auch noch ned gehabt he... einfach den kram notfalls auch händisch mit ner position und dimension platzieren können - woaaaah alter, neeee.
 
Das ist jetzt kein Beitrag, der direkt zur Lösung deines Problems beiträgt, aber hast du dir mal JavaFX 2.0 angesehen?

Ich habe Swing ebenfalls abgrundtief gehasst (daran hat sich auch nichts geändert). JavaFX bietet dir die Möglichkeit, dein UI über gewöhnliche Markup- und Stylsheet-Strukturen zu designen, wie bei einer Webseite, oder Smartphone-App. Das ist ein absoluter Segen.

Ich kriege die Krätze bei Swing, jeder Separator, jeder Knopf, jedes Bild, jeder Furz wird über Objekt-Deklarationen eingefügt. Das ist sowas von Banane, der Quellcode sieht aus wie Sau. :klatsch: Seit ich mit JavaFX arbeite ist das Leben wieder schön. :haha: Es ist auch deutlich flexibler und mächtiger als Swing, auch wenn das für dein Beispiel sicher nicht so wichtig ist.
 
Für Eclipse gibts einen GUI-Builder für Java. Evtl. ist das ja was für dich, auch wenn viele Leute nichts von solchen GUI-Builder halten :ugly: Hab ich mir damals auch installiert, weil mir diese doofe flow und gridlayout einfach zu Hals raushängten und zu viel Zeit beanpruchten ^^
 
das prob is halt, dass det dynamisch is. aber man kann ja auch dem fenster ne größe vorgeben - die wird ned eingehalten xD der bastelt sich das beim zeichnen dann alles zurecht und vorm zeichnen (da wo man alles positioniert und einstellt usw) kannste genausogut in die heide spucken. macht genausoviel aus :ugly:

im moment is die "einstellung" halt so, dass das panel für 20 buttons untereinander platz schafft. will aber nich wissen, was passiert, wenn ich die größe änder >< vllt explodiert dann der rechner oder so ^^ naja, im endeffekt hat das mit meinem eigentlichen problem ja garnix zu tun, is also an und für sich egal für das projekt. aber MICH nervts einfach :P also was ich damit sagen will: an ner note wird DAS nu auch nix ändern ^^
 
Für Eclipse gibts einen GUI-Builder für Java. Evtl. ist das ja was für dich, auch wenn viele Leute nichts von solchen GUI-Builder halten :ugly: Hab ich mir damals auch installiert, weil mir diese doofe flow und gridlayout einfach zu Hals raushängten und zu viel Zeit beanpruchten ^^

GUI Builder für Java sind toll! :wow: Mein Gott, was hätte ich ohne den Google Window Builder gemacht?! Alles selber deklarieren, bis sich die Füchse gute Nacht sagen! :ugly: Das ändert aber nichts an dem grundlegenden FAIL, eine GUI über Objektdeklarationen aufzubauen. FINDE MAL den einen kleinen Popel-Button in deinem Quellcode, der mal ein wenig anders sein soll, als der Editor es zulässt. Und versuch mal eine logische Struktur im "UI-Quellcode" aufzubauen. Da wird man wahnsinnig...
 
Zurück