JFrame wird zu klein erstellt

luiiiisch

Mitglied
Hallo,

Habe ein Problem beim erstellen eines JFrames. Wenn ich die Klasse (siehe unten) ausführe, ist der Button nicht in der Mitte, obwohl er das (nach meiner Rechnung) sein sollte. Der Unterschied ist auch deutlich zu erkennen, es handelt sich nicht nur um ein paar Pixel.
Ich hoffe das es eine einfache Lösung für das Problem gibt, da ich echt verzweifelt bin nach langem googlen und ausprobieren.

Java:
package pack1;
import javax.swing.*;
public class Gui {
    public Gui() {
       
        Var.jf1 = new JFrame();
        Var.jf1.setSize(800, 600);
        Var.jf1.setLocationRelativeTo(null);
        Var.jf1.setLayout(null);
        Var.jf1.requestFocus();
        Var.jf1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Var.jf1.setResizable(false);
       
        JButton test = new JButton();
        test.setBounds(390, 290, 20, 20);
        test.setVisible(true);
        Var.jf1.add(test);
       
        Var.jf1.setVisible(true);
       
    }
}
 
Tu dir selber bitte den Gefallen und hör auf dieses Tutorial zu verfolgen wo du vermutlich den Code her hast.
Derjenige, der diese Var Klasse eingeführt hat, gehört gesteinigt.
Zu Hause lagert man doch auch nicht sein gesamtes Hab und Gut in einer Kiste.

Ich geh mal davon aus, dass der Button von der Höhe her nicht mittig ist? Das liegt daran, dass du die Höhe der Titelleiste mit berechnen musst. Die war irgenwas um die 20px wenn ich mich recht entsinne.

Aber anstatt wild rumzurechnen könntest du dich auch in LayoutManager einlesen und das Programm gleich geschneit aufbauen
 
JFrame.setSize(...) steuert NICHT die Größe der Client Area des Fensters, sondern die Größe des gesamten Fensters (inklusive Decorations und Borders). Wenn du dir die Größe der Client Area anschaust, die du mit `JFrame.getContentPane().getBounds()` bekommst, dann siehst du, dass die Client Area kleiner ist.
Was du willst, ist wohl:
Java:
int width = 800, height = 600;
JFrame jf1 = new JFrame();
jf1.setLocationRelativeTo(null);
jf1.setLayout(null);
jf1.requestFocus();
jf1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf1.setResizable(false);
// Nächste Zeile ist wichtig!
jf1.getContentPane().setPreferredSize(new Dimension(width, height));
JButton test = new JButton();
int buttonWidth = 20, buttonHeight = 20;
test.setBounds(width / 2 - buttonWidth / 2,
               height / 2 - buttonHeight / 2,
               buttonWidth,
               buttonHeight);
test.setVisible(true);
jf1.add(test);
// Nächste Zeile ist wichtig!
jf1.pack();
jf1.setVisible(true);
 
Tu dir selber bitte den Gefallen und hör auf dieses Tutorial zu verfolgen wo du vermutlich den Code her hast.
Derjenige, der diese Var Klasse eingeführt hat, gehört gesteinigt.
Zu Hause lagert man doch auch nicht sein gesamtes Hab und Gut in einer Kiste.

Ich geh mal davon aus, dass der Button von der Höhe her nicht mittig ist? Das liegt daran, dass du die Höhe der Titelleiste mit berechnen musst. Die war irgenwas um die 20px wenn ich mich recht entsinne.

Aber anstatt wild rumzurechnen könntest du dich auch in LayoutManager einlesen und das Programm gleich geschneit aufbauen


Das war nur ein Testprojekt bei dem ich rumprobiert habe, deshalb auch das Var.. Da ist mir das mit der Größe eben auch aufgefallen.
Den Layoutmanager werde ich mir mal anschauen aber soweit ich das bis jetzt verstanden hab (bin Anfänger) ist man damit doch ziemlich eingeschränkt oder nicht?

Ich mag es halt schon wenn ich einfach selber bestimmen kann wo ich die Elemente platzieren möchte. Ich will ja nicht alles nebeneinander oder so.

EDIT:
Vlt hast du ja auch einen Tipp für mich wie/wo ich am besten lernen kann „schön“ zu programmieren. Es gibt ja unzählige Möglichkeiten aber ich hab keine Ahnung was die beste sein soll.
 
Zuletzt bearbeitet:
Eingeschränkt würde ich nicht sagen. Man muss ggf andere/mehr Schritte machen um zB etwas zu zentrieren aber dafür ist es dann auch für allle Fenstergrößen zentriert.

"schön" programmieren kann man vor allem durch Zeit und Kritik lernen - wenn man diese annimmt.
Ansonsten einfsch an die grundlegenden OOP Prinzipien halten, die überall gelehrt werden.
 
Beschäftige dich mit Layoutmanagern, so schnell es geht. Ohne die stößt du beim Erstellen von Formularen ganz schnell an deine Grenzen.
Du müsstest z.B. manuell ständig die Komponenten neu platzieren und strecken, wenn du die Fenstergröße oder deren Beschriftung änderst (und damit würdest du deinen eigenen Manager schreiben).
Wer aus C# kommt und das GUI mit einem Editor erstellt, kommt wahrscheinlich mit GroupLayout am Besten zurecht, mein Favorit ist allerdins GridBagLayout, je nach Situation dann auch mal GridLayout, BorderLayout, BoxLayout.
Es gibt dann im Netz noch ein paar andere, die du verwenden darfst (MigLayout z.B.)
 

Neue Themen


Zurück
Oben