# GUIs mit Java - Eine Katastrophe!



## Guest (22. Feb 2008)

Hallo!

Ich habe im Laufe der Jahre als Programmierer schon unzählige Programme geschrieben, darunter auch sehr viele GUI-Anwendungen.

Leider muss ich sagen: Java ist hierbei eine einzige Katastrophe!

Das Problem ist meines Erachtens vor allem die übermäßig kompliziert ausgefallene "Container-Logik", welche Java für die GUI-Erstellung vorsieht (angeblich zugunsten des Plattformunabhängigkeit...). 

NetBeans soll ja offenbar den besten GUI-Builder haben- tja, leider sitze ich dennoch stundenlang davor und frickle Buttons nebeneinander, die dann willkürlich wieder auf der Form umherspringen (dank der "Hilfen" des Free Designs) etc.

Wechselt man ins Null- oder Absolute-Layout, bekommt man dafür gar keine Hilfe mehr- kein Zentrieren (das, da man es nur für min. 2 Controls anwenden kann, ohnehin unbrauchbar ist), nichts.

Die Zeit, die ich brauche, um mit dem Customizing-Editor mein GridBagLayout anzupassen, ist auch nicht kürzer als wenn ich den dafür benötigten Code tippe- sprich: beide Möglichkeiten dauern ewig und liefern unzufriedenstellende Resultate: Im Endeffekt sieht es nämlich nochmal ganz anders aus als im Designer bzw. im Kopf.... .

Meine Frage: Wieso tut ihr euch solch eine Katastrophe freiwillig an?!


----------



## Wildcard (22. Feb 2008)

Ich benutze überhaupt keine GUI Builder und komme wunderbar zurecht.
Hast du eine konkrete Frage, oder nur ein wenig trollen am Freitag Abend?


----------



## Guest (22. Feb 2008)

1. ist meine Frage sehr wohl konkret
2. kann man meinen Post wohl kaum als Troll bezeichnen- These, Beispiel, Beleg- alles da.
3. fiele wohl eher deine Antwort als ein solcher aus- eine Aussage ohne jegliche Begründung oder ähnliches... .

Um weitere Kommentierung des ursprünglichen Frage wird gebeten


----------



## AlArenal (22. Feb 2008)

Anonymous hat gesagt.:
			
		

> Meine Frage: Wieso tut ihr euch solch eine Katastrophe freiwillig an?!



Weil wir es nicht als Katastrophe sehen und bestens damit klarkommen. Vielleicht fehlt dir die Übung oder du hast die kritische Masse noch nicht erreicht. Ist mir persönlich auch relativ, denn so lange ich klarkommen ist für mich alles im Lack 

Wie sagt man doch:
Wenn man nicht schwimmen kann, liegts nicht an der Badehose.


----------



## 0x7F800000 (22. Feb 2008)

Anonymous hat gesagt.:
			
		

> Im Endeffekt sieht es nämlich nochmal ganz anders aus als im Designer bzw. im Kopf....



liegt das problem vielleicht eher im kopf? lässt sich mit ein wenig training imho recht schnell beheben... obwohl, zugegeben, ich mag diese sachen auch nicht sonderlich, aber ich tippe das trotzdem alles selbst ein, da hat man mehr kontrolle...

Am besten gefallen mir natürlich Vollbild-Anwendungen mit 123456789-W-A-S-D-Ctrl-Space + Maus steuerung


----------



## Guest (22. Feb 2008)

> liegt das problem vielleicht eher im kopf?



Mag sein, doch egal wie ich es mir überlege, mit dem Container-Design bekomme ich so etwas nicht hin: http://home.arcor.de/favorithsoft/downloads/finals/voccoachv2/screenshot.jpg

und NetBeans FreeDesign hat die tolle Eigenschaft, bei einer falschen Bewegung das Layout komplett zu zerstören- sodass es manchmal nicht einmal mehr über ein Undo zu retten ist... .

Wohlgemerkt: Oben gezeigtes Programm habe ich vor _langer_ Zeit geschrieben- und dabei für das GUI-Design ein paar lächerliche Minuten gebraucht... .


----------



## Wildcard (22. Feb 2008)

Mit einem flexiblen LayoutManager wie zB TableLayout oder GridBagLayout ist das absolut kein Problem.
Verschachtelte Panels würden genauso funktionieren.
Ohnehin frage ich mich was du mit Container-Design meinst. Es gibt Panels, die benutzt man, oder nicht.


----------



## Murray (22. Feb 2008)

Anonymous hat gesagt.:
			
		

> und NetBeans FreeDesign hat die tolle Eigenschaft, bei einer falschen Bewegung das Layout komplett zu zerstören- sodass es manchmal nicht einmal mehr über ein Undo zu retten ist...


Du lehnst also die Sprache insgesamt ab, weil *ein* Werkzeug dafür (Netbeans)  in einem bestimmten Teilbereich (GUI-Design) nicht Deinen Ansprüchen genügt?


----------



## Beni (22. Feb 2008)

Ich habe heute den ganzen Tag mit SWT gearbeitet - etwas das ich so oft wie möglich vermeide - und war stellenweise extrem frustriert. Stundenlang habe ich versucht Knoten in ein TreeView zu bringen, und es wollte einfach nicht funktionieren. Bis ich bemerkt habe, dass die TreeColumn eine Breite > 0 benötigt.
Aber mit der Zeit lernt man mit den Besonderheiten jeder Library umzugehen, und hat man erstmal die wichtigsten Funktionen und Grundideen im Kopf, geht es plötzlich ganz leicht.

So ist das auch mit Swing, und besonders dem GridBagLayout. Letzteres erfordert eingehende Studien von API-Dokumentation und Beispielen, aber irgendwann kann man so ein Layout flüssig hinschreiben. Übung ist alles.

Was das Bild angeht. Ich sehe da ein paar durchsichtige Container (jop, das kann man in Swing machen), und ein paar Bilder (Punkte, Buttons) die in irgendeinem Bildbearbeitungsprogramm gemacht wurden. Das könnte man unter Swing hinkriegen, mit GridBagLayout sogar innert nützlicher Frist. :wink:


----------



## Wildcard (22. Feb 2008)

Beni hat gesagt.:
			
		

> Ich habe heute den ganzen Tag mit SWT gearbeitet - etwas das ich so oft wie möglich vermeide - und war stellenweise extrem frustriert.


Ich kann dich verstehen, ging und geht mir oft noch genau so, aber dank JFace und dem Forms-Toolkit ist die Sache wesentlich einfacher geworden und sieht am Ende nett aus.
Was mir an SWT gefällt ist, dass mit jedem neuen Release neue nützliche Widgets eingebaut werden.
In Swing passiert das nur noch über externe Libs.


----------



## Marco13 (22. Feb 2008)

