使用相同宽度的项目创建工具栏

时间:2018-06-25 06:48:38

标签: java swt

我想创建一个看起来像丝带的工具栏,下面带有大图标和文本。

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);
}

遗憾的是,这在主工具栏上不起作用,因为它实际上不是一个而是许多较小的工具栏。即使有效,我也认为用例足够普遍,因此必须有更好的解决方案。

如何创建宽度相同的工具栏?

1 个答案:

答案 0 :(得分:0)

请尝试使用FillLayout而不是GridLayout来设置工具栏,因为 FillLayout将小部件布置在一行或一列中,强制它们具有相同的大小。这些小部件的高度也将与最高的小部件一样高,并且与最大的小部件一样宽。