我很难理解 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)
)。
既然这样,默认情况下 JButton
用 CompoundBorder 装饰。如果您查看 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/