Как увеличить JPanel до максимальной ширины в другой JPanel
Я чувствую, что мне нужно немного перефразировать вопрос.
Обновленный вопрос ниже.
У меня есть 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
Но все панели имели одинаковый размер, игнорируя ограничения.
Если панель BorderLayout
и b
находится в SOUTH
или PAGE_END
, она заполняет всю ширину.
Самый простой способ - использовать другой менеджер компоновки, такой как GridLayout
, который автоматически разбивает компоненты для заполнения родительского контейнера.
myPanel.setLayout(new GridLayout(0, 1));
Вы можете использовать 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:
Здесь некоторые пользовательские 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 );
}