我很难理解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
我的问题是:
答案 0 :(得分:3)
好的,首先要做的是。正如您在文档中所看到的那样,您对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()
时,也会影响复合边框的 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中的每个边界都能返回插图 对象,描述要为组件添加多少填充 边框才能正确渲染。