将 JPanel 大小设置为以很小的边距填充父级

Posted

技术标签:

【中文标题】将 JPanel 大小设置为以很小的边距填充父级【英文标题】:Set the JPanel size to fill parent with little margin 【发布时间】:2012-04-12 11:28:44 【问题描述】:

我有两个 Jpanel(JpanelLeftJpanelLeftContent)我怎样才能使 JpanelLeftContent 填充父尺寸并在左侧和右侧留出一点边距。我尝试了不同的布局并尝试修改 hgap 和 vgap 值,但它们都没有给我一个好的结果。

  JPanel JpanelLeft = new JPanel();
  JPanel JpanelLeftContent = new JPanel();
  JpanelLeft.add(JpanelLeftContent);

如果可能的话,我怎样才能让 JpanelLeftContent 看起来像一个圆角矩形,如图所示。

【问题讨论】:

***.com/questions/3056089/… 或 javafaq.nu/java-example-code-800.html 你的 JRE 版本是什么,在 1.7 中你可以使用内置函数(圆角矩形)来做到这一点? 这是我忘记在 [圆角矩形](docs.oracle.com/javase/7/docs/api/javax/swing/…, int, boolean)) 之前添加的链接 正是,这正是我需要的,谢谢 @IMManis_tn : 你很受欢迎并且保持微笑:-),虽然 1.7 有很多错误,这可能会在很多时候产生奇怪的行为:( 【参考方案1】:

..我怎样才能让 JpanelLeftContent 看起来像一个圆角矩形,如图所示。

请参阅TextBubbleBorder 了解开始。

显然,您需要删除底部的小v,并将底部边框进一步向下推。该代码没有经过全面测试,需要进一步的调整和修复。 '不包括电池'。

【讨论】:

@nIcEcOw 你的也是 +1'able(之前已经完成)。我怀疑它解决了我的方法可能遇到的一些问题(使用插图)。 但是使用 JRE 1.7,我们永远无法说,还会带来什么错误,因为同样的事情也会持续存在,水平调整 LOL :(【参考方案2】:

看看Borders 是如何工作的。特别是 BorderFactory.createEmptyBorder(int top, int left, int bottom, int right) 可能会有帮助。

【讨论】:

【参考方案3】:

试试这个代码示例:

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

public class InsetTesting extends JFrame

    private void createAndDisplayGUI()
    
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setLocationByPlatform(true);

        JPanel contentPane = new JPanel();
        contentPane.setOpaque(true);
        contentPane.setBorder(BorderFactory.createLineBorder(
                                    Color.DARK_GRAY.darker(), 5, true));
        contentPane.setBackground(Color.WHITE);

        add(contentPane, BorderLayout.CENTER);
        pack();
        setVisible(true);
    

    public Insets getInsets()
    
        return (new Insets(30, 20, 10, 20));
    

    public Dimension getPreferredSize()
    
        return (new Dimension(200, 400));
    

    public static void main(String\u005B\u005D args)
    
        SwingUtilities.invokeLater(new Runnable()
        
            public void run()
            
                new InsetTesting().createAndDisplayGUI();
            
        );
    

这是相同的输出:

【讨论】:

【参考方案4】:

要使 JPanel 显示为圆形,您需要创建自己的扩展 JPanel 的类,覆盖paintComponent 并将面板绘制为椭圆Javadoc here 这将创建一个自定义对象,即 JPanel。

当您指定椭圆的大小时,您希望从父面板获取 Y 和 X 值(因为您将在另一个面板上添加椭圆),然后从 X 中减去所需的像素数-轴。这可以通过将这些值传递给“椭圆面板”构造函数来实现。

【讨论】:

但是当重新调整父面板的大小时,JpanelLeftContent 也会重新调整大小吗?我也应该重写重绘方法吗? 您可以使用 setter 为椭圆面板设置“新”值,然后调用 repaint “你需要创建自己的扩展 JPanel 的类” 不一定。我认为边框是追求此功能的更好策略。看我的回答。

以上是关于将 JPanel 大小设置为以很小的边距填充父级的主要内容,如果未能解决你的问题,请参考以下文章

GridBagLayout Java 中的边距/填充

CSS:父级没有边框时的边距顶部

如何自定义 TextField 的边距、内边距和字体大小

Java Swing - JPanel 和 GridLayout 边距/填充

如何在 Android 中以编程方式设置按钮的边距?

C# tablelayoutpanel 无法删除填充/边距