Warum funkt. set.Size(n,m) bei der Meth. nicht?

Hallo liebe Java Freunde, :smile:

ich bin Informatik Student und komme gerade ins 2. Sem.
Bisher hatten wir Haskell, Java (prozedural) und Java OOP
Die größten Probleme hatte und habe ich mit Java (speziell OOP).
Deshalb habe ich beschlossen dass ich in den Semesterferien viel übe.

Ich wollte ein Programm schreiben das ein Fenster öffnet, zwei Buttons und eine Anzeige hat.
Wenn man auf den ersten Button klickt soll die Anzeige ausgeben wie oft man schon auf den ersten Button geklickt hat(schreit nach einer for - Schleife). Der zweite Button soll zum löschen bzw. zum nullen der Anzeige dienen. Davon bin ich leider noch sehr weit weg :smile:

Zum Beginn des Studiums hatte ich mir das Java Handbuch gekauft, dort habe ich auch schon einiges gefunden, doch jetzt hänge ich dermaßen an einem Problem dass ich keinen Ausweg mehr weiß :smile: Ich hoffe einer von euch kann mir weiterhelfen.

Hier mal mein Quellcode:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Fenster extends JFrame
{
public Fenster()
{
super(„Fenster nach Swing Art“);

//Panel (Untergrund) für den Text hinzufügen
JPanel untergrund = new JPanel();

//Label (text) erzeugen
JLabel text = new JLabel(„Bitte geben Sie ihren Benutzernamen ein“,new ImageIcon(„testicon.gif“),SwingConstants.LEFT);

//Label (text) auf Panel (Untergrund) befestigen
untergrund.add(text);

//Ein Textfeld
JTextField textfeld = new JTextField(30);
textfeld.setToolTipText(„Das ist ein Textfeld“);

//neues Textfeld (nach JTextfield Art) an Panel (Untergrund) befestiegen
untergrund.add(textfeld);

//Festlegung des Urspungs, (wo es erscheinen soll)
untergrund.setBorder(BorderFactory.createEtchedBorder());
getContentPane().add(untergrund, BorderLayout.NORTH);

// //Layoutsetzen und Buttons hinzufügen
// Container contentPane = getContentPane();
// contentPane.setLayout(new GridLayout (3,1));
// contentPane.add(new JButton („Button 1“));
// contentPane.add(new JButton („Button 2“));
// contentPane.add(new JButton („Button 3“));

// //Panel (Untergrund) für den Button erzeugen
// JPanel buttonPanel = new JPanel();
//
// //Button erzeugen und beschriften
// JButton button1 = new JButton(„Button1“);
// button1.addActionListener(System.out.println(„Button1“));
// buttonPanel.add(button1);
//
//
// buttonPanel.setBorder(BorderFactory.createEtchedBorder());
// getContentPane().add(buttonPanel,BorderLayout.SOUTH);

//Es gibt zwei Methoden ein Fenster zu schließen die JFrame Methode, die sowieso vererbt wird und eine selbstgeschriebene
//Von JFrame vererbet Methode das fenster zu schließen WindowsListener
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//WindwowListener vordert eine Klasse zum schließen des Fensters
addWindowListener(new WindowClosingAdapter(true));

}
public static void main(String [] args)
{

Fenster swing = new Fenster();
swing.setSize(800,500);
swing.setLocation(300,150);
swing.pack();
swing.setVisible(true);

}

}

Ich muss zugeben er ist nicht sehr gut aufgeräumt, also sry für die vielen Kommentare, da würde ich gerne später drauf zurückkommen.

Mein Problem ist, ich kann doch normalerweise mit „set.Size(800,500);“ ein 800*500 Fenster erstellen.
Wenn ich das ganze aber ausführe dann erscheint das Fenster nur in etwa der Größe des Icon, woran liegt dass?

Ich hoffe das ist nicht allzu kompliziert, denn ich wollte nämlich, wenn ich dass verstanden habe, gleich zu den Buttons übergehen, wie man vielleicht erkennt habe ich da schon etwas rumprobiert :smile:

viel danke schon mal dass Ihr euch die Zeit genommen habt meinen Beitrag zu lesen,

liebe Grüße Matthias

Hallo,

ich bins wieder, nach insgesammt 3 Std. komme ich dann kurz nach der Nachricht auf die Lösung :smile:

Aber vielleicht gibt es noch eine leichtere Lösung.

Hier mal mein neuer und Aufgeräumter Quellcode:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Fenster extends JFrame {

public Fenster() {
super(„Fenster nach Swing art“);
getContentPane().setLayout(new BorderLayout(500, 500));
setLocation(300, 150);
pack();
setVisible(true);

//Panel (Untergrund) für den Text hinzufügen
JPanel untergrund = new JPanel();

//Label (text) erzeugen
JLabel text = new JLabel(„Bitte geben Sie ihren Benutzernamen ein“, new ImageIcon(„testicon.gif“), SwingConstants.LEFT);

//Label (text) auf Panel (Untergrund) befestigen
untergrund.add(text);

//Ein Textfeld
JTextField textfeld = new JTextField(30);
textfeld.setToolTipText(„Das ist ein Textfeld“);

//neues Textfeld (nach JTextfield Art) an Panel (Untergrund) befestiegen
untergrund.add(textfeld);

//Festlegung des Urspungs, (wo es erscheinen soll)
untergrund.setBorder(BorderFactory.createEtchedBorder());
getContentPane().add(untergrund, BorderLayout.NORTH);

//Es gibt zwei Methoden ein Fenster zu schließen die JFrame Methode, die sowieso vererbt wird und eine selbstgeschriebene
//Von JFrame vererbet Methode das fenster zu schließen WindowsListener
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//WindwowListener vordert eine Klasse zum schließen des Fensters
addWindowListener(new WindowClosingAdapter(true));

}

public static void main(String[] args) {

Fenster swing = new Fenster();
swing.setSize(800, 500);

}
}

Im insgesammten habe ich die einstellungen des Fensters aus der Main Methode so ziemlich entfernt und alles in die Fenster Methode reingelegt, wichtig war nun, dass ich dort diese Angabe mache: „getContentPane().setLayout(new BorderLayout(800, 500));“ vielleicht kann mir jemand erklären warum ich das noch dazuschreiben muss und warum es mit „set.Size(800,500);“ allein nicht getan ist.

Denn wenn ich ein leeres fenster erstelle siehe hier:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Einfach extends JFrame{

public Einfach()
{
super(„Ich bin ein leeres Fenster“);
setSize(800,500);
setLocation(300,150);
setVisible(true);
}

public static void main(String[] args){
Einfach fenster = new Einfach();
}

}

dann ist es mit einem eifachen set.Size(n,m); doch auch schon getan.
Kann mir jemand sagen warum dass so ist?

liebe Grüße Matthias

Hallo!

pack() ist das Problem, denn es optimiert die Framegröße auf die enthaltenen Komponenten. Also einfach weglassen.

Jan

Hi,

super vielen vielen Dank du warst mir eine große Hilfe, denn das: „getContentPane().setLayout(new BorderLayout(500,500));“ kann man sich ja nicht merken.

Ich versuche die Tage noch mehr über die Buttons raus zu griegen und versuche dann mal mein Programm zu optimieren.
Spätestens dann werd ich wohl wieder Hilfe brauchen :smile:

Danke nochmal :smile:

liebe Grüße Matthias