Да направя JPanel размер на JFrame?

Взирам се в кода си с часове и съм изрязал почти всичко до най-простите части и не знам как да накарам JPanel да се разшири до размера на рамката. В идеалния случай (в крайна сметка) бих искал контейнерен панел със северен и южен панел за съдържание. Северният панел трябва да заеме останалото пространство след поставянето на южния панел.

Засега обаче имам малко червено петънце, което е голямо колкото съдържанието му. Може ли някой да ми даде някаква представа какво правя фундаментално погрешно?

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

public class TestCode extends JFrame {

    private DescriptionPanel window = new DescriptionPanel();

    public static void main(String[] args){
     TestCode frame = new TestCode();
     frame.pack();
     frame.setTitle("Grape Project");
     frame.setLocationRelativeTo(null);
     frame.setSize(400, 300);
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     frame.setVisible(true);
    }

    public TestCode(){
        add(window);
    }
}

И класът DescriptionPanel:

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

public class DescriptionPanel extends JPanel{

    private JPanel container = new JPanel();

    public DescriptionPanel(ImageIcon pic, JLabel text){

        container.setBackground(Color.red);
        add(container);
    }
}

person leigero    schedule 02.12.2012    source източник
comment
DescriptionPanel ще има размер 0x0, освен ако не се добави съдържание или set(Preferred/Maximum/Minimum)Size() не се извика или отмени. Какво прави DescriptionPanel? Кодът смътно подсказва, че трябва да прави нещо с JLabel.   -  person Andrew Thompson    schedule 02.12.2012


Отговори (2)


Това е типичен BorderLayout сценарий.

По подразбиране JPanels имат FlowLayout вече зададен, така че вие трябва да извикате setLayout или можете да инициализирате своя DescriptionPanel с правилния мениджър на оформлението:

super(new BorderLayout()); 
// setLayout(new BorderLayout());

add(top,    BorderLayout.CENTER);  // take all available upper space left
add(bottom, BorderLayout.SOUTH);   // take the vertical space specified
person Yanick Rochon    schedule 02.12.2012
comment
Благодаря ти! setLayout(newBorderLayout()); е точно това, което липсваше. Правех всякакви свойства на границите, включително BorderLayout.CENTER и SOUTH, но това не работеше... докато не добавих setLayout. много благодаря. - person leigero; 02.12.2012

Задайте LayoutManager на BorderLayout:

setLayout(new BorderLayout());
person Mordechai    schedule 02.12.2012