Swing JTextfield auf Frame

Zel2491

Aktives Mitglied
Heho 😉 Ich habe ein kleines Problem bei meiner Hausaufgabe (keine Angst, ihr sollt meine Hausaufgabe nicht machen!^^)
Es geht darum, dass ich ein Fenster erstelle und im Süden ein Textfeld implementiere und im Center ein Panel. Fenster öffnet sich soweit, Textfeld auch...nur nicht auf dem Frame, sondern oben links in der Ecke^^ Kann mir jemand dabei helfen, das Textfeld wie gefordert in den Süden des Frames zu bringen?

Gruß Zel

Java:
import java.awt.BorderLayout;
import java.awt.Container;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Fenster extends JFrame {

    private JFrame fenster;

    private JPanel panel;

    private JTextField text;

    public Fenster() {

        // Frame wird erzeugt
        fenster = new JFrame("Aufgabenblatt 11");
        // Werte werden eingeben (Vorgabe: 720 x 640 Pixel)
        fenster.setSize(720, 640);
        // Position des Fensters auf dem Bildschirm wird eingerichtet
        fenster.setLocation(300, 250);
        // Bei klicken auf das "X" wird das Programm beendet
        fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // Durch setVisible(true) wird das Fenster sichtbar gemacht
        fenster.setVisible(true);
        // Layout für JFrame wird festgelegt
        fenster.setLayout(new BorderLayout(5, 5));

        // Textfeld erzeugen
        text = new JTextField();
        // Textfeld im Süden des Layouts platzieren
        getContentPane().add(BorderLayout.SOUTH, text);

        // Panel erzeugen
        panel = new JPanel(new BorderLayout(5, 5));

        // Panel auf Frame packen
        getContentPane().add(BorderLayout.CENTER, panel);
        // Durch pack() wird das komplette Frame auf die optimale Größe gebracht
        pack();
        setVisible(true);

    }

    public static void main(String[] args) {
        Fenster fenster = new Fenster();
    }
}
 
1.) Deine Klasse Fenster ist von JFrame abgeleitet, also ist das selbst schon der Frame. Du erzeugst aber im Konstruktor nochmal einen neuen Frame mit
Code:
fenster = new JFrame("Aufgabenblatt 11");
.

2.) Du hast 2mal setVisible(true). Das nur einmal und immer ganz zum Schluss und nicht irgendwo mittendrin.

Mach doch mal so:
Java:
import java.awt.BorderLayout;
import java.awt.Container;
 
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
 
public class Fenster extends JFrame {
 
    private JPanel panel;
 
    private JTextField text;
 
    public Fenster() {
 
        // Werte werden eingeben (Vorgabe: 720 x 640 Pixel)
        setSize(720, 640);
        // Position des Fensters auf dem Bildschirm wird eingerichtet
        setLocation(300, 250);
        // Bei klicken auf das "X" wird das Programm beendet
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // Layout für JFrame wird festgelegt
        setLayout(new BorderLayout(5, 5));
 
        // Textfeld erzeugen
        text = new JTextField();
        // Textfeld im Süden des Layouts platzieren
        getContentPane().add(BorderLayout.SOUTH, text);
 
        // Panel erzeugen
        panel = new JPanel(new BorderLayout(5, 5));
 
        // Panel auf Frame packen
        getContentPane().add(BorderLayout.CENTER, panel);
        // Durch pack() wird das komplette Frame auf die optimale Größe gebracht
        pack();
        setVisible(true);
 
    }
 
    public static void main(String[] args) {
        new Fenster();
    }
}
 
Java:
import java.awt.BorderLayout;
import java.awt.Container;
 
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
 
public class Fenster {
 
    /**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private JFrame fenster;
 
    private JPanel panel;
 
    private JTextField text;
 
    public Fenster() {
 
        // Frame wird erzeugt
        fenster = new JFrame("Aufgabenblatt 11");
        // Werte werden eingeben (Vorgabe: 720 x 640 Pixel)
        fenster.setSize(720, 640);
        // Position des Fensters auf dem Bildschirm wird eingerichtet
        fenster.setLocation(300, 250);
        // Bei klicken auf das "X" wird das Programm beendet
        fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // Durch setVisible(true) wird das Fenster sichtbar gemacht
        fenster.setVisible(true);
        // Layout für JFrame wird festgelegt
        fenster.setLayout(new BorderLayout(5, 5));
 
        // Textfeld erzeugen
        text = new JTextField();
        // Textfeld im Süden des Layouts platzieren
        fenster.add(BorderLayout.SOUTH, text);
 
        // Panel erzeugen
        panel = new JPanel(new BorderLayout(5, 5));
 
        // Panel auf Frame packen
        fenster.add(BorderLayout.CENTER, panel);
        // Durch pack() wird das komplette Frame auf die optimale Größe gebracht
        fenster.pack();
        fenster.setVisible(true);
 
    }
 
    public static void main(String[] args) {
    		new Fenster();
    }
}


wenn du erlaubst,ich habe dein code mal ein bisschen umgeschrieben=)
du erbst einmal von JFrame und erstellt mit JFrame fenster = new JFrame(); noch ein zusätzlich Frame.
Somit sind 2 Frame aufgepoppt🙂

das textfeld ist auf dem grund nicht erschienen,weil du es auf getcontentpane gelegt hast,also noch eine eben unter dem frame.übrigens würde ich dir noch empfehlen,dass textfeld nicht auf das frame zu packen,sondern auf das panel -> panel.add(BorderLayout.SOUTH, text);
 
Vielen Dank für eure schnellen Hilfen. Ich habe jetzt mal maestr0's Code ausprobiert und siehe da:

"Exception in thread "main" java.lang.NullPointerException
at Fenster.<init>(Fenster.java:39)
at Fenster.main(Fenster.java:53)
"

Hab jetzt auch das Textfeld auf das panel getan, das ist übrigens Zeile 38, bei der er den Fehler auswirft
Java:
panel.add(BorderLayout.SOUTH, text);

und in der main-Methode wenn ich "Fenster" erstelle:

Java:
new Fenster();
 
Setz doch bitte nochmal den ganzen Code hier rein, damit man genau schauen kann, wo der Fehler ist.
 
Wird gemacht. Hab gerad nochmal was editiert... der erste Fehler beim panel.add lag daran, dass ich das panel erst danach erzeugt habe(^^)...

hier nochmal der ganze code:

Java:
import java.awt.BorderLayout;
import java.awt.Container;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Fenster {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private JFrame fenster;

    private JPanel panel;

    private JTextField text;

    public Fenster() {

        // Frame wird erzeugt
        fenster = new JFrame("Aufgabenblatt 11");
        // Werte werden eingeben (Vorgabe: 720 x 640 Pixel)
        fenster.setSize(720, 640);
        // Position des Fensters auf dem Bildschirm wird eingerichtet
        fenster.setLocation(300, 250);
        // Bei klicken auf das "X" wird das Programm beendet
        fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Layout für JFrame wird festgelegt
        fenster.setLayout(new BorderLayout(5, 5));

        // Panel erzeugen
        panel = new JPanel(new BorderLayout(5, 5));

        // Textfeld erzeugen
        text = new JTextField();
        
        // Textfeld im Süden des Layouts platzieren
        panel.add(BorderLayout.SOUTH, text);

        // Panel auf Frame packen
        fenster.add(BorderLayout.CENTER, panel);
        
        // Durch pack() wird das komplette Frame auf die optimale Größe gebracht
        fenster.pack();
        
        // Durch setVisible(true) wird das Fenster sichtbar gemacht
        fenster.setVisible(true);

    }

    public static void main(String[] args) {
        new Fenster();
    }
}
 
Mach doch mal:
[JAVA=42]fenster.add(BorderLayout.SOUTH, text);[/code]

EDIT: Du kannst das Textfeld in den SOUTH-Bereich von fenster (=JFrame) hinzufügen. Und dein JFrame hat schon als Standard das BorderLayout eingestellt. Müsstest du deshalb eigentlich garnicht mehr zusätzlich setzen.
 
Zuletzt bearbeitet von einem Moderator:
Wenn ich das mache öffnet sich nur das Textfeld. Das Fenster macht dann gar nix mehr...


Wobei: ob ich bei [java=42] fenster.add(BorderLayout.SOUTH, text); [/code] oder panel.add nehme nimmt sich nix. Bei beiden öffnet er nicht das Fenster, sondern nur das Textfeld
 
Achso, kommentier mal die Zeile mit dem pack() aus. Weil dadurch wird dein Frame so klein gemacht, das nur das angezeigt, was auch dort platziert wurde. Und im Panel im CENTER-Bereich ist ja noch nix drin.
 
Langsam werd ich verwirrt^^

Wenn ich die pack()-Zeile auskommentiere öffnet er nur noch das Fenster - das Textfeld lässt er jetzt ganz weg^^

Übrigens danke, dass du mir so intensiv hilfst 🙂
 
offtopic: gibts hier ne edit funktion...? wenn ja, wieso bin ich zu doof die zu finden?^^



topic:

im panel hab ich bisher nix drin, weil unsere aufgabe wiefolgt lautet:

"Darüber hinaus soll das Fenster mit einem BorderLayout versehen
werden. In den Süden wird ein JTextField eingefügt, im Center ein JPanel.
Versehen Sie außerdem Ihre Klasse mit einer Main-Methode, welche eine Instanz
Ihrer Klasse erzeugt."
 
nochmal edit...

ich hab was übersehen: wenn ich das pack() rauskommentiere funktioniert es!

vielen dank für die gute hilfe! 🙂

und sry für den dreifach-post -.-
 
Das pack() bewirkt halt, dass dein Frame auf die Grösse der darin befindlichen Komponenten gesetzt wird. Und da entweder noch nichts drin ist im Panel oder die Grössen nicht gesetzt sind, wird der Fame ghalt ganz klein. Evtl. musst du für das Textfeld noch eine Grösse angeben (mit setPreferredSize() ).
 
Das Textfeld ist jetzt im Fenster ganz unten und hat die Fensterlänge. Wir haben ein Screenshot davon, wie es aussehen soll, wenn es fertig ist - passt genau^^ 😉
 

Zurück
Oben