ich habe mich mal in die GUI von Java eingearbeitet, einfach weil es für die berufliche Zukunft von Vorteil ist aus meiner Sicht, damit auszukennen. Außerdem mache ich es interessehalber^^
Ich arbeite mit dem JFrame, und habe das Problem, dass ich mit mehrfachem ausführen des Codes unterschiedliche Ergebnisse habe. Mal wird ein Label nicht angezeigt, mal ein Textfield. Mein Sourcecode ist schon relativ groß mittlerweile, aber auch im Beispiel eines Tutorials ist das bei mir der Fall. Ich habe Java extra mal geupdated, aber hat nicht geholfen. Auch das Projekt als .jar zu exportieren hat nicht viel gebracht. Ist das ein bekannter Bug von JFrame?
Um einfach mal ein Beispiel zu bringen von meinem Code nehme ich einfach den aus dem Brotcruncher Videotutorial, da, wiegesagt das Problem bei mir auch da auftritt.
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class CFrame extends JFrame{
JLabel text; //Erstellt text des Typs JLabel
JButton button;
JTextField textField;
public CFrame(){
setVisible(true);
setSize(500, 300); //setzt die Größe
setDefaultCloseOperation(JFrame.EXIT\_ON\_CLOSE); // Schließt Fenster bei "Schließen" Symbol
setLocation(500, 500);
setLocationRelativeTo(null); //Setzt Fenster in die Mitte
setTitle("Name des Programms");
setResizable(false);
setLayout(null);
text = new JLabel("Hallo Welt"); //Gibt "text" den String "Hallo Welt"
text.setBounds(0,0,500,10); //Setzt die Koordinaten für den Text - x,y,width,height
Font textFont = new Font("Arial", Font.BOLD + Font.ITALIC, 10); //Erstellt Fonteigenschaften
text.setFont(textFont); //gibt "text" die Schriftart von "textFont"
add(text); //Fügt den Text endgültig hinzu
button = new JButton("Klick mich");
button.setBounds(20, 20, 100, 20);
button.addActionListener(new CListener()); //Weist dem Button den Listener zu
add(button);
textField = new JTextField();
textField.setBounds(50, 50, 300, 20);
add(textField);
}
public class CListener implements ActionListener{ //Action Listener achtet auf Events von Button
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
text.setText(textField.getText()); //ändert den vorher erstellten Text.
//Die Funktion getText holt den String aus dem TextField
} // Action Listener achtet auf Buttoninteraktion
}
}
unterschiedliches Verhalten kann ich nicht nachvollziehen, das JTextField ist nie sichtbar, erst wenn ich da hinklicke wo es sein müsste wird es angezeigt.
Verschiebe ich den setVisible(true) Aufruf ans Ende des Konstruktors wir dagegen alles sofort angezeigt.
setDefaultCloseOperation(JFrame.EXIT\_ON\_CLOSE); // Schließt Fenster bei "Schließen" Symbol
Hier ist dein Kommentar falsch. Die Close Operation sorg dafür, dass auch die JavaVM beendet wird wenn du das Fenster zu machst. Probier mal HIDE_ON_CLOSE und schau mal danach in den taskmanager.
Letzer Hinweis. Du nutzt keinen Layoutmanager (setLayout(null)). Das geht, bedingt aber dass du alle Komponenten absolut positioniertst (die setBounds() Befehle). Das macht man eigentlich nicht. Gerade weil z.B. deine 20 Pixel Höhe nicht reichen um im Textfeld ein kleines g komplett darzustellen. Zumindest nicht auf allen Betriebssystemen… Stichwort wäre hier „Layoutmanager“
Vielen Dank schonmal euch Beiden! Das mit dem setVisible hat direkt geholfen, und den Fehler ausgebügelt.
Und auch die anderen Hinweise waren hilfreich, was die Optimierung angeht, einfach damit der Code etwas sauberer ist.
Bezüglich des Layouts muss ich sagen, ich hab ja mit der GUI Programmierung erst angefangen. Dass die absolute Positionierung nicht praktisch ist, dass dachte ich mir schon, ist ja bei anderen Programmiersprachen ähnlich. Wie würde denn eine relative Positionierung vonstatten gehen? Also in der groben Theorie?
Bezüglich des Layouts muss ich sagen, ich hab ja mit der GUI
Programmierung erst angefangen. Dass die absolute
Positionierung nicht praktisch ist, dass dachte ich mir schon,
ist ja bei anderen Programmiersprachen ähnlich. Wie würde denn
eine relative Positionierung vonstatten gehen? Also in der
groben Theorie?
Es gibt in Java verschiedene Layoutmanager, die Layouts wie bspw. das Gridlayout verwalten. Grid ist ähnlich einer blinden Tabelle in der die Komponenten in der Reihenfolge des Hinzufügens in das Grid „gelegt“ werden. Wenn du noch nicht allzu viele Kenntnisse mit Java bzw. Java.swing kann ich dir das Buch „Java ist auch eine Insel“ bei Galileo Openbook empfehlen. Für einen sanften Einstieg mit Anregungen zum weiterlesen ist das einfach top.