tutorials.de Buch-Aktion 05/2012
  • [Java FAQ] Swing-Tricks


    Obwohl alles natürlich in der Dokumentation und Teilweise auch in manchen Büchern erklärt sein mag, will ich heute mal einige Fragen beantworten, die sich mir selber beim GUI-Programmieren in Java oft gestellt haben.
    1. Mein JAR-file kann nicht umbenannt / verschoben werden, da es angeblich noch ausgeführt wird, dabei ist das Fenster doch geschlossen. Wie verhindere ich so was?
      Der JFrame muss wissen, dass er beim Klick aufs rote X auch das Programm schließen soll. (Eine Anwendung kann ja schließlich auch mehrere Fenster haben.)
      Code java:
      1
      
      setDefaultCloseOperation(EXIT_ON_CLOSE);
    2. Ich will dass ein ENTER-Druck, während der Cursor in einem bestimmten Textfeld ist, wie ein Button-Klick wirkt. Mit einem KeyListener komme ich aber nicht weiter, wie macht man so etwas?
      Registriere einfach den selben ActionListener wie beim Button.
    3. Beim skalieren eines JFrame ordnen sich die Komponenten oft nicht wie gewollt an, muss es deshalb immer das GridBagLayout sein?
      Nein, wenn die Größe fest sein darf, sollte man sie auch so einstellen:
      Code java:
      1
      
      setResizable(false);
    4. Wie ersetzt man das Kaffeetassen-Icon durch ein eigenes?
      Achtung: .ico- & .bmp-Dateien sind ungeeignet!
      Code java:
      1
      
      setIconImage(new ImageIcon(getClass().getResource("/yourpackage/icon.png")).getImage());
    5. Eine Animation flackert, kann das einfach behoben werden?
      Oft hilft hier Doppelpufferung die in Swing einfach umzusetzen ist:
      Code java:
      1
      
      setDoubleBuffered(true);
      (es wird vor dem Zeichnen ein Offscreen-Image erzeugt)
    6. Ich aktualisiere einen Dialog, die Darstellung verändert sich aber erst nach einer manuellen Größenänderung, was wird dabei aufgerufen, dass die Darstellung updatet?
      Code java:
      1
      
      validate();
    7. Bei einem Applet verändert sich die Hintergrundfarbe nicht, warum hilft
      Code java:
      1
      
      setBackground(Color.blue);
      den nichts?

      die Farbe muss beim ContentPane des JApplets gesetzt werden.
      Code java:
      1
      
      getContentPane().setBackground(Color.BLUE);
    8. Wenn Buttons den Fokus haben bekommen sie ein unschönes Viereck (wie HTML-Buttons im Internet Explorer), kann ich das abstellen?
      Code java:
      1
      
      setFocusPainted(false);
    9. Wie zeigt man ein Fenster von Beginn an maximiert, also den ganzen Bildschirm füllend an?
      Code java:
      1
      
      setExtendedState(JFrame.MAXIMIZED_BOTH);
    10. Ich gebe einem Widget mit
      Code java:
      1
      
      requestFocus();
      den Fokus, weshalb hat sie ihn trotzdem nicht mal am Anfang?

      Swing vergibt den Fokus recht spät nochmal automatisch, um sicher zu gehen, dass die Methode "requestFocus()" wirklich wirkt, muss sie nach dem Konstruktor des JFrame, in der Main-Methode aufgerufen werden.
    11. Ein Button soll nur ein Icon haben, muss der störende Rand sein?
      Nein, schon eine Codezeile schafft Abhilfe:
      Code java:
      1
      
      setContentAreaFilled(false);
    12. Mein Programm muss langwierige Operationen ausführen, kann man verhindern, dass es Gefahr läuft abzustürzen wenn der Benutzer zu oft klickt?
      Ja, der NetBeans-GUI-Designer macht es schon von selbst, ansonsten die kritischen Stellen in einen solchen Block:
      Code java:
      1
      2
      3
      4
      5
      
      java.awt.EventQueue.invokeLater(new Runnable() { 
               public void run() { 
                  // CPU-intensive Stelle
               } 
      });
      Wirkung: das Programm entscheidet selbst, wann der Teil ausgeführt wird (nur wenn es keinen Absturz zur Folge haben kann).
    13. Wie kriegt man einen JFrame mittig dargestellt, ohne mühsam size und location aus den Daten von Toolkit.getDefaultToolkit().getScreenSize(); errechnen zu müssen?
      Code java:
      1
      
      setLocationRelativeTo(null);
    14. Wie spiele ich möglichst einfach eine Sound-Datei ab (nur für Applets)?
      Code java:
      1
      2
      3
      4
      5
      6
      7
      
      @Override
      public void init() {
          ...
          AudioClip clip = getAudioClip(getCodeBase("sound.wav"));
          clip.play();
          ...
      }
    15. Aus irgend einem Grund ist das Hauptfenster auch bedienbar, wenn ein Dialog offen ist, wie sperre ich es?
      Der betreffende Dialog sollte "modal" gemacht werden:
      Code java:
      1
      
      setModal(true);
    16. Irgendwie gefällt mir das Standart-L&F nicht, das coole Nimbus steht oft nicht zur Verfügung, wie passe ich meine Swing-Applikation also nun gut an jedes OS an?
      Code java:
      1
      2
      3
      4
      5
      
      try {
         UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
      }
      catch (Exception e) {
      }
    17. Ist es auf einfache Weise möglich per MouseListener Doppelklicks abzufangen?
      Code java:
      1
      2
      3
      4
      5
      
      public void mouseClicked(MouseEvent e) {
          if(e.getClickCount() == 2){
              ...
          }
      }
      Auf die gleiche Weise lassen sich natürlich auch 3-fach Klicks, wie beim Umbenennen von Dateien im Explorer realisieren.
    18. Ich habe die Methode print(Graphics g) aufwendig überschrieben, nur hätte ich jetzt gerne einen anderen Koordinatenursprung, müssen alle werte einzeln abgeändert werden?
      Glücklicherweise nicht:
      Code java:
      1
      
      g.translate(100, 100);
      (Auch beim Erstellen eines Funktionsplotters sehr hilfreich.)
    19. Ich benutze einen JSpinner zur auswahl einer Jahreszahl (o.Ä.) wie kriege ich den Tausenderpunkt / das Tausenderkomma weg?
      Code java:
      1
      
      deinSpinner.setEditor(new JSpinner.NumberEditor(deinSpinner, "#"));
      ... löst das Problem.
    20. Ein JLabel bekommt eine Hintergrundfarbe zugewiesen, bleibt aber trotzdem grau, wieso das?
      JLabels sind standardmäßig durchsichtig, dies muss folgendermaßen geändert werden:
      Code java:
      1
      
      jLabel.setOpaque(true);
      Bei JTextFields tritt dieses Problem nicht auf, trotzdem sollte man setBackground() eher nicht benutzen.
      Grund: z.B. unter Linux Fedora (SystemLookAndFeel) wird diese Eigenschaft ignoriert.
    21. Ich möchte eine Tabelle neu laden, kann ich einzelnes setzen der Werte bzw. erzeugen einer neuen JTable ungehen?
      Ja, indem man zuert alle Rows entfernt und dann z.B. vom ResultSet neu hinzufügt. (Deshalb ist diese Lösung wohl hauptsächlich beim Anzeigen von DB-Tabellen geeignet.)
      Code java:
      1
      2
      3
      4
      5
      6
      
      DefaultTableModel dtm = (DefaultTableModel) tabelle.getModel();
      int c = dtm.getRowCount();
      for (int i=c-1; i>=0; i--){
          dtm.removeRow(i);
          tabelle.revalidate();
      }

    Für eventuelle Korrekturen und Erweiterungen bin ich dankbar,
    vielleicht werde ich auch selbst noch weitere Ideen hinzufügen,
    javaDeveloper2011
    Markus Kolletzky, pincy, sheel und 1 weitere bedanken sich. 


    Kommentare 5 Kommentare
    1. Avatar von zer0
      zer0 -
      Zwischen Color.BLUE und Color.blue besteht übrigens kein Unterschied. Wenn man sich den Source Code der Color-Klasse mal anschaut wird das schnell klar
    1. Avatar von javaDeveloper2011
      javaDeveloper2011 -
      Danke für den Hinweis, weisst du wofür es dann überhaupt 2 Schreibweisen giebt?
    1. Avatar von zer0
      zer0 -
      Zitat Zitat von javaDeveloper2011 Beitrag anzeigen
      Danke für den Hinweis, weisst du wofür es dann überhaupt 2 Schreibweisen giebt?
      Das sind Altlasten die zugunsten der Kompatibilität beibehalten werden. Als Java rauskam gab es noch keine Konventionen oder Standards.

      Color.BLUE stellt eine Konstante da und muss laut den Konventionen groß geschrieben werden. Da man aber auch gewährleisten muss das alte Applikationen noch laufen hat man die alten Konstanten beibehalten.
    1. Avatar von ComFreek
      ComFreek -
      Wäre es nicht besser die weiteren Tipps in den Kommentaren in den eigentlichen Artikel zu verschieben?

      Ich finde das Tutorial mit der Nummerierung relativ übersichtlich Aber zum Java-Code kann ich nicht so viel sagen
    1. Avatar von javaDeveloper2011
      javaDeveloper2011 -
      Hi ComFreek,

      danke, irgedwie dachte ich das geht gar nicht aber anscheinend schon, ist auch gleich für alle sichtbar und sieht besser aus.

      Gruß
    Kommentare Kommentar schreiben

    Klicke hier, um dich anzumelden

    Was ist grün und kann quaken?