Как создать текстовое поле SWT с неактивным текстом в качестве суффикса? - PullRequest
0 голосов
/ 01 апреля 2019

Я использую Java SWT toolkit для создания GUI с вводом текстового поля.Эти поля ввода требуют числового ввода и им назначены единицы измерения.Я пытаюсь создать причудливый способ интеграции единиц измерения в поле в виде фиксированного суффикса к тексту, чтобы пользователь мог редактировать только числовую часть.Я также хотел бы, чтобы суффикс был серым, чтобы пользователь знал, что он отключен - что-то вроде следующего:

A SWT text field with greyed suffix not accessible by the user

Во время поиска яЯ видел некоторые решения с использованием средства форматирования маски от Swing, которые могли бы добиться цели, но я надеюсь, что с SWT может быть что-то по умолчанию.Любые предложения о том, как заставить это работать?

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

Есть предложения?

1 Ответ

3 голосов
/ 01 апреля 2019

Один из вариантов - сгруппировать виджеты Text и Label в один состав и установить для текста на Label желаемый суффикс:

enter image description here

Область слева от суффикса представляет собой однострочное текстовое поле, которое можно редактировать, а суффикс отключен Label.


public class TextWithSuffixExample {

    public class TextWithSuffix {

        public TextWithSuffix(final Composite parent) {
            // The border gives the appearance of a single component
            final Composite baseComposite = new Composite(parent, SWT.BORDER);
            baseComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
            final GridLayout baseCompositeGridLayout = new GridLayout(2, false);
            baseCompositeGridLayout.marginHeight = 0;
            baseCompositeGridLayout.marginWidth = 0;
            baseComposite.setLayout(baseCompositeGridLayout);

            // You can set the background color and force it on 
            // the children (the Text and Label objects) to add 
            // to the illusion of a single component
            baseComposite.setBackground(new Color(parent.getDisplay(), new RGB(255, 255, 255)));
            baseComposite.setBackgroundMode(SWT.INHERIT_FORCE);

            final Text text = new Text(baseComposite, SWT.SINGLE | SWT.RIGHT);
            text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

            final Label label = new Label(baseComposite, SWT.NONE);
            label.setEnabled(false);
            label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, true));
            label.setText("kg/m^3");
        }

    }

    final Display display;
    final Shell shell;

    public TextWithSuffixExample() {
        display = new Display();
        shell = new Shell(display);
        shell.setLayout(new GridLayout());
        shell.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        new TextWithSuffix(shell);
    }

    public void run() {
        shell.setSize(200, 100);
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        display.dispose();
    }

    public static void main(final String[] args) {
        new TextWithSuffixExample().run();
    }

}
...