JFrame GUI Bug?

Hallo zusammen,

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

 }

}

Kann mir da wer weiterhelfen?

Vielen Dank im Vorraus,
Viele Grüße

Hallo,

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.

Gruß
Heavy

Hi,

wie in der anderen Anwort geschrieben, setVisible(true) ans Ende. Dazu noch ein paar extra Hinweise:

setLocation(500, 500); 
setLocationRelativeTo(null); 

macht zusammen keinen Sinn :smile:

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“

Micha

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?

Das Stichwort hat Michael ja genannt: Layoutmanager. Davon bring das Standard JRE schon einige mit: http://docs.oracle.com/javase/tutorial/uiswing/layou…

HTH
Heavy

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.