Ganz subjektiv: Das Layout in dem Screenshot, den du gepostet hast, ist ....  :autsch: (Aber schöne, stylishe Buttons    :roll: ) (Vielleicht hab' ich da eine etwas zu .. pragmatische.... Sicht.... )

Ich jedenfalls habe auch noch nie einen GUI-Builder verwendet (nur mal den Code gesehen, den einige da produzieren, und da hat's mir schon gereicht). Ob sich deine Kritik nur auf das gesamte Swing-Framework bezieht, oder NUR auf die Layout-Sachen, ist mir jetzt nicht ganz klar. Ich finde Swing jedenfalls klasse, und kenne kein GUI-Framework, das so gut und ausführlich und konsistent mit dedizierten Tutorials und Beispielprogrammen dokumentiert ist, wie Swing. Und wenn's um's Layout geht: BorderLayout, GridLayout, ab und zu ein BoxLayout, mehr braucht's meistens nicht....


----------



## Guest (23. Feb 2008)

Marco13 hat gesagt.:
			
		

> Ich finde Swing jedenfalls klasse, und kenne kein GUI-Framework, das so gut und ausführlich und konsistent mit dedizierten Tutorials und Beispielprogrammen dokumentiert ist, wie Swing.


Das ist etwas übertrieben. Es ist ziemlich viel Müll dabei, auch bei den Beispielen, die im Umlauf sind. 
Trotzdem ist gerade Layout in Swing relativ einfach. Schlimmer ist die Integration in das Look & Feel 
der Zielplatform. Da ist z.B. SWT/JFace oder von mir aus auch Qt viel besser.

Lerne den Umgang mit GridBagLayout und du brauchst nichts anderes mehr.

Gruß,
Ein anderer Gast


----------



## AlArenal (23. Feb 2008)

Anonymous hat gesagt.:
			
		

> Schlimmer ist die Integration in das Look & Feel der Zielplatform. Da ist z.B. SWT/JFace oder von mir aus auch Qt viel besser.



Wobei sich da auch immer die Sinnfrage stellt. Braucht der Kunde das wirklich? Was bringt es ihm, außer dass er mehr zahlen muss, weil die Entwicklungskosten steigen?


----------



## PELLE (23. Feb 2008)

GUI Desinger für java sind alle unproduktiv, langsam, zerhauen das layout,umständlich etc... GUI Designer wie der QT 4 oder in VS 2008 sind top. Da ich aber nur java code mit Programmfenster die nicht resized werden und nur auf windows laufen da ich nur für mich oder Freunde code die Windows haben nutze ich das nulllayout mit superschneller positionierung sprich das 1mal1 wird trainiert und man bleibt jung und fit im Kopf  :lol:

selbst sun empfiehlt das null layout wenn man nicht multiplattform codet und kein frame resize benötigt  :bae:


----------



## Wildcard (23. Feb 2008)

PELLE hat gesagt.:
			
		

> selbst sun empfiehlt das null layout wenn man nicht multiplattform codet und kein frame resize benötigt  :bae:


Quelle bitte.
Selbst auf einer einzigen Plattform ist null 'layout' nicht zu gebrauchen, selbst wenn ein Fenster (warum auch immer nicht) resized werden kann.
Bei absoluten Positionen kannst du weder auf das Locale, noch auf den Style der Zielplatform rücksicht nehmen.
null Layout würde ich nichtmal benutzen wenn ich ein Programm nur für mich alleine schreiben würde, da es auch noch mehr arbeit ist.


----------



## Beni (23. Feb 2008)

PELLE hat gesagt.:
			
		

> Da ich aber nur java code mit Programmfenster die nicht resized werden und nur auf windows laufen da ich nur für mich oder Freunde code die Windows haben nutze ich das nulllayout mit superschneller positionierung sprich das 1mal1 wird trainiert und man bleibt jung und fit im Kopf  :lol:












Mit einem LayoutManager musst du nichtmal die Position und Grösse der Componenten ausrechnen -> faule Programmierer benutzen LayoutManager :wink:


----------



## Guest (23. Feb 2008)

> Du lehnst also die Sprache insgesamt ab, weil *ein* Werkzeug dafür (Netbeans) in einem bestimmten Teilbereich (GUI-Design) nicht Deinen Ansprüchen genügt?


Nein, ich lehne nicht die gesamte Sprache ab, sondern verurteile das meiner Meinung nach übermäßig kompliziert geratene Konzept der Layout-Manager - denn:


> GUI Desinger für java sind alle unproduktiv, langsam, zerhauen das layout,umständlich etc... GUI Designer wie der QT 4 oder in VS 2008 sind top.


... dem stimme ich zu- GUIs mit Visual Studio zu erstellen geht wunderbar schnell und unkompliziert- so wünsche ich mir das auch für Java... .




> Was das Bild angeht. Ich sehe da ein paar durchsichtige Container


Was genau meinst du mit unsichtbaren Containern? So etwas wie unsichtbare Panels um bestimmte Abstände zu gewährleisten?!

Überhaupt würde mich interessieren, wie ich mit dem GridBagLayout das gezeigte Layout hinbekomme- denn selbst wenn ich es _einigermaßen_ bewerkstelligt habe, sieht der Frame zur Laufzeit wieder ganz anders aus, was möglicherweise an dem von mir verwendeten Substance-Look and Feel liegt, jedoch somit ein weiterer Punkt auf meiner Contra-Java-GUIs-Liste ist- weshalb bleiben bei einem anderen LaF denn nicht die Verhältnisse (Abstände, Größen etc.) erhalten? Ich dachte das sei der Sinn der Layout-Manager?!


----------



## Beni (23. Feb 2008)

@Durchsichtige Panels: genau. Wenn man das zusammenbastelt, könnte dann sowas rauskommen:






Für die Farben entschuldige ich mich, aber Bilder wollte ich nicht auchnoch basteln. Obwohl, Bilder haben eine feste Grösse, könnte das alles sogar einfacher machen.


```
package test;

import java.awt.*;

import javax.swing.*;

public class LayoutFrame extends JFrame{
    public static void main( String[] args ) {
        LayoutFrame frame = new LayoutFrame();
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );
    }
    
    public LayoutFrame(){
        setContentPane( createContent() );
    }
    
    private Container createContent(){
        JPanel parent = new BackgroundPanel( new GridBagLayout() );
        
        Component center = createCenter();
        JSeparator line = new JSeparator( JSeparator.HORIZONTAL );
        Component footer = createFooter();

        parent.add( center, new GridBagConstraints( 0, 0, 1, 1, 1.0, 1000.0, 
                GridBagConstraints.CENTER, GridBagConstraints.BOTH, 
                new Insets( 20, 100, 5, 100 ), 0, 0 ));
        parent.add( line, new GridBagConstraints( 0, 1, 1, 1, 1.0, 1.0, 
                GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, 
                new Insets( 0, 0, 0, 0 ), 0, 0 ));
        parent.add( footer, new GridBagConstraints( 0, 2, 1, 1, 1.0, 1.0, 
                GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, 
                new Insets( 20, 100, 5, 100 ), 0, 0 ));
        
        return parent;
    }
    
    private Component createCenter(){
        JPanel parent = new InvisiblePanel( new GridBagLayout() );

        JLabel title = new JLabel( "<html><font size=25><u>Sprachauswahl</u></font></html>" );
        
        JLabel blopChoice = new JLabel( "<html><font size=30>O</font></html>" );
        JLabel titleChoice = new JLabel( "Waehlen Sie eine Sprache aus der Liste aus" );
        JComboBox choice = new JComboBox( new Object[]{ "Deutsch <=> Franzoesisch" } );
        choice.setEditable( false );
        choice.setSelectedIndex( 0 );
        
        JLabel orLabelChoice = new JLabel( "<html><font size=8>oder</font></html>" );
        
        JLabel blopLoad = new JLabel( "<html><font size=30>O</font></html>" );
        JLabel titleLoad = new JLabel( "Laden Sie eine Vokabelliste von der Festplatte" );
        JButton buttonLoad = new JButton( "Vokabelliste laden" );
        
        JLabel orLabelLoad = new JLabel( "<html><font size=8>oder</font></html>" );
        
        JLabel blopLabelNew = new JLabel( "<html><font size=30>O</font></html>" );
        JLabel titleNew = new JLabel( "Legen Sie eine neue Vokabelliste an" );
        JButton buttonNew = new JButton( "Neue Vokabelliste" );
        
        // add
        parent.setLayout( new GridBagLayout() );
        
        add( parent, title, 1, 0, 1, 1, false, new Insets( 10, 10, 10, 10 ));
        
        add( parent, blopChoice, 0, 1, 1, 3, 3.0, 3.0, GridBagConstraints.NORTH, new Insets( 20, 20, 20, 20 ));
        add( parent, new InvisibleBox( blopChoice, 1, 1.0/3.0), 1, 1, 1, 1, true, new Insets( 20, 5, 5, 5 ));
        add( parent, titleChoice, 1, 2, 1, 1, 1.0, 1.0, GridBagConstraints.NORTHWEST, new Insets( 0, 5, 5, 5 ));
        add( parent, choice, 1, 3, 1, 1, false, new Insets( 5, 5, 5, 5 ));
        
        add( parent, orLabelChoice, 0, 4, 1, 1, false, new Insets( 2, 2, 2, 2 ));
        add( parent, new InvisibleBox( orLabelChoice, 1, 1 ), 2, 3, 1, 1, false, new Insets( 2, 2, 2, 2 ) );
        
        add( parent, blopLoad, 0, 5, 1, 3, 3.0, 3.0, GridBagConstraints.NORTH, new Insets( 20, 20, 20, 20 ));
        add( parent, new InvisibleBox( blopLoad, 1, 1.0/3.0), 1, 5, 1, 1, true, new Insets( 20, 5, 5, 5 ));
        add( parent, titleLoad, 1, 6, 1, 1, 1.0, 1.0, GridBagConstraints.NORTHWEST, new Insets( 0, 5, 5, 5 ));
        add( parent, buttonLoad, 1, 7, 1, 1, false, new Insets( 5, 5, 5, 5 ));
        
        add( parent, orLabelLoad, 0, 8, 1, 1, false, new Insets( 2, 2, 2, 2 ));
        add( parent, blopLabelNew, 0, 9, 1, 3, 3.0, 3.0, GridBagConstraints.NORTH, new Insets( 20, 20, 20, 20 ));
        add( parent, new InvisibleBox( blopLabelNew, 1, 1.0/3.0), 1, 9, 1, 1, true, new Insets( 20, 5, 5, 5 ));
        add( parent, titleNew, 1, 10, 1, 1, 1.0, 1.0, GridBagConstraints.NORTHWEST, new Insets( 0, 5, 5, 5 ));
        add( parent, buttonNew, 1, 11, 1, 1, false, new Insets( 5, 5, 5, 5 ));
        
        return parent;
    }
    
    private Component createFooter(){
        JPanel parent = new InvisiblePanel( new GridLayout( 1, 3 ));
        JButton start = new JButton( "Abfrage starten" );
        JButton stop = new JButton( "Beenden" );
        
        parent.add( new InvisiblePanel( null ) );
        
        JPanel startPanel = new InvisiblePanel( new GridBagLayout() );
        add( startPanel, start, 0, 0, 1, 1, false, new Insets( 1, 1, 1, 1 ));
        
        JPanel stopPanel = new InvisiblePanel( new GridBagLayout() );
        add( stopPanel, stop, 0, 0, 1, 1, false, new Insets( 1, 1, 1, 1 ));
        
        parent.add( startPanel );
        parent.add( stopPanel );
        
        return parent;
    }
    
    private void add( Container parent, Component child, int x, int y, int w, int h, boolean center, Insets insets ){
        add( parent, child, x, y, w, h, 1.0, 1.0, center ? GridBagConstraints.CENTER : GridBagConstraints.NORTH, insets );
    }
    
    private void add( Container parent, Component child, int x, int y, int w, int h, double cw, double ch, int anchor, Insets insets ){
        parent.add( child, new GridBagConstraints(
                x, y, w, h, cw, ch, anchor,
                GridBagConstraints.NONE, insets, 0, 0 ));
    }
    
    private static class BackgroundPanel extends JPanel{
        public BackgroundPanel( LayoutManager manager ){
            super( manager );
        }
        
        @Override
        protected void paintComponent( Graphics g ) {
            Graphics2D g2 = (Graphics2D)g;
            g2.setPaint( new GradientPaint( 0, 0, new Color( 100, 255, 100 ),
                    getWidth(), 0, new Color( 100, 100, 255 )) );
            g2.fillRect( 0, 0, getWidth(), getHeight() );
        }
    }
    
    private static class InvisiblePanel extends JPanel{
        public InvisiblePanel( LayoutManager manager ){
            super( manager );
            setOpaque( false );
        }
    }
    
    private static class InvisibleBox extends JPanel{
        private Component size;
        private double fw, fh;
        
        public InvisibleBox( Component size, double fw, double fh ){
            this.size = size;
            this.fw = fw;
            this.fh = fh;
            setOpaque( false );
        }
        
        @Override
        public Dimension getPreferredSize() {
            Dimension size = this.size.getPreferredSize();
            return new Dimension( (int)(fw * size.width), (int)(fh * size.height));
        }
    }
}
```


----------



## The_S (25. Feb 2008)

Führ Visual Studio bezahlste halt auch gleich mal ne Stange Geld. Und wenn du mit dem (zugegeben recht komplexen) GridBagLayout nicht zurecht kommst, dann verwende das TableLayout oder das FormLayout von JGoodies.


----------



## PollerJava (25. Feb 2008)

Visual Studio is halt auch von Microsoft -> unterstützt kein Java, Man hüpft ewig den Microsoft teilen hinterher und wehe es fehlt eine *.dll -> dann wirds ganz lustig,
Also ich würd jetzt NetBeans und Visual Studio 2005 nich unbedingt vergleichen, ich arbeite mit beiden, bin aber froh , wenn ihc keine Microsoft- Sachen beuten muss, 
Gnerell würd ich mir aber das C/C++ Plugin für NetBeans oder Eclipse runterladen und mit dem arbeiten,


----------

