JButton的getInsets()方法返回值的含义需要解释。

3

我很难理解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个回答

3
首先,你调用的 button.getInsets()getBorderInsets(button)相同的,正如你在文档中所看到的,并且通过源代码得到证实(内部上,getInsets() 仅仅是调用 getBorderInsets(this) )。
现在,我们来说说默认情况下,JButton 是由一个CompoundBorder 装饰的。如果你查看源代码,你会发现用于按钮的 CompoundBorder 由以下两个部分组成:
- 一个类型为 BasicBorders.ButtonBorder外边框,以及 - 一个类型为 MarginBorder内边框MarginBorder 可能是你感兴趣的点。它有一个重写 getBorderInsets() 的方法返回组件的边距
因此,总之,JButton 的边框实际上由两个边框组成。外部的实际边界线(你传统上会认为是“边框”,使其看起来是3D的),以及内部的边框。因此,当你执行 setMargin() 时,你也会影响到复合边框的内部部分。
这就解释了你得到的结果:

Button Insets java.awt.Insets[top=103,left=13,bottom=13,right=13]

外部线条每边宽3像素,而你的边距是 (100,10,10,10) ,所以得到了以上总边框插入量。

这就解释了!谢谢@NPras! - AJo

0

我认为您可以使用组件插入来完成此操作。因此,请调用类似以下的内容:

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

在设置组件的边框后,您应该这样做。

Insets是一个简单的类,包含4个字段:top、left、bottom和right。Insets用于描述围绕组件的填充。Swing中的每个边框都应返回一个Insets对象,描述要添加多少填充以使边框正确呈现。

自定义Swing组件开发提示:Insets很重要


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接