我想创建一个看起来像丝带的工具栏,下面带有大图标和文本。
public class ToolBarExamples {
public static void main(String[] args) {
final Display display = new Display();
final Shell shell = new Shell(display);
new ToolBarExamples(shell);
shell.setSize(500, 100);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
final Image icon;
public ToolBarExamples(Shell shell) {
this.icon = new Image(shell.getDisplay(), "C:/temp/icon.png");
shell.addDisposeListener(e -> this.icon.dispose());
final ToolBar toolBar = new ToolBar(shell, SWT.FLAT | SWT.WRAP | SWT.BOTTOM);
createItem(toolBar, "Item Name");
createItem(toolBar, "Other Name");
createSeparator(toolBar);
createItem(toolBar, "Long Item Name");
createItem(toolBar, "Short");
createItem(toolBar, "Very long Item Name");
toolBar.pack();
}
private ToolItem createItem(ToolBar toolBar, String itemText) {
final ToolItem item = new ToolItem(toolBar, SWT.PUSH);
item.setText(itemText);
item.setImage(this.icon);
item.addListener(SWT.Selection, e -> System.out.println(((ToolItem) e.widget).getText() + " selected!"));
return item;
}
private static ToolItem createSeparator(ToolBar toolBar) {
return new ToolItem(toolBar, SWT.SEPARATOR | SWT.VERTICAL);
}
}
如果执行此操作(将图标替换为32x32像素后),您会看到工具栏看起来真的很糟糕,因为所有项目的宽度都不同。
我要更改它。
我尝试过的事情:
toolBar.setLayout(new GridLayout(10, true)); // does nothing?
item.setWidth(100); // only works for SWT.SEPARATOR
我考虑过用空格填充文本以使其变大:
private static void addPaddingToText(ToolBar toolBar) {
final ToolItem[] items = toolBar.getItems();
final GC gc = new GC(toolBar);
try {
final int maxWidth = Arrays.stream(items).mapToInt(i -> gc.stringExtent(i.getText()).x).max().getAsInt();
for (final ToolItem item : items) {
padText(item, gc, maxWidth);
}
} finally {
gc.dispose();
}
}
private static void padText(ToolItem item, GC gc, int maxWidth) {
String newText = item.getText();
while (true) {
String textToCheck = (newText.length() % 2 == 0) ? (newText + ' ') : (' ' + newText);
if (gc.stringExtent(textToCheck).x < maxWidth)
newText = textToCheck;
else
break;
}
item.setText(newText);
}
遗憾的是,这在主工具栏上不起作用,因为它实际上不是一个而是许多较小的工具栏。即使有效,我也认为用例足够普遍,因此必须有更好的解决方案。
如何创建宽度相同的工具栏?
答案 0 :(得分:0)
请尝试使用FillLayout
而不是GridLayout
来设置工具栏,因为
FillLayout
将小部件布置在一行或一列中,强制它们具有相同的大小。这些小部件的高度也将与最高的小部件一样高,并且与最大的小部件一样宽。