我很难理解 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);
    }
}

我得到以下控制台输出:



和以下框架:
Frame Image

我的问题是:
  • 上、左、下、右值如何指定空间量
    边界需要自己画?
  • 为什么这些插图在设置边距时会发生变化?
  • 最佳答案

    好吧,先说第一件事。您对 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() 时,您也会影响复合边框的内部部分。

    这解释了您的结果:



    外线每条宽度为 3 px,您的边距为 ( 100,10,10,10 ) 为您提供上述总边框插图。

    关于java - 需要帮助理解 JButton 的 getInsets() 方法返回的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54779010/

    10-12 15:08