JTextField erscheint erst nach Veränderung der Framegröße

Lukases2

Aktives Mitglied
Hallo zusammen,
ich möchte gerne ein JTextField auf einem Frame platzieren. Mein Code dazu sieht so aus:

Java:
public class Gui {
   
    public static JFrame frame;
   
    public Gui() {
       
        frame = new JFrame();
        frame.setTitle("RogueLike");
        frame.setVisible(true);
        frame.setResizable(true);
        frame.setSize(1000, 700);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setLayout(new GridLayout(3, 0)); // 0 rows, 2 cols
       
        frame.add(new MapPanel());
        frame.add(new DialogPanel());
       
        JTextField input = new JTextField();
        input.setText("Ich bin der String");
        input.setVisible(true);
        frame.add(input);
       
    }
}

public static void main(String[] args) {
       
       new Gui();
       new MapPanel();
       new DialogPanel();

   }

Leider zeigt sich das JTextField immer erst, wenn ich die Framegröße ändere. Wenn ich frame.setResizable(true); wähle, dann zeigt sich das Textfeld nie.
Wisst ihr, woran das liegen kann?
 
frame.setVisible(true); als letzte Anweisung aufrufen ... bzw, wenn sich das Layout ändert, während das Frame sichtbar ist, könnte ein validate()-Aufruf helfen...

vermutlich möchtest du in der main()-methode nur die Gui initialisieren nicht die anderen objekte, denn die werden bereis innerhalb von Gui erzeugt.
 
Zuletzt bearbeitet:
Ok, ich habe jetzt das hier gemacht
Java:
public Gui() {
       
        frame = new JFrame();
        frame.setTitle("RogueLike");
        frame.setVisible(true);
        frame.setSize(1000, 700);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setLayout(new GridLayout(3, 0)); // 0 rows, 2 cols
       
        frame.add(new MapPanel());
        frame.add(new DialogPanel());
       
        JTextField input = new JTextField();
        input.setText("Ich bin der String");
        input.setVisible(true);
        frame.add(input);
       
        frame.validate();
        frame.setResizable(false);
       
    }

und es funktioniert. Allerdings scheint sich das Fenster jetzt kurz zu öffnen, sofort zu schließen und neu zu öffnen. Stört mich aber vorerst nicht weiter.

Das mit der Initialisierung habe ich auch gemacht:
Java:
public static void main(String[] args) {
       
        new Gui();
       
    }
Ich habe das allerings auch schon manches Mal so wie ich es vorher hatte gesehen. Macht es dann nicht sogar Sinn, wenn ich die Main-Methode gleich in die Gui-Klasse verschiebe?
 
Warum fragst du eigentlich wenn du die antworten einfach ignorierst? JCODA sagt dir wie es richtig geht und Du schreibst einfach noch ein sinnloses setVisible() rein und sagst das ist gut so.

Sowas kapier ich einfach nicht
 
Kein Grund sich aufzuregen 😀
Ich habe mich verlesen und statt .setVisible .setResizable als letztes aufgerufen.
Mit frame.validate() bin ich ja trotzdem zum Ziel gekommen, deswegen war es "gut so."
 
Kein Grund sich aufzuregen 😀
Ich habe mich verlesen und statt .setVisible .setResizable als letztes aufgerufen.
Mit frame.validate() bin ich ja trotzdem zum Ziel gekommen, deswegen war es "gut so."

Mit

Code:
public Gui() {
       
        frame = new JFrame();
        frame.setTitle("RogueLike");
        frame.setVisible(true);
        frame.setSize(1000, 700);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        frame.setLayout(new GridLayout(3, 0)); // 0 rows, 2 cols
        frame.setVisible(true);
       
        frame.add(new MapPanel());
        frame.add(new DialogPanel());
       
        JTextField input = new JTextField();
        input.setText("Ich bin der String");
        input.setVisible(true);
        frame.add(input);
        input.setVisible(true);
       
        frame.validate();
        input.setVisible(true);
        frame.setResizable(false);
        frame.setVisible(true);       
    }

würde es auch funktionieren. Warum machst Du es nicht so?
 

Neue Themen


Zurück
Oben