Я хочу создать панель инструментов, похожую на ленты, с большими значками и текстом ниже.
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
Iподумал о заполнении текста пробелами, чтобы заставить их быть больше:
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);
}
К сожалению, это не работает на главной панели инструментов, поскольку на самом деле это не одна, а много меньших панелей инструментов.И даже если это сработало, я думаю, что сценарий использования достаточно распространен, поэтому должно быть лучшее решение.
Как создать панель инструментов с элементами одинаковой ширины?