Создать панель инструментов с элементами одинаковой ширины - PullRequest
0 голосов
/ 25 июня 2018

Я хочу создать панель инструментов, похожую на ленты, с большими значками и текстом ниже.

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

К сожалению, это не работает на главной панели инструментов, поскольку на самом деле это не одна, а много меньших панелей инструментов.И даже если это сработало, я думаю, что сценарий использования достаточно распространен, поэтому должно быть лучшее решение.

Как создать панель инструментов с элементами одинаковой ширины?

1 Ответ

0 голосов
/ 16 июля 2018

Попробуйте использовать FillLayout для установки панели инструментов вместо GridLayout, потому что FillLayout размещает виджеты в одной строке или столбце, заставляя их иметь одинаковый размер.Также все виджеты будут такими же высокими, как самый высокий виджет, и такими же широкими, как и самые широкие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...