Как увеличить JPanel до максимальной ширины в другой JPanel

121
17

Я чувствую, что мне нужно немного перефразировать вопрос.


Обновленный вопрос ниже.


У меня есть JPanel, который содержит:


myjpanel.setLayout(new BoxLayout(selectors, BoxLayout.PAGE_AXIS));

Он содержит следующие три панели:


JPanel с фиксированным размером 'x' и 'y'


JPanel без фиксированного размера


JPanel без фиксированного размера и малой высоты


Второй JPanel содержит JTable, поэтому он расширяется, чтобы заполнить всю высоту и толкает нижнюю панель вниз, как и ожидалось.


Вот так:


t
t
m
m
m
m
m
b

t = верхняя панель,
m = средняя панель,
b = нижняя панель.


Это работает. Но нижняя панель не похожа на заполнение всей ширины родителя, что является проблемой.


ttt
mmm
b

Мне бы хотелось либо это, когда панель заполняет всю ширину:


ttt
mmm
bbb

или это, где нижняя панель находится в центре:


ttt
mmm
b

Старый вопрос ниже:


У меня есть JPanel, который содержит:


.setLayout(new BoxLayout(selectors, BoxLayout.PAGE_AXIS));

В нем есть еще три JPanels. Первые два имеют фиксированный размер, а средний - нет.


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


Я пробовал использовать клей, но безрезультатно, и я предпочел бы не устанавливать предпочтительные и минимальные/максимальные размеры.
Есть ли способ сообщить компоненту "Заполнить всю ширину родителей", используя только менеджер компоновки и структуру. Я бы предпочел не начинать делать хаки, как настройки размеров и переопределяющие методы.


Примечание. Я не могу поместить какой-либо клей или наполнитель во внутреннюю панель, можно изменить только внешнюю панель и менеджер компоновки.


Попытка 1:


Использование myPanel.setLayout(new GridLayout(3, 1)); не дало ожидаемых результатов. Он сделал сетку следующим образом:


XX
X

Но я ожидал:


X
X
X

Попытка 2:


Использование myPanel.setLayout(new GridLayout(0,1)); не дало ожидаемых результатов. Он сделал сетку следующим образом:


X
X
X

Но все панели имели одинаковый размер, игнорируя ограничения.

спросил(а) 2013-01-10T16:54:00+04:00 7 лет, 8 месяцев назад
1
Решение
97

Если панель BorderLayout и b находится в SOUTH или PAGE_END, она заполняет всю ширину.

ответил(а) 2013-01-10T17:50:00+04:00 7 лет, 8 месяцев назад
151

Самый простой способ - использовать другой менеджер компоновки, такой как GridLayout, который автоматически разбивает компоненты для заполнения родительского контейнера.

myPanel.setLayout(new GridLayout(0, 1));

ответил(а) 2013-01-10T16:57:00+04:00 7 лет, 8 месяцев назад
81

Вы можете использовать GridBagLayout, для этого, используя


gridBagObject.fill = GridBagConstraints.HORIZONTAL

Один пример для вашей помощи, относящийся к GridBagLayout.


Как указано в комментариях, связанных с этим


BoxLayout - еще одна альтернатива, которая учитывает предпочтительные размеры компонентов. Вы можете попробовать это, если GridBagLayout так сложно: -)


Код с GridBagLayout, для большей ясности:


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

/**
* Created with IntelliJ IDEA.
* User: Gagandeep Bali
* Date: 1/10/13
* Time: 7:43 PM
*/
public class GridBagExample
{
private void displayGUI()
{
JFrame frame = new JFrame("GridBagLayout Example");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

CustomPanel topPanel = new CustomPanel(Color.BLUE.darker().darker());
CustomPanel middlePanel = new CustomPanel(Color.CYAN.darker().darker());
CustomPanel bottomPanel = new CustomPanel(Color.DARK_GRAY);

JPanel contentPane = new JPanel();
contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new GridBagLayout());

GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.FIRST_LINE_START;
gbc.fill = GridBagConstraints.VERTICAL;
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 1.0;
gbc.weighty = 0.3;

contentPane.add(topPanel, gbc);

gbc.gridy = 1;
contentPane.add(middlePanel, gbc);

gbc.gridy = 2;
gbc.fill = GridBagConstraints.BOTH;
contentPane.add(bottomPanel, gbc);

frame.setContentPane(contentPane);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}

public static void main(String... args)
{
EventQueue.invokeLater(new Runnable()
{
@Override
public void run()
{
new GridBagExample().displayGUI();
}
});
}
}

class CustomPanel extends JPanel
{
public CustomPanel(Color backGroundColour)
{
setOpaque(true);
setBackground(backGroundColour);
}

@Override
public Dimension getPreferredSize()
{
return (new Dimension(200, 150));
}
}


OUTPUT:


GridBagExampleOutput

ответил(а) 2013-01-10T17:07:00+04:00 7 лет, 8 месяцев назад
-4

Здесь некоторые пользовательские JPanel используются для расширения и сжатия со статическими входными значениями.

Таймер Java использует для задержки и ускоряет отображение времени отображения панели.


 public class SlidingPanel extends JPanel {
private int paneHeight;
private int paneWidth;
private int comHeight;
private int comWidth;
private Timer everyspeedmillisec;

/**custom class for slide up and down actions for JPanel
*
*/

public SlidingPanel(LayoutManager layout,Dimension panedim) {

super(layout);
setPreferredSize(panedim);
paneHeight = (int)panedim.getHeight();;
paneWidth = (int) panedim.getWidth();

}

/**function for expanding Jpanel
*
*/

public void expand_sft_det(int speed ,JPanel slidingcom)
{

//Add Jpanel for sliding

this.add(slidingcom);


//Получите высоту и ширину панели, что мы хотим отобразить как высоту слайда.


 comHeight=(int)slidingcom.getMinimumSize().getHeight();

comWidth=(int) slidingcom.getMinimumSize().getWidth();


//Интеллизирующий таймер с некоторыми статическими значениями - Средняя скорость)


   everyspeedmillisec = new Timer(30, new ActionListener() {

private int count_timer=0;

public void actionPerformed(ActionEvent e) {

count_timer++;

if( paneHeight < comHeight){

setPreferredSize(new Dimension(paneWidth, paneHeight));

paneHeight+=20;

repaint();

revalidate();

}
else

everyspeedmillisec.stop() ;
}

});

everyspeedmillisec.start();

}


/** функция для сжатия Jpanel    *    */


public void shrink_sft_det(int speed ,JPanel slidingcom) {

comHeight = (int)slidingcom.getMinimumSize().getHeight();

comWidth = (int)slidingcom.getMinimumSize().getWidth();


//высота для слайдов в верхней позиции


     paneHeight=0;

everyspeedmillisec = new Timer(30, new ActionListener() {

private int count_timer=0;

public void actionPerformed(ActionEvent e) {

count_timer++;

if( paneHeight < comHeight){

setPreferredSize(new Dimension(comWidth,comHeight));

comHeight-=20;

repaint();

revalidate();

}
else
everyspeedmillisec.stop() ;

}

});
everyspeedmillisec.start();


}


//Объявлять класс и использовать сокращающееся событие onclick


public class SoftPanel extends JPanel implements ActionListener
, MouseListener {

JPanel MoredetPane;

JPanel SlidedetPane;

private JLabel SoftDOCLabel;

private JLabel SoftLocation;

private JLabel SoftUpdates;

private boolean mr_det_flag =true;

MoredetPane = new SlidingPanel(new GridLayout(1,1,5,5),new Dimension(300,1));

MoredetPane.setOpaque(false);

//Add some components

SlidedetPane = new JPanel(new GridLayout(3,2,50,25));

SlidedetPane.setPreferredSize(new Dimension(300,200));

SlidedetPane.setOpaque(false);

SoftDOCLabel = new JLabel("Software Date") ;

SoftLocation = new JLabel("Software Location") ;

SoftUpdates = new JLabel("Software Updates") ;

SlidedetPane.add(SoftDOCLabel);

SlidedetPane.add(new JLabel(softbean.getSoftDOC()));

SlidedetPane.add(SoftLocation);

SlidedetPane.add(new JLabel(softbean.getSoftPath()));

SlidedetPane.add( SoftUpdates);

SlidedetPane.add(new JLabel(""));

//Onclick events

modedetails_Label.addMouseListener(new MouseAdapter() {

@Override
public void mousePressed(MouseEvent clickeve) {

if(mr_det_flag){

mr_det_flag=false;

((SlidingPanel)MoredetPane).expand_sft_det(200,SlidedetPane);

add(SlidingPanel);
}
else{

mr_det_flag=true;

((SlidingPanel) MoredetPane).shrink_sft_det(0,SlidedetPane);

}

});

add( MoredetPane );

}

ответил(а) 2013-07-06T09:03:00+04:00 7 лет, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема