Самоописание классов Java / Groovy для создания элементов пользовательского интерфейса - PullRequest
1 голос
/ 09 февраля 2012

Я хотел бы описать ожидаемые входные данные класса Java, предназначенного для выполнения определенной задачи, в самом классе Java. Цель состоит в том, чтобы иметь возможность генерировать пользовательский интерфейс, непосредственно загружающий этот класс.

Например, предполагая, что базовый интерфейс равен Task (реализует Runnable):

public class BuildRectangleTask implements Task {
    public void setLength(double val) { /* ... */ }
    public void setWidth(double val) { /* ... */ }
    public void run() { /* Build a rectangle */ }
}

Я мог бы использовать некоторое отражение, чтобы получить имена параметров из этого, а затем построить соответствующая часть пользовательского интерфейса из этого, например:

<form>
    <label for="length">Length: </label>
         <input type="text"name="length" id="length" /><br />
    <label for="width">Width: </label>
         <input type="text"name="width" id="width" />
</form>

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

Я собираюсь использовать аннотации для описания этого:

@Description(text="This tasks builds a rectangle")
public class BuildRectangleTask implements Task {
    @Input(label="Length", optional=false)
    public void setLength(double val) { /* ... */ }

    @Input(label="Width", optional=true, default=10,
           help="This is the width of the rectangle")
    public void setWidth(double val) { /* ... */ }

    public void run() { /* Build a rectangle */ }
}

Это также будет полезно для дополнительной информации, например, для нескольких вариантов:

@Input(label="Colour", options={"Red", "Green", "Blue"})

Я также хотел бы иметь возможность создавать другие типы пользовательских интерфейсов, например, командную строку, стиль get-opt, подобный этому, на основе информации:

java TaskProcessor BuildRectangle --help

usage: BuildRectangle --height= [ --width=10 ] [ --color= ]
Options:
    --height=   ...
    --width=    This is the width of the rectangle (defaults to 10).
    --color=    Red, Blue, Green.

Существует ли какой-либо стандартный набор аннотаций или обычная структура для достижения этого (или, возможно, другой подход), предпочтительно совместимые с Java и Groovy?

Мне бы хотелось, чтобы класс был как можно более автономным (т.е. избегать файлов конфигурации). (Мне не обязательно определять, каким будет результат такой задачи и как она должен отображаться.)

Ответы [ 2 ]

1 голос
/ 13 февраля 2012

Вы можете попробовать http://today.java.net/pub/a/today/2008/06/24/automatic-user-interface-with-openxava.html, это то, что вы хотите сделать, но, вероятно, неправильная структура!Может быть, немного излишним.

1 голос
/ 09 февраля 2012

Возможно, вы захотите взглянуть на javabuilders .Он во многом совпадает с вашими идеями.В частности, он позволяет декларативно указывать макет пользовательского интерфейса и автоматически связывать данные из пользовательского интерфейса с объектами Java.

...