#java #text #swt
#java #текст #swt
Вопрос:
Я использую SWT toolkit от Java для создания графического интерфейса с вводом текстовых полей. Эти поля ввода требуют числового ввода и имеют присвоенные им единицы измерения. Я пытаюсь создать необычный способ интеграции единиц измерения в поле в качестве фиксированного суффикса к тексту, чтобы пользователь мог редактировать только числовую часть. Я бы также хотел, чтобы суффикс был выделен серым цветом, чтобы пользователь знал, что он отключен — что-то вроде следующего:
Во время поиска я видел некоторые решения с помощью средства форматирования масок из Swing, которые могли бы помочь, но я вроде как надеюсь, что с SWT может быть что-то по умолчанию. Есть предложения о том, как заставить это работать?
Поле является частью матрицы a, поэтому я не могу просто добавить единицы измерения к метке заголовка. Полагаю, я мог бы создать еще один столбец после текстового поля, который мог бы указывать единицы измерения в качестве метки, но я предпочитаю что-то более интуитивное и эстетичное.
Есть предложения?
Ответ №1:
Одним из вариантов было бы сгруппировать Text
и Label
виджеты в одном композите и присвоить тексту на Label
желаемый суффикс:
Область слева от суффикса представляет собой однострочное текстовое поле, которое можно редактировать, а суффикс отключен 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();
}
}
Комментарии:
1. Как насчет пользовательского MaskFormatter? Прошло много времени с тех пор, как я работал с SWT, но у Nebula есть этот форматировщик
2. @LppEdd Извините, я не знаком с MaskFormatter (или вообще с Nebula в целом), поэтому я не смогу вам там сильно помочь…
3. Не проблема. Смотрите здесь, например eclipse.org/nebula/widgets/formattedtext/formattedtext.php
4. Интересно… Это может сработать, хотя на первый взгляд кажется, что это все одно текстовое поле, поэтому я не уверен, как вы сможете получить неизменяемый суффикс, не выполняя дополнительной работы.
5. Вам абсолютно понадобилась бы эта дополнительная работа 😉 Моя была просто подсказкой.