Wie sieht für euch die perfekte GUI-Library aus?



  • javax.swing.* und darin verwendete reste aus awt. erfüllt alles wichtige

    1. einheitliche schnittstellen
    2. sinnvolle interfaces
    3. easy-to-use (im sinne von intuition und benutzbarkeit der komponenten. als beispiel: ich speichere meine objekte in eine JListView, angezeigt werden sie über die toString methode, und wenn ich ein getSelected mache, bekomme ich einen zeiger auf das objekt als solches. wahnsinn. so kann ich perfekt arbeiten!)
    4. automatisches layout. hat man sich einmal dran gewöhnt gibt mans nicht mehr her
    5. rad entwicklungstools vorhanden (eclipse visual editor)

    ihr merkt, ich bin ein java fan geworden...



  • @Korbinian: Full ACK. Ich habe in der Schule mit Java zuerst beginnen müssen und jetzt bin ich vollkommen umgestiegen. Es ist alles so schön logisch, gut designed und einfach. Bevor ich mir in C++ überlegt habe welche GUI ich überhaupt benutzen möchte steht die GUI mit Java bereits. Ganz einfach kann man per MVC-Modell eigene Komponenten hinzufügen und das System der Listener ist auch toll (keine dummen Zeiger auf Funktionen (oder gar Methoden) mehr).

    MfG SideWinder



  • Ich stimme zu. Allerdings muss ich schon auch zugeben, dass mich die delegates von .Net noch mehr reizen als die Listener. Viele Listener-Klassen zu haben, ist schon hässlich, viele Event-Methoden nicht. Aber die Winforms kommen vom Design her nicht an Swing ran.
    Allerdings mussten die auch das ugly WinAPI kapseln. 😃

    EDIT: Man beachte vor allem auch anonyme delegates. So macht das richtig Freude, weil man sich nicht mal mehr so direkt für die Signatur einer Methode interessieren muss. static? private? protected? Wie waren nochmal die Parameter für dieses Event-delegate?

    myButton.Click  +=  { Console.Out.WriteLine("Jo oida, ich wurde angeklickt."); }
    


  • Ich finde gtkmm ist eigentlich schon ziemlich gut, folgende Dinge nerven aber:

    1. Das Widget für Listen und Bäume (Gtk::TreeView) hat eine unnötig komplizierte API und ist daher eigentlich nur schlecht zu gebrauchen.
    2. Es gibt ein zu großes Durcheinander, wann man jetzt Objekte, Zeiger oder RefPtr übergeben muss.
    3. gtkmm ist, wenn man keinen Paketmanager hat, der die Abhängigkeiten selbst auflöst, relativ schwierig zu installieren. Besonders lustig wird es, wenn man nicht nur ein gtkmm-Programm unter Windows ausführen will, sondern auch noch unter Win32 gtkmm-Programme entwickeln will.

    Ansonsten lobe ich mir aber das saubere Signalkonzept (ohne Metacompiler wie bei QT und keine Makros wie z.B. bei wxWidgets oder Fox), die Aufteilung in Namespaces und die Unterstützung von STL-Containern.



  • SideWinder schrieb:

    das System der Listener ist auch toll (keine dummen Zeiger auf Funktionen (oder gar Methoden) mehr).

    Ne, tut mir leid, das kann ich überhaupt nicht haben. Das Prinzip ist einfach doof.



  • Helium schrieb:

    SideWinder schrieb:

    das System der Listener ist auch toll (keine dummen Zeiger auf Funktionen (oder gar Methoden) mehr).

    Ne, tut mir leid, das kann ich überhaupt nicht haben. Das Prinzip ist einfach doof.

    Verstehe ich nicht. Kannst du das mal erklären? Aus meiner Sicht ist das eine ganz kleine Variation des Observer-Patterns, das da implementiert wurde. Da ist also nichts Schlimmes dran und wird von vielen als gute Lösung angesehen. Wenn du sagst, dass es Mist ist, sollte also schon ein bischen Rechtfertigung bzw. Erklärung dahinter stehen.



  • Ich find das Observer-Pattern allgemein meistens doof. Das wirkt meistens so, als müsste man irgenwie um die fehlende Möglichkeit Funktionen/Methoden zu speichern etwas herumbasteln. Dann hat man seinen Observer, die ganzen Listener, ... wobei alles deutlich einfacher ginge (siehe z.B. die von Optimizer angesprochenen Delegates).

    Es gibt da so einige gängige Design-Pattern, die ich total überflüssig finde, weil man mit Delegates, bzw. vergleichbarem eine deutlich einfacher handzuhabende Lösung formulieren kann.



  • Helium schrieb:

    Das wirkt meistens so, als müsste man irgenwie um die fehlende Möglichkeit Funktionen/Methoden zu speichern etwas herumbasteln.

    Diese Ansicht kann ich auch nicht ganz teilen. Ich finde nichts hässlicher als die Funktionspointer und Methodenpointer in C++. Vor allem, dass sie nicht austauschbar sind.
    Delegates sind natürlich sehr butterweich. In .Net ist es so geil, weil es egal ist, ob die Methode static ist oder nicht und sogar virtuelle Methoden funktionieren. Es muss einfach nur die Signatur passen.
    Aber wenn ich wählen müsste zwischen C++ - Pointer und Observer, ist die Wahl für mich klar. 🙂



  • Helium schrieb:

    Ich find das Observer-Pattern allgemein meistens doof. Das wirkt meistens so, als müsste man irgenwie um die fehlende Möglichkeit Funktionen/Methoden zu speichern etwas herumbasteln. Dann hat man seinen Observer, die ganzen Listener, ... wobei alles deutlich einfacher ginge (siehe z.B. die von Optimizer angesprochenen Delegates).

    Hmmm... Ich nutze für die Reaktion auf Menupunkte nur sehr wenige Listener-Klassen, die jeweils für viele unterschiedliche Dinge verantwortlich sind. Da ich mich gerne von den besseren/eleganteren Möglichkeiten der Delegates überzeugen lassen würde, möchte ich dich bitten, anhand folgender Listener-Klasse eine entsprechende Lösung mit Delegates zu schreiben und hier zu präsentieren. Ich bin nämlich etwas skeptisch, ob das so mit Delegates geht und halte Listener-Klassen somit für mächtiger.

    import java.awt.event.*;
    
    public class ThreadStarter implements ActionListener
    {
       private final Runnable runnable;
    
       /** Creates a new instance of ThreadStarter */
    
       public ThreadStarter(final Runnable runnable)
       {
          this.runnable = runnable;
       }
    
       public void actionPerformed(ActionEvent e)
       {
          final Thread thread = new Thread(runnable);
          thread.setPriority(Thread.MIN_PRIORITY);
          thread.start();
       }
    }
    


  • Optimizer schrieb:

    In .Net ist es so geil, weil es egal ist, ob die Methode static ist oder nicht und sogar virtuelle Methoden funktionieren. Es muss einfach nur die Signatur passen.

    Oh, damit hat sich mein Punkt wohl erledigt, oder?! 😃



  • Optimizer schrieb:

    Helium schrieb:

    Das wirkt meistens so, als müsste man irgenwie um die fehlende Möglichkeit Funktionen/Methoden zu speichern etwas herumbasteln.

    Diese Ansicht kann ich auch nicht ganz teilen. Ich finde nichts hässlicher als die Funktionspointer und Methodenpointer in C++. Vor allem, dass sie nicht austauschbar sind.
    Delegates sind natürlich sehr butterweich. In .Net ist es so geil, weil es egal ist, ob die Methode static ist oder nicht und sogar virtuelle Methoden funktionieren. Es muss einfach nur die Signatur passen.
    Aber wenn ich wählen müsste zwischen C++ - Pointer und Observer, ist die Wahl für mich klar. 🙂

    OK, mein erster Post in diesem Thread war etwas missverständlich. Ich meinte nur, dass ich Listener nicht so toll finde, wie SideWinder, nicht das Funktions oder Methodenzeiger toll wären. Wie du bevorzuge ich Delegates.

    Und in C++ kann man dann immer noch zu tausend anderen Dingen greifen, als zu rohen Zeigern.


Anmelden zum Antworten