当前位置: 首页 > 知识库问答 >
问题:

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

公西财
2023-03-14

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

更新问题如下。

我有一个包含:

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

它包含以下三个面板:

具有固定大小“x”和“y”的J面板

没有固定大小的JPanel

没有固定尺寸和小高度的J面板

第二个JGroup包含一个JTable,因此它会扩展以填充整个高度,并按预期将底部面板一直向下推。

像这样:

t
t
m
m
m
m
m
b

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

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

ttt
mmm
 b 

我想这样,其中面板填充整个宽度:

ttt
mmm
bbb

或者这个,底部面板在左侧居中:

ttt
mmm
b

老问题如下:

我有一个包含:

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

其中,还有三个JPanel。前两个是固定大小的,中间一个不是。

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

我尝试过使用胶水,但没有效果,我宁愿不设置首选大小和最小/最大大小。是否有一种方法告诉组件仅使用布局管理器和框架“填充整个父宽度”。我不想开始做像设置大小和重写方法这样的事情。

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

尝试1:

使用<code>myPanel。setLayout(新网格布局(3,1)) 未产生预期结果。它制作了一个网格,如下所示:

XX
 X

但我期望:

X
X
X

尝试2:

使用myPanel.setLayout(new GridLayout(0,1));没有产生预期的结果。它制作了一个像这样的网格:

x
x
x

但是所有的面板都是一样的尺寸,忽略了限制。

共有3个答案

董花蜂
2023-03-14

您可以使用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));
    }
}

输出:

姚凯歌
2023-03-14

如果使用 BorderLayout 并且 b 面板位于南部PAGE_END则它确实会填充整个宽度。

楚嘉玉
2023-03-14

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

myPanel.setLayout(new GridLayout(0, 1));
 类似资料:
  • 我想在一个JFrame中用另一个Jpanel替换一个Jpanel,我已经搜索并尝试了我的代码,但什么也没有发生,这是我的代码: 有人能帮帮我吗?多谢

  • 我想在我的基本框架中添加一个带有JPanel的JScrollpane 如果我将带有的直接添加到中,就可以了。但是现在,当我将帧的大小减小到500像素以下时,变得更小,如第二张图片所示。 如何使JScrollPane工作?

  • 我希望来自两个不同类的两个图像并排扩展JPanel。 我遇到的问题是两个JPanel应该在JFrame内部,但是当我做framename.add(panel)时,它会替换另一个,而不是并排添加其中两个。 我尝试在主类中添加flowlayout和其他布局,但是没有一个图像显示出来。 所以我的问题是,如果我有两个扩展Jpanel的类,我如何在Jframe中添加这两个面板,以便它们并排(彼此相邻)而不替

  • 我为欢迎屏幕设计了一个接口,其中有一个JFrame,包括两个JPanel(JPanel1在右边,JPanel2在左边)。左边的按钮用于切换JPanel1中的面板。我想按下一个按钮,用另一个JPanel替换JPanel1内容,但我不知道怎么做。请帮忙。

  • 我刚刚接触Java,正在为我的大学班级做一个项目。我正在开发一款百万富翁游戏,但是我被卡住了。 我有一个JFrame类,其中我有2个面板。第一个由按钮组成,第二个是我想通过按下按钮来更改的面板。按钮具有自己的类及其构造函数,面板也是如此,因为它们具有不同的布局。我需要在按钮类中创建一个方法,以从框架中删除第二个面板并添加第三个面板(在另一个更JPanel类中描述)。因此,从技术上讲,我需要从按钮类

  • 问题内容: 我在另一个内部的JPanel有问题。我不知道为什么,但是结果是一个简单的正方形,但是尺寸不正确。这是为什么? 问题答案: 您需要将panel3的布局也设置为null,否则将使用默认设置: