Swing Größe automatisch anpassen

LyncH159

Mitglied
Hallo!
Ich möchte meine GUI bzw. mein Swing automatisch der Größe meines Bildschirms anpassen.
Code:
this.setExtendedState(JFrame.MAXIMIZED_BOTH);
Bei setExtendedState ist mein JFrame leider nur oben links in der Ecke und nicht über den gesamten Bildschirm.
 
Hallo.

Also eigentlich sollte es funktionieren.

Beispiel:

Java:
JFrame frame = new JFrame("FrameDemo");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new Label("TEST"), BorderLayout.CENTER);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.pack();

frame.setVisible(true);

Vielleicht hast du ein wenig Code?

Ansonsten: https://docs.oracle.com/javase/tutorial/extra/fullscreen/index.html

Oder damit:

Java:
JFrame frame = new JFrame("FrameDemo");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new Label("TEST"), BorderLayout.CENTER);
// frame.setExtendedState(JFrame.MAXIMIZED_BOTH);

Toolkit tk = Toolkit.getDefaultToolkit();
int xSize = ((int) tk.getScreenSize().getWidth());
int ySize = ((int) tk.getScreenSize().getHeight());
System.out.println(xSize);
frame.setPreferredSize(new Dimension(xSize, ySize));

frame.pack();

frame.setVisible(true);
 
Mein Code JFrame Code

Code:
        frame = new JFrame();
        frame.getContentPane().setBackground(Color.LIGHT_GRAY);
        frame.getContentPane().setForeground(Color.WHITE);
        frame.setBounds(550, 210, 634, 503);
        frame.setUndecorated(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);


        frame.setVisible(true);

Habe das soweit eingefügt dein Vorschlag, aber es ist immer noch oben Links klein gerendert. Es kommt zwar im Vollbild aber wie gesagt nur oben rechts!
 
Mein Code JFrame Code

Code:
        frame = new JFrame();
        frame.getContentPane().setBackground(Color.LIGHT_GRAY);
        frame.getContentPane().setForeground(Color.WHITE);
        frame.setBounds(550, 210, 634, 503);
        frame.setUndecorated(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);


        frame.setVisible(true);

Habe das soweit eingefügt dein Vorschlag, aber es ist immer noch oben Links klein gerendert. Es kommt zwar im Vollbild aber wie gesagt nur oben rechts!

Wo ist denn: setExtendedState in dem Code?
 
Code:
        frame = new JFrame();
        frame.getContentPane().setBackground(Color.LIGHT_GRAY);
        frame.getContentPane().setForeground(Color.WHITE);
        frame.setBounds(550, 210, 634, 503);
        frame.setUndecorated(true);
        frame.getContentPane().add(new Label("TEST"), BorderLayout.CENTER);
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);

Tet.png
 
Ja mach mal das frame.getContentPane().setLayout(null); weg. Dann sollte es funktionieren. Aber du hast noch immer nicht dein Code gezeigt, falls es nicht klappen sollte.
 
