如何在SWT Button的图标与文本之间设置间距?
你想要的btn.setMarginBetweenTextIcon(12)这种直接方法,SWT标准Button确实没有原生提供,但有几种实用的实现方式,根据你的SWT版本来选就好:
方法一:用SWT 3.107+原生方法(最推荐)
如果你的SWT版本是3.107或更高(对应Eclipse 2019-09及之后的版本),那直接用官方新增的setImageTextSpacing方法就行,一步到位:
btn.setImageTextSpacing(12); // 直接把图标和文本的间距设为12像素
这个方法就是专门解决这个场景的,不用自己折腾,效果也最稳定。
方法二:自定义Button适配旧版SWT
要是你的SWT版本比较老,没有上面的方法,那就自己写个自定义Button,手动控制绘制时的间距:
class SpacedButton extends Button { private int iconTextSpacing = 12; // 默认间距 public SpacedButton(Composite parent, int style) { super(parent, style); } // 对外提供设置间距的方法 public void setIconTextSpacing(int spacing) { this.iconTextSpacing = spacing; redraw(); // 改完间距后重新绘制按钮 } @Override protected void paintControl(PaintEvent e) { // 先绘制按钮的背景和边框,模拟原生Button的样式 Rectangle clientArea = getClientArea(); e.gc.setBackground(getBackground()); e.gc.fillRectangle(clientArea); // 如果有边框样式,绘制边框 if ((getStyle() & SWT.BORDER) != 0) { e.gc.setForeground(getDisplay().getSystemColor(SWT.COLOR_WIDGET_BORDER)); e.gc.drawRectangle(clientArea.x, clientArea.y, clientArea.width - 1, clientArea.height - 1); } Image image = getImage(); String text = getText(); if (image == null || text.isEmpty()) { return; } // 计算图标和文本的绘制位置(以左对齐为例) int startX = clientArea.x + getMarginWidth(); int iconY = clientArea.y + (clientArea.height - image.getBounds().height) / 2; // 绘制图标 e.gc.drawImage(image, startX, iconY); // 绘制文本,加上自定义的间距 int textX = startX + image.getBounds().width + iconTextSpacing; int textY = clientArea.y + (clientArea.height - e.gc.textExtent(text).y) / 2; e.gc.drawText(text, textX, textY, true); } }
使用的时候就像普通Button一样,再加个设置间距的调用:
SpacedButton btn = new SpacedButton(grpInventar, SWT.NONE); // 保留你原来的布局设置 GridData gd_btn = new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1); gd_btn.widthHint = 154; btn.setLayoutData(gd_btn); btn.setAlignment(SWT.LEFT); btn.setImage(this.getImageByLocation(Application.getIconLocByInventoryClass(Whateverimage.class ))); btn.setText("Text"); btn.setIconTextSpacing(12); // 这里设置间距
方法三:用Composite模拟Button(备选)
如果不想自定义控件,也可以用Composite包裹图标Label和文本Label,手动控制间距,再模拟Button的点击效果:
// 创建模拟Button的Composite Composite btnComposite = new Composite(grpInventar, SWT.BORDER); btnComposite.setLayout(new GridLayout(2, false)); // 设置和原Button一样的布局数据 GridData gd_btnComposite = new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1); gd_btnComposite.widthHint = 154; btnComposite.setLayoutData(gd_btnComposite); // 图标Label Label iconLabel = new Label(btnComposite, SWT.NONE); iconLabel.setImage(this.getImageByLocation(Application.getIconLocByInventoryClass(Whateverimage.class ))); GridData gd_icon = new GridData(); iconLabel.setLayoutData(gd_icon); // 文本Label,通过horizontalIndent设置间距 Label textLabel = new Label(btnComposite, SWT.NONE); textLabel.setText("Text"); GridData gd_text = new GridData(SWT.CENTER, SWT.CENTER, true, true); gd_text.horizontalIndent = 12; // 这里直接设置图标和文本的间距 textLabel.setLayoutData(gd_text); // 模拟Button的点击状态 btnComposite.addMouseListener(new MouseAdapter() { @Override public void mouseDown(MouseEvent e) { btnComposite.setBackground(getDisplay().getSystemColor(SWT.COLOR_WIDGET_DARK_SHADOW)); } @Override public void mouseUp(MouseEvent e) { btnComposite.setBackground(getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND)); // 在这里添加按钮的点击逻辑 } });
这种方式好处是布局灵活,但需要自己处理Button的各种交互状态(比如 hover、按下),适合简单场景。
内容的提问来源于stack exchange,提问作者Sanyifejű
相关产品推荐
相关产品推荐

