JPanel занимает все пространство JFrame

Я изо всех сил пытаюсь разместить несколько простых объектов с помощью диспетчера FlowLayout в Swing.

По сути, я создал небольшую программу, настроил размер фрейма, затем создал несколько JLabels, а затем одну JPanel.

Я поставил JPanel setSize 300x300 и изменил его цвет на красный, чтобы визуально увидеть его. Однако он занимает все пространство JFrame, и кажется, что setsize не влияет на него.

Что я делаю неправильно? Я попытался найти его и несколько раз менял код, но безуспешно. Я даже прочитал, но явно не правильно понял, код на oracle... Пожалуйста, помогите. Ниже мой код до сих пор.

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Main extends JFrame{

    public String frameTitle, projectNameString, countryNameString, projectDetailString, requestDateString;
    private int offerRevisionVal;
    private Toolkit toolkit;


    // UPPER OBJECTS
    //private JLabel projectLabel, countryLabel, projectDetailLabel, offerLabel, requestDateLabel, emptyLabel;


    public Main(){

        frameTitle = "CRANES QUOTATIONS";

        // MAIN INSTANCE VARIABLES DEFINITION
        projectNameString = "Project Title"; // TO ADD LATER 
        countryNameString = "Brazil"; // TO ADD LATER
        projectDetailString = "32 Cranes biTravi"; // TO ADD LATER
        offerRevisionVal = 01; // TO ADD LATER
        requestDateString = "20-April-2017"; // tTO ADD LATER

        this.setTitle(frameTitle);

        JPanel panel = new JPanel();
        panel.setBackground(Color.red);
        panel.setSize(new Dimension(300,300));


        //projectLabel = new JLabel(projectNameString);
        //countryLabel = new JLabel(countryNameString);
        //projectDetailLabel = new JLabel(projectDetailString);
        //offerLabel = new JLabel(String.valueOf(offerRevisionVal));
        //requestDateLabel = new JLabel(requestDateString);




        this.add(panel);            
        // =========================================================================== 
        this.setSize(800, 300); // set the height and width of my window
        this.centerToScreen ();
        this.setVisible(true); // set visibility 
        this.setDefaultCloseOperation(EXIT_ON_CLOSE); // sets up what it does when I close the App.

    }

    // Method to center to screen
    public void centerToScreen (){

        toolkit = getToolkit();
        Dimension size = toolkit.getScreenSize(); // gets the screen size
        setLocation(size.width / 2 - getWidth() / 2, size.height / 2 - getHeight() / 2); // sets the location
    }


    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){

            @Override
            public void run() {
                new Main();

            }

        });


    }
    }

1 ответ

Решение

JFrame использования BorderLayout по умолчанию LayoutManager, Так что вам нужно неявно установить макет вашего JFrame в FlowLayout:

this.setLayout(new FlowLayout());

Вы также должны использовать setPreferredSize() вместо setSize() на ваше panel, так как setSize() не имеет никакого эффекта, если контейнер вашего panel (JFrame) имеет ненулевое значение LayoutManager,

Другие вопросы по тегам