2010-04-26 14 views
7

In beiden meiner Java-Klassen, und die Bücher, die wir in ihnen verwendeten, die eine GUI mit Code auslegten, beteiligte stark den Konstruktor des JFrame. Die Standardtechnik in den Büchern scheint zu sein, alle Komponenten zu initialisieren und sie zu dem JFrame im Konstruktor hinzuzufügen, und anonyme Ereignisbehandlungsroutinen hinzuzufügen, um Ereignisse wo erforderlich zu behandeln, und das ist, was in meiner Klasse befürwortet wird.Best Practice mit JFrame-Konstruktoren?

Dies scheint ziemlich einfach zu verstehen und einfach zu arbeiten, wenn man eine sehr einfache GUI erstellt, aber scheint schnell hässlich und umständlich zu werden, wenn man etwas anderes als eine sehr einfache GUI macht. Hier ist ein kleines Codebeispiel von dem, was ich beschreibe:

public class FooFrame extends JFrame { 

    JLabel inputLabel; 
    JTextField inputField; 
    JButton fooBtn; 
    JPanel fooPanel; 

    public FooFrame() { 
     super("Foo"); 

     fooPanel = new JPanel(); 
     fooPanel.setLayout(new FlowLayout()); 


     inputLabel = new JLabel("Input stuff"); 
     fooPanel.add(inputLabel); 

     inputField = new JTextField(20); 
     fooPanel.add(inputField); 

     fooBtn = new JButton("Do Foo"); 
     fooBtn.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      //handle event 
     } 
     }); 
     fooPanel.add(fooBtn); 

     add(fooPanel, BorderLayout.CENTER); 
    } 

} 

Ist diese Art der Verwendung des Konstrukteurs des beste Weg, um eine Swing-Anwendung in Java zu programmieren? Wenn ja, welche Techniken kann ich verwenden, um sicherzustellen, dass diese Art von Konstruktor organisiert und wartbar ist? Wenn nicht, was ist die empfohlene Vorgehensweise, um ein JFrame in Java zusammenzustellen?

Antwort

1

Leider gibt es dort viele schlechte Bücher. Und viel schlechter Code.

Sie sollten die Vererbung nicht missbrauchen, indem Sie sie verwenden, wo es nicht notwendig ist. (Okay, es gibt das Double Brace-Idiom, das einen kompletten Vererbungsfehler darstellt.) Dies gilt für JFrame, JPanel, Thread und praktisch alles außer java.lang.Object.

Auch ist es eine sehr gute Idee, Felder private und wenn möglich final zu machen. Es stellt sich heraus, dass Verweise auf Komponenten in der Regel nicht in Feldern gespeichert werden müssen, zumindest nicht so.

+0

Sie sagen also, dass Sie JFrame nicht unnötig erweitern müssen, wie ich es oben getan habe, aber in einer separaten Klasse einen neuen JFrame erstellen und ihm Komponenten hinzufügen? Dies scheint eine ziemlich vernünftige Vorgehensweise zu sein. Kennen Sie gute Referenzen, um zu erfahren, wie Swing-GUI-Code strukturiert wird? Danke für die Eingabe. –

1

Wie Sie gerade gesagt haben, scheint dies eine Technik zu sein, die von den Büchern gelehrt wird. Was ich getan habe, um zumindest einen Überblick über die verschiedenen Aspekte zu bekommen, ist die Trennung der ui-Ansichten von den ui-Controllern. In Ihrem Fall würde das bedeuten, dass Sie separate Klassen für die Ereignisbehandlung schreiben könnten. Eine weitere hilfreiche Methode besteht darin, private Methoden zu verwenden, um verschiedene Teile Ihrer Benutzeroberfläche zu trennen. Mit anderen Worten, die generellen Refactoring-Techniken könnten auch in diesem Fall hilfreich sein.

3

Wenn Sie eine komplexere Benutzeroberfläche erhalten, empfehle ich, dass Sie verschiedene JPanels vom JFrame trennen, so dass sie zu "Modulen" oder "Bausteinen" Ihrer Benutzeroberfläche werden.

0

Ich habe keine bestimmten Regeln hier, mit Ausnahme von:

  • immer Attributen privat machen, und wenn es möglich ist endgültig
  • die Verwendung von privaten Bereichen minimieren. Jede Komponente, die nicht außerhalb des Konstruktors verwendet wird, sollte nur im Konstruktor und nicht als Feld deklariert werden (in Ihrem Beispiel inputLabel)
  • Verwenden Sie nur anonyme Listener, wenn wenig Code beteiligt ist. Wenn sie zu groß werden, bedeutet das normalerweise, dass man sie zerlegen oder in private Klassen oder separate Klassen einteilen muss.
  • Und wie Jonas sagte, halte die Klassen JFrame, JDialog etc. schlank, indem du die Hauptbausteine ​​in separaten Klassen durchbrechst.