如何提高 JPanel 的边距和内边距?

Posted

技术标签:

【中文标题】如何提高 JPanel 的边距和内边距?【英文标题】:How to improve the margin and padding of JPanel? 【发布时间】:2021-12-12 04:18:51 【问题描述】:

当我最初运行我的 Java Swing 应用程序时,JPanel 中的 JLabelJTextField 组件的填充和边距看起来不错。但是,每当我调整应用程序的大小时,标签和文本字段的填充和边距都会增加很多,以至于看起来不太好。

我知道GridLayout 有一定数量的垂直和水平间距,但是随着应用程序大小的增加,我可以做些什么来使间距看起来更好?我还希望文本字段中的文本随着文本字段的增加而调整大小,但一直无法弄清楚。

我一直在考虑使用GridBagLayout,但也没有太多运气。随着尺寸的增加,间距太大,看起来不太好,我一直无法找到或学习一个好的解决方案。

如果有任何建议,我将不胜感激。

代码:

package TestPackage;

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

public class TestGridLayout  

      public static void main(String[] args) 
             JPanel testPanel = new JPanel(); 
             
             GridLayout layoutManager = new GridLayout(5,2); 
              testPanel.setLayout(layoutManager); 
             
             JLabel platformEnumerationNameLabel = new JLabel(); 
            JLabel logicalEnumerationNameFieldLabel = new JLabel(); 
            JLabel valueTypeUnitNameFieldLabel = new JLabel(); 
            JLabel measurementNameFieldLabel = new JLabel(); 
             JLabel measurementAxisNameFieldLabel = new JLabel(); 
            
             JTextField platformEnumerationNameField = new JTextField(); 
             JTextField logicalEnumerationNameField = new JTextField(); 
             JTextField valueTypeUnitNameField = new JTextField(); 
            JTextField measurementNameField = new JTextField(); 
            JTextField measurementAxisNameField = new JTextField(); 
            
            platformEnumerationNameLabel.setText("Label 1");   
            testPanel.add(platformEnumerationNameLabel); 
            
            platformEnumerationNameField.setText("input some data"); 
            testPanel.add(platformEnumerationNameField); 

            logicalEnumerationNameFieldLabel.setText("Label 2");
            testPanel.add(logicalEnumerationNameFieldLabel); 
            
            logicalEnumerationNameField.setText("input some data"); 
            testPanel.add(logicalEnumerationNameField); 
            
            valueTypeUnitNameFieldLabel.setText("Label 3");
            testPanel.add(valueTypeUnitNameFieldLabel);
            
            valueTypeUnitNameField.setText("input some data");
            testPanel.add(valueTypeUnitNameField); 
            
            measurementNameFieldLabel.setText("Label 4");
            testPanel.add(measurementNameFieldLabel);
            
            measurementNameField.setText("input some data");
            testPanel.add(measurementNameField); 
            
            measurementAxisNameFieldLabel.setText("Label 5");
            testPanel.add(measurementAxisNameFieldLabel);
            
            measurementAxisNameField.setText("input some data");
            testPanel.add(measurementAxisNameField);  
            
            JDialog dialog = new JDialog();
            
            dialog.add(testPanel);
            
            dialog.setSize(700,200); 
            dialog.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            dialog.setVisible(true);
      
    

【问题讨论】:

使用GridBagLayout Java Swing 不会自动重新调整字体大小。根据主要JPanel 大小手动计算字体大小会很困难。您可以选择两种或三种字体大小,然后让JFrame 自行打包成适当的大小,但这需要您进行额外的编码。否则,@MadProgrammer 的答案是你能做的最好的。 【参考方案1】:

使用不同的布局管理器,它不会调整所有组件的大小(除非你想要它们)

更多详情请见How to Use GridBagLayout

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Test 

    public static void main(String[] args) 
        new Test();
    

    public Test() 
        EventQueue.invokeLater(new Runnable() 
            @Override
            public void run() 
                JFrame frame = new JFrame();
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            
        );
    

    public class TestPane extends JPanel 

        public TestPane() 
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.insets = new Insets(8, 8, 8, 8);
            gbc.gridx = 0;
            gbc.gridy = 0;

            JLabel platformEnumerationNameLabel = new JLabel();
            JLabel logicalEnumerationNameFieldLabel = new JLabel();
            JLabel valueTypeUnitNameFieldLabel = new JLabel();
            JLabel measurementNameFieldLabel = new JLabel();
            JLabel measurementAxisNameFieldLabel = new JLabel();

            JTextField platformEnumerationNameField = new JTextField(20);
            JTextField logicalEnumerationNameField = new JTextField(20);
            JTextField valueTypeUnitNameField = new JTextField(20);
            JTextField measurementNameField = new JTextField(20);
            JTextField measurementAxisNameField = new JTextField(20);


            platformEnumerationNameLabel.setText("Label 1");
            add(platformEnumerationNameLabel, gbc);

            gbc.gridx++;
            platformEnumerationNameField.setText("input some data");
            add(platformEnumerationNameField, gbc);

            gbc.gridy++;
            gbc.gridx = 0;
            logicalEnumerationNameFieldLabel.setText("Label 2");
            add(logicalEnumerationNameFieldLabel, gbc);

            gbc.gridx++;
            logicalEnumerationNameField.setText("input some data");
            add(logicalEnumerationNameField, gbc);

            gbc.gridy++;
            gbc.gridx = 0;
            valueTypeUnitNameFieldLabel.setText("Label 3");
            add(valueTypeUnitNameFieldLabel, gbc);

            gbc.gridx++;
            valueTypeUnitNameField.setText("input some data");
            add(valueTypeUnitNameField, gbc);

            gbc.gridy++;
            gbc.gridx = 0;
            measurementNameFieldLabel.setText("Label 4");
            add(measurementNameFieldLabel, gbc);

            gbc.gridx++;
            measurementNameField.setText("input some data");
            add(measurementNameField, gbc);

            gbc.gridy++;
            gbc.gridx = 0;
            measurementAxisNameFieldLabel.setText("Label 5");
            add(measurementAxisNameFieldLabel, gbc);

            gbc.gridx++;
            measurementAxisNameField.setText("input some data");
            add(measurementAxisNameField, gbc);
        

    

【讨论】:

以上是关于如何提高 JPanel 的边距和内边距?的主要内容,如果未能解决你的问题,请参考以下文章

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

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

jq获取元素的宽高(内边距和外边距)

DWCC2017里面图片与文字水平边距在哪

什么是内边距和外边距?

关于css盒子边框、内边距、外边距