Java 如何使一个JPanel在另一个JPanel中扩展到最大宽度

Java 如何使一个JPanel在另一个JPanel中扩展到最大宽度,java,swing,jpanel,layout-manager,boxlayout,Java,Swing,Jpanel,Layout Manager,Boxlayout,我觉得我需要重新表述一下这个问题 更新了下面的问题。 我有一个JPanel,其中包含: myjpanel.setLayout(new BoxLayout(selectors, BoxLayout.PAGE_AXIS)); .setLayout(new BoxLayout(selectors, BoxLayout.PAGE_AXIS)); 它包含以下三个面板: 具有固定大小“x”和“y”的JPanel 无固定大小的JPanel 无固定尺寸和小高度的JPanel 第二个JPanel包含一个JTa

我觉得我需要重新表述一下这个问题

更新了下面的问题。

我有一个JPanel,其中包含:

myjpanel.setLayout(new BoxLayout(selectors, BoxLayout.PAGE_AXIS));
.setLayout(new BoxLayout(selectors, BoxLayout.PAGE_AXIS));
它包含以下三个面板:

具有固定大小“x”和“y”的JPanel

无固定大小的JPanel

无固定尺寸和小高度的JPanel

第二个JPanel包含一个JTable,因此它可以扩展到整个高度,并像预期的那样将底部面板一直向下推

像这样:

t=顶部面板, m=中间面板, b=底部面板

这很有效。但是底部面板不想填充父对象的整个宽度,这是一个问题

ttt
mmm
 b 
我想要这样,面板填充整个宽度:

ttt
mmm
bbb
或者,底部面板位于左中心:

ttt
mmm
b

下面的老问题:

我有一个JPanel,其中包含:

myjpanel.setLayout(new BoxLayout(selectors, BoxLayout.PAGE_AXIS));
.setLayout(new BoxLayout(selectors, BoxLayout.PAGE_AXIS));
在它里面,还有三个JPanel。前两个是固定大小的,中间一个不是

我希望我的底部面板只取它需要的高度,但使用外部JPanel的所有可用宽度

我尝试过使用胶水,但没有效果,我宁愿不设置首选和最小/最大尺寸。 是否有一种方法可以告诉组件仅使用布局管理器和框架“填充整个父宽度”。我宁愿不要开始像设置大小和覆盖方法这样的黑客行为

注意:我不能在内部面板中添加任何胶水或填充物,只能修改外部面板及其布局管理器

尝试1:

使用myPanel.setLayout(新的GridLayout(3,1))未产生预期结果。它形成了这样一个网格:

XX
 X
x
x
x
但我希望:

X
X
X
尝试2:

使用myPanel.setLayout(新的GridLayout(0,1))未产生预期结果。它形成了这样一个网格:

XX
 X
x
x
x

但是所有面板的大小都相同,忽略了约束。

最简单的方法是使用另一个布局管理器,如
GridLayout
,它可以自动调整组件的大小以填充父容器

myPanel.setLayout(new GridLayout(0, 1));
为此,你可以使用

gridBagObject.fill = GridBagConstraints.HORIZONTAL
一个是关于GridBagLayout的帮助

如评论中所述,与此相关

这是另一个备选方案,它考虑了组件的首选尺寸。如果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));
    }
}
输出:


如果使用
边框布局
并且
b
面板位于
南部
页面末端
它会填充整个宽度。

这里一些自定义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(); 
//使用一些静态值初始化计时器(中速)

//滑动至顶部位置的高度

     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(); 

... 或者JGoodiesWould的FormLayout与共享容器的两个固定尺寸的组件一起拧紧?或者,我也会非常满意左对齐内部组件,但我似乎不能这样做,因为SetAlligmentX方法不起作用,我尝试了GridLayout,它没有垂直排列组件,而是将其2个放置在顶部,1个放置在底部buttom@MartinNielsen:您必须像使用新的GridLayout(0,1)一样使用它没有更简单的方法吗?请记住,它只是垂直行中的三个组件。不应该要求它去大炮那里。我只希望我的底部组件使用全宽度。马丁尼尔森:请看一看我的答案中编辑的BoxLayout.Ehm。我想你没有读过这个问题。我正在使用BoxLayout!目前无法调整其大小。它已经在那里了,我正在使用BoxLayout,正如它在问题中所说的,但我将尝试使用borderlayout。只要一瞬间,边界布局就可以完美地工作。谢谢你,还有该死的BoxLayout:)