需要帮助来了解JButton的getInsets()方法返回的值

时间:2019-02-20 04:44:53

标签: java swing

我很难理解JButton的getInsets()方法的返回值。在阅读文档时,我发现getInsets()方法返回按钮边框的插图(如果在按钮上设置了边框),它指定了边框需要自己绘制的空间量。

但是,在执行以下代码时:

import java.awt.Insets;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ButtonMarginInsets {   
    public static void main(String args[]) {
        JFrame frame = new JFrame();
        frame.setTitle("Test Frame");        
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JPanel contentPane = new JPanel();

        JButton button = new JButton();
        button.setText("Test Button");       
        System.out.println("Button Border Insets " + button.getBorder().getBorderInsets(button));        
        button.setMargin(new Insets(100, 10, 10, 10));       
        System.out.println("Button Insets " + button.getInsets());       

        contentPane.add(button);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setVisible(true);
    } 
}

我得到以下控制台输出:

  

按钮边框插入java.awt.Insets [top = 5,left = 17,bottom = 5,right = 17]

     

按钮插入java.awt.Insets [top = 103,left = 13,bottom = 13,right = 13]

和以下框架: Frame Image

我的问题是:

  1. top,left,bottom,right值如何指定空间量 边界需要自己绘制吗?
  2. 为什么这些插图在设置边距时会发生变化?

2 个答案:

答案 0 :(得分:3)

好的,首先要做的是。正如您在文档中所看到的那样,您对button.getInsets()getBorderInsets(button)的调用都是相同,并由source确认(内部为getInsets()仍然会调用getBorderInsets(this)

现在,这已成为现实,默认情况下,JButtonCompoundBorder装饰。如果您查看the source,可以看到用于按钮的CompoundBorder包含:

  • 类型为BasicBorders.ButtonBorder外部边界
  • 类型为MarginBorder内部边框

MarginBorder可能是您在这里感兴趣的地方。它具有getBorderInsets() that returns the component's margins的替代。

因此,总而言之,JButton的边框实际上是两个边框的组合。外部的实际边界线(您通常将其视为“边界”,使其看起来为3d),以及内部的边界。因此,当您执行setMargin()时,也会影响复合边框的 inside 部分。

这说明了您的结果:

  

按钮插入java.awt.Insets [top = 103 ,左= 13 ,底部= 13 ,右= 13 ]

外部线的宽度分别为 3 px,并且您的边距为( 100,10,10,10 ),可以使您获得上述总的边框插图。

答案 1 :(得分:0)

我认为您可以使用组件插图进行此操作。所以叫类似的东西:

Insets insets = component.getInsets();
insets.set(top, left, bottom, right);

应在组件上设置边框后执行此操作。

  

Insets是一个简单的类,包含4个字段:top,left,bottom   是的。插图用于描述围绕   零件。希望Swing中的每个边界都能返回插图   对象,描述要为组件添加多少填充   边框才能正确渲染。

Custom Swing Component Development Tip: Insets Matter

相关问题