Code:
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Startansicht window = new Startansicht();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public Startansicht() {
        initialize();
    }

    private void initialize() {
        frame = new JFrame();
        frame.getContentPane().setBackground(Color.LIGHT_GRAY);
        frame.getContentPane().setForeground(Color.WHITE);
        frame.setBounds(550, 210, 634, 503);
        frame.setUndecorated(true);
        frame.getContentPane().add(new Label("TEST"), BorderLayout.CENTER);
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);
       
        textField_1 = new JPasswordField();
        textField_1.setBounds(306, 216, 280, 32);
        textField_1.setOpaque(false);
        textField_1.setBorder(javax.swing.BorderFactory.createEmptyBorder());
        frame.getContentPane().add(textField_1);
        textField_1.setColumns(10);
       
        textField = new JTextField();
        textField.setColumns(10);
        textField.setOpaque(false);
        textField.setBorder(javax.swing.BorderFactory.createEmptyBorder());
        textField.setBounds(306, 113, 280, 32);
        frame.getContentPane().add(textField);
       
        JLabel lblNewLabel = new JLabel("");
        lblNewLabel.setIcon(new ImageIcon("C:\\Users\\Fabio\\Desktop\\GUIII.png"));
        lblNewLabel.setBounds(0, 0, 279, 503);
        frame.getContentPane().add(lblNewLabel);
       
        JLabel lblNewLabel_1 = new JLabel("X");
        lblNewLabel_1.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                System.exit(0);               
            }
        });
        lblNewLabel_1.setForeground(Color.RED);
        lblNewLabel_1.setFont(new Font("Tahoma", Font.PLAIN, 18));
        lblNewLabel_1.setBounds(616, 0, 18, 22);
        frame.getContentPane().add(lblNewLabel_1);
       
        JButton btnNewButton = new JButton("Einloggen");
        btnNewButton.setBackground(SystemColor.textHighlight);
        btnNewButton.setForeground(new Color(47, 79, 79));
        btnNewButton.setBounds(300, 350, 105, 37);
        frame.getContentPane().add(btnNewButton);
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                if(textField_1.getText().isEmpty() == true && textField.getText().isEmpty() == true) {
                        JOptionPane.showMessageDialog(frame,"Bitte geben Sie Ihren Spielernamen und Ihr Passwort ein!","Fehlende Eingabe", JOptionPane.WARNING_MESSAGE);   

                }
                else if(textField_1.getText().isEmpty() == true) {   
                    JOptionPane.showMessageDialog(frame,"Bitte geben Sie Ihr Passwort ein!","Fehlende Eingabe", JOptionPane.WARNING_MESSAGE);
                }
                else if(textField_1.getText().isEmpty() == true){       
                    JOptionPane.showMessageDialog(frame,"Bitte geben Sie Ihren Spielernamen ein!","Fehlende Eingabe", JOptionPane.WARNING_MESSAGE);       
               
                }
                    else{
                    str = textField.getText();
                    new DesignNew();
                    frame.dispose();}
   
                }});
       
        JButton btnRegistrieren = new JButton("Registrieren");
        btnRegistrieren.setForeground(new Color(178, 34, 34));
        btnRegistrieren.setBackground(SystemColor.textHighlight);
        btnRegistrieren.setBounds(434, 350, 105, 37);
        frame.getContentPane().add(btnRegistrieren);
        btnRegistrieren.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                frame.dispose();
                }
            });
       
       
        JLabel lblAlsGastFortfahren = new JLabel("Als Gast fortfahren...");
        lblAlsGastFortfahren.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                frame.dispose();
            }
        });
        lblAlsGastFortfahren.setFont(new Font("Tahoma", Font.BOLD, 11));
        lblAlsGastFortfahren.setForeground(Color.BLUE);
        lblAlsGastFortfahren.setBounds(368, 419, 119, 14);
        frame.getContentPane().add(lblAlsGastFortfahren);
       
        JLabel lblSpielername = new JLabel("SPIELERNAME");
        lblSpielername.setBounds(300, 92, 105, 14);
        frame.getContentPane().add(lblSpielername);
       
        JLabel lblPasswort = new JLabel("PASSWORT");
        lblPasswort.setBounds(300, 191, 105, 14);
        frame.getContentPane().add(lblPasswort);
       
        JLabel ZiehLabel = new JLabel();
        ZiehLabel.setBackground(SystemColor.control);
        ZiehLabel.addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                pX = e.getX();
                pY = e.getY();
            }
        });
        ZiehLabel.addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseDragged(MouseEvent e) {
                frame.setLocation(frame.getLocation().x + e.getX() - pX,
                frame.getLocation().y + e.getY() - pY);
            }
        });
        ZiehLabel.setBounds(0, 0, 634, 503);
        frame.getContentPane().add(ZiehLabel);
       
        JSeparator separator = new JSeparator();
        separator.setForeground(new Color(255, 255, 255));
        separator.setBackground(new Color(255, 255, 255));
        separator.setBounds(300, 143, 290, 2);
        frame.getContentPane().add(separator);
       
        JSeparator separator_1 = new JSeparator();
        separator_1.setForeground(Color.WHITE);
        separator_1.setBackground(Color.WHITE);
        separator_1.setBounds(300, 246, 290, 2);
        frame.getContentPane().add(separator_1);
        frame.setVisible(true);

    }


Habe frame.getContentPane().setLayout(null); entfernt, funktioniert leider nicht !
 
Also du verwendest kein Layout und das solltest du ändern:
https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html

Du fügst alle Komponenten dem JFrame hinzu, besser du fügst es ein JPanel hinzu, und diesem dann dem JFrame.

Und wenn du kein Layout haben willst, dann müssen die setBounds natürlich korrekt sein.

Also Beispiel:

Java:
// 616 ist Horizontal
// 0 ist Vertical
lblNewLabel_1.setBounds(616, 0, 18, 22);

// Bei einer Auflösung von 1920x1080 müsste dann was stehen?

EDIT: Du könntest natürlich Code verwendet den ich als Beispiel hier gepostet habe.
 
Zuletzt bearbeitet:
Also du verwendest kein Layout und das solltest du ändern:
https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html

Du fügst alle Komponenten dem JFrame hinzu, besser du fügst es ein JPanel hinzu, und diesem dann dem JFrame.

Und wenn du kein Layout haben willst, dann müssen die setBounds natürlich korrekt sein.

Also Beispiel:

Java:
// 616 ist Horizontal
// 0 ist Vertical
lblNewLabel_1.setBounds(616, 0, 18, 22);

// Bei einer Auflösung von 1920x1080 müsste dann was stehen?

EDIT: Du könntest natürlich Code verwendet den ich als Beispiel hier gepostet habe.

Ein neues Layout festzusetzen, wird wahrscheinlich mit Stundenlanger Arbeit verbunden sein. Ich habe schon mehrere Klassen erstellt und deshalb muss ich auf eine Alternative zurückgreifen.
Also müsste ich es immer bei setBounds manuell anpassen?
 
Also müsste ich es immer bei setBounds manuell anpassen?

Nein müsstest du nicht, aber anhand der Auflösung müsste für jedes Element die richtige Position gesetzt sein.
Verwenden kannst du z. B Toolkit.getDefaultToolkit().

Ich nehme mal an das Kreuz soll oben rechts sein? Bei einer Auflösung von 1920X1080 müsste dann setBounds(width-20, 0, 18, 22) lauten.

Usw.
 
Nein müsstest du nicht, aber anhand der Auflösung müsste für jedes Element die richtige Position gesetzt sein.
Verwenden kannst du z. B Toolkit.getDefaultToolkit().

Ich nehme mal an das Kreuz soll oben rechts sein? Bei einer Auflösung von 1920X1080 müsste dann setBounds(width-20, 0, 18, 22) lauten.

Usw.
Ich kann dir da nicht richtig folgen.
Code:
        frame = new JFrame();
        frame.getContentPane().setBackground(Color.LIGHT_GRAY);
        frame.getContentPane().setForeground(Color.WHITE);
        frame.setBounds(20, 0, 18, 22);
        frame.setUndecorated(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);

habe es jetzt so übernommen und jetzt sehe ich das JFrame garnicht mehr
 
Für dein X zum Beispiel:

Java:
Toolkit tk = Toolkit.getDefaultToolkit();
int xSize = ((int) tk.getScreenSize().getWidth());
int ySize = ((int) tk.getScreenSize().getHeight());
.....
// Bei einer Auflösung von 1920 x 1080 wäre dann xSize 1900
lblNewLabel_1.setBounds(xSize - 20, 0, 18, 22);

So jetzt sollte das X rechts oben sein. Und du willst sicher deine Textfelder zentriert haben?
Dann musst du anhand xSize und ySize die richtige Position errechnen. Dabei solltest du die Größe jedes Elements beachten.
 
Du machst dir das aber auch unnötig kompliziert ...
Layoutmanager zu verwenden, ist das erste, das man mit Swing lernen sollte.
Dem Frame Komponenten hinzuzufügen macht deinen Code sehr starr. Besser ist wirklich, ein Panel als Komponente zu verwenden und dieses Panel dann dem Frame hinzuzufügen.
Damit es automatisch auf die Größe des Frame skaliert, verwendest du für die Content-Pane des Frames ein BorderLayout und fügst das Panel mit der Eigenschaft CENTER hinzu. Dann musst du gar nichts manuell machen.
 

Zurück
Oben