White Fish
White Fish

Reputation: 119

How to create a SWT text field with inactive text as a suffix?

I am using Java's SWT toolkit to create a GUI with text field inputs. These input fields require numerical input and have units assigned to them. I'm trying to create a fancy way to integrate units within the field as a fixed suffix to the text, such that the user can only edit the numerical part. I'd also like for the suffix to be greyed out so the user knows it is disabled - something like the following:

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

While searching, I saw some solutions with a mask formatter from Swing that might do the trick, but I'm sort of hoping there might be something default with SWT. Any suggestions on how to make this work?

The field is part of a a matrix, so I can't simply add the units to a header label. I suppose I could create another column after the text field that could provide units as a label, but I'm going for something more intuitive and aesthetic.

Any suggestions?

Upvotes: 0

Views: 741

Answers (1)

avojak
avojak

Reputation: 2360

One option would be to group Text and Label widgets in the same composite, and set the text on the Label to the desired suffix:

enter image description here

The area to the left of the suffix is the single-line text field, which can be edited, and the suffix is a disabled 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();
    }

}

Upvotes: 4

Related Questions