
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.
- 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);
- 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. - 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);
- 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());
- Eine Animation flackert, kann das einfach behoben werden?
Oft hilft hier Doppelpufferung die in Swing einfach umzusetzen ist:
(es wird vor dem Zeichnen ein Offscreen-Image erzeugt)Code java:1
setDoubleBuffered(true);
- 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();
- Bei einem Applet verändert sich die Hintergrundfarbe nicht, warum hilft
den nichts?Code java:1
setBackground(Color.blue);
die Farbe muss beim ContentPane des JApplets gesetzt werden.
Code java:1
getContentPane().setBackground(Color.BLUE);
- 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);
- Wie zeigt man ein Fenster von Beginn an maximiert, also den ganzen Bildschirm füllend an?
Code java:1
setExtendedState(JFrame.MAXIMIZED_BOTH);
- Ich gebe einem Widget mit
den Fokus, weshalb hat sie ihn trotzdem nicht mal am Anfang?Code java:1
requestFocus();
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. - Ein Button soll nur ein Icon haben, muss der störende Rand sein?
Nein, schon eine Codezeile schafft Abhilfe:
Code java:1
setContentAreaFilled(false);
- 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:
Wirkung: das Programm entscheidet selbst, wann der Teil ausgeführt wird (nur wenn es keinen Absturz zur Folge haben kann).Code java:1 2 3 4 5
java.awt.EventQueue.invokeLater(new Runnable() { public void run() { // CPU-intensive Stelle } });
- 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);
- 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(); ... }
- 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);
- 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?
- Ist es auf einfache Weise möglich per MouseListener Doppelklicks abzufangen?
Auf die gleiche Weise lassen sich natürlich auch 3-fach Klicks, wie beim Umbenennen von Dateien im Explorer realisieren.Code java:1 2 3 4 5
public void mouseClicked(MouseEvent e) { if(e.getClickCount() == 2){ ... } }
- 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:
(Auch beim Erstellen eines Funktionsplotters sehr hilfreich.)Code java:1
g.translate(100, 100);
- Ich benutze einen JSpinner zur auswahl einer Jahreszahl (o.Ä.) wie kriege ich den Tausenderpunkt / das Tausenderkomma weg?
... löst das Problem.Code java:1
deinSpinner.setEditor(new JSpinner.NumberEditor(deinSpinner, "#"));
- Ein JLabel bekommt eine Hintergrundfarbe zugewiesen, bleibt aber trotzdem grau, wieso das?
JLabels sind standardmäßig durchsichtig, dies muss folgendermaßen geändert werden:
Bei JTextFields tritt dieses Problem nicht auf, trotzdem sollte man setBackground() eher nicht benutzen.Code java:1
jLabel.setOpaque(true);
Grund: z.B. unter Linux Fedora (SystemLookAndFeel) wird diese Eigenschaft ignoriert. - 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




Bereiche
Kategorien
Forum - Programming





tutorials.de-Systemmitteilung