SWT - Создание сетки чисел, которую я хотел бы иметь возможность вкладывать с помощью клавиатуры - PullRequest
1 голос
/ 27 января 2012

Эта проблема сводит меня с ума !!! Используя SWT, я хотел бы создать сетку чисел, которую я могу перемещать с помощью клавиатуры. Я хотел бы иметь возможность выбрать и щелкнуть каждую ячейку (а не только цифры), чтобы выполнить какое-либо действие. Другими словами, я ищу способ сделать настоящую кнопку FLAT. Цель здесь - сделать сетку доступной для программ чтения с экрана таким образом, чтобы, когда ячейка была в фокусе, программа чтения с экрана считывала числовое значение в середине каждой ячейки.

Первоначально я создал GridLayout с набором кнопок управления для отображения числовых значений. Это действительно сработало, но я не хотел, чтобы кнопки выглядели как кнопки. Стиль SWT.FLAT для кнопок управления не работает в операционных системах Windows. Это вызвано ограничением ОС.

Затем я попытался преобразовать все кнопки в метки, но поскольку элементы управления метками не могут сфокусироваться, я не смог реализовать какой-либо тип обхода табуляции. Затем я попытался заменить все метки текстовыми элементами управления только для чтения. Мне удалось вновь представить обход / фокусировку вкладок, но я не могу отобразить текст в мертвой точке каждой ячейки. Это на самом деле вызвано ограничением SWT. Стиль SWT.CENTER для текстовых элементов управления влияет только на горизонтальное выравнивание. Элементы управления текстом не могут быть выровнены по вертикали.

Итак, наконец, кто-то сказал мне обернуть каждый текстовый элемент управления только для чтения в Composite. Это позволило мне центрировать текстовые элементы управления только для чтения, но я не знаю, как сделать сам композит для перемещения по табуляции.

Любые идеи о том, как я могу это сделать или как сделать элементы управления, которые обычно не фокусируются (например, составной, холст, метка), на самом деле фокусируются, чтобы я мог перемещаться по каждому элементу управления с помощью клавиатуры?

Я довольно новичок в Java и SWT, поэтому прошу прощения, если что-то из этого сбивает с толку. Большое спасибо. Вот как я построил каждую из своих ячеек (я заменил текст только для чтения элементами управления CLabel):

Display display = new Display();
Shell shell = new Shell(display); 

GridLayout gridLayout = new GridLayout(5, false);
gridLayout.marginWidth = 0;
gridLayout.marginHeight = 0;
gridLayout.horizontalSpacing = 1;
gridLayout.verticalSpacing = 1;
shell.setLayout(gridLayout);    

Composite resetComp = new Composite(shell, SWT.BORDER);
GridData compgridData = new GridData(SWT.CENTER, SWT.CENTER, true, true);
GridData resetGD = new GridData(SWT.FILL, SWT.FILL, false, false);
resetGD.verticalSpan = 2;    
resetComp.setLayoutData(resetGD);
resetComp.setLayout(new GridLayout(1, false));  

CLabel resetCLabel = new CLabel(resetComp, SWT.SHADOW_OUT | SWT.CENTER);
resetCLabel.setText("Reset"); //$NON-NLS-1$
resetCLabel.setLayoutData(compgridData);
resetCLabel.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_RED)); //$NON-NLS-1$

resetComp.setToolTipText(resetCLabel.getText()); 

1 Ответ

0 голосов
/ 28 января 2012

Вот хитрость, может быть, она вам подойдет: создайте каждую кнопку внутри Composite и установите размер кнопки больше, чем ее родительский Composite; Таким образом, граница кнопки не видна, потому что вне ее родительского композита.

private static final int GRID_SIZE = 5;
private static final int CELL_SIZE = 40;
private static final int PADDING = 3;

public static void main (String [] args) {
    Display display = new Display ();
    Shell shell = new Shell (display);
    shell.setLayout(new GridLayout(GRID_SIZE, true));

    for (int i = 0; i < GRID_SIZE * GRID_SIZE; i++) {
        createButton(shell, i+1);     
    }

    shell.pack ();
    shell.open ();
    while (!shell.isDisposed ()) {
        if (!display.readAndDispatch ()) display.sleep ();
    }
    display.dispose ();
}

private static void createButton(Shell shell, final int number) {
    Composite c = new Composite(shell, SWT.NONE);
    c.setLayoutData(new GridData(CELL_SIZE, CELL_SIZE));

    Button button = new Button(c, SWT.NONE);
    button.setText(Integer.toString(number));
    button.setBounds(-PADDING, -PADDING, CELL_SIZE + 2 * PADDING, CELL_SIZE + 2 * PADDING);

    button.addSelectionListener(new SelectionAdapter() {
        public void widgetSelected(SelectionEvent e) {
            System.err.println("click on " + number);
        }
    });
}

Он отвечает вашим требованиям: фокусировка по центру. Результат может быть более или менее приятным в зависимости от версии Windows (попробуйте изменить отступы или добавить границу для Composite, это может выглядеть лучше).

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