Создание Java GUI в Swing для ввода формы - PullRequest
3 голосов
/ 05 мая 2009

Что ж, я просмотрел весь интернет и просто не смог найти ответ на этот вопрос, поэтому, возможно, кто-то сможет дать некоторую информацию.

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

Итак, вот моя проблема. Попытка сделать GUI со всеми текстовыми полями и всем на удивление болезненно. Поскольку каждый виджет немного отличается, получение ввода после заполнения формы, похоже, требует отдельной ссылки для каждого виджета, поэтому я могу вызывать их по отдельности. Это означает, что каждая панель для раздела имеет 6-10 различных приватных полей. (Я попытался добавить все похожие виджеты в список и вызвать их в цикле, но это не сработало.)

Кажется, что веб-форма в некотором роде подойдет для этого лучше, но у меня нет инфраструктуры для этого. Кто-нибудь там нашел лучшее решение, чем это для чего-то подобного? Это похоже на тонну кода. Пожалуйста, см. Ниже для идеи (я вставил некоторые комментарии, а не фактический код, потому что это так долго). Спасибо за внимание!

    private JComboBox my_dates;
    private JTextField my_date1;
    private JTextField my_date2;
    private JTextField my_request_date;
    private JTextField my_new_legal_name;
    private JTextField my_new_pref_name;
    private JTextField my_new_username;
    private JTextField my_prev_legal_name;
    private JTextField my_prev_pref_name;
    private JTextField my_prev_username;
    private JTextField my_emp_id;
    private JTextField my_manager;
    private JTextField my_auth_requestor;
    private JTextField my_auth_phone;

    public NameChangePanel(FormSection the_section)
    {
        super();
        initialize();
        buildPanel(the_section.getFields());
    }

    private void initialize()
    {
        // Create all the widgets individuall
    }

    private void buildPanel(List the_fields)
    {
        // add a field label
        // add a component
        // repeat for all values
    }

    public List getFormValues()
    {
        // Call all of the private fields individually
        return values;
    }
}

Ответы [ 7 ]

5 голосов
/ 05 мая 2009

Ванильные качели многословны - никаких аргументов нет. В основном, для такого рода вещей я в конечном итоге полагаюсь на кучу домашних утилит / фабричных методов, таких как createTextBox (), которые параметризованы для общего использования и выполнят 3-8 необходимых операторов.

Иногда я даже буду параметризировать макет. Я склонен сводить все макеты к GridBagLayout (другие делают BorderLayout и т. Д .; это просто вопрос личных предпочтений), а затем создавать методы, которые помещают элемент управления в определенную точку сетки.

Если вы не пользуетесь Интернетом, я бы просто использовал Swing. Это может быть многословно, но это не так уж сложно для простой формы.

3 голосов
/ 06 мая 2009

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

Вы упомянули, что пытались использовать список. Однако я не понимаю, как это вообще сэкономит вам время (или, как я уже говорил, раньше, сколько времени вы сэкономите на реализации, вы потеряете в процессе отладки). Я предполагаю, что головные боли начинаются, когда вы начинаете проверять правильность ввода ваших JTextFields. Я бы предложил разделить JTextField на классы MoneyTextField, PhoneNumberTextField и т. Д., Которые можно использовать для настройки ActionListener, чтобы люди не делали глупостей.

1 голос
/ 31 августа 2010

Вы можете посмотреть на мою попытку решить эту проблему: http://code.google.com/p/swing-formbuilder/

1 голос
/ 05 мая 2009

если вы любите приключения, вы можете попробовать сделать это с помощью гриффона. Griffon - это среда построения графического интерфейса, которая упрощает сборку графического интерфейса за счет автоматизации повторяющихся частей. См. http://griffon.codehaus.org/ для более подробной информации.

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

1 голос
/ 05 мая 2009

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

Другой вариант может заключаться в том, чтобы развернуть свою собственную структуру представления, которая, в зависимости от того, насколько сложным она вам нужна, не так уж сложна и забавна. Просто используйте отражение, чтобы вытащить поля из объекта и перевести эти поля в виджеты и обратно. Обязательно используйте менеджер макетов, чтобы выполнить большую часть тяжелой работы за вас.

Да, в целом, графический интерфейс не является сильной стороной Java, но вы должны найти, что он достаточно хорош.

0 голосов
/ 05 мая 2009

Я бы создал эту форму из файла XML, что-то вроде

<form name="MyForm" package="com.nowhere.swing">
 <field component="javax.swing.JTextField" label="Enter your Name" pattern="[a-z]+" name="name"/>
 <field component="javax.swing.JTextArea" label="Enter your Comment" pattern="[a-z]+" name="comment"/>
</form>

и затем, используя XSLT , я бы сгенерировал Java-код для Pojo и для Swing интерфейс с использованием этого определения.

class MyFormPojo
 {
 private String name;
 private String comment;
 (...)
 } 

class MyFormPane extends JPanel
 {
 JTextField field4name;
  JTextArea field4comment;
 (...)
 MyFormPane()
   {
   (...)
   field4name= new JTextField();
   (.. create labels, etc...)
   }
 }
0 голосов
/ 05 мая 2009

Взгляните на BetterBeansBinding . Это инструмент, который позволяет легко связывать различные свойства JavaBean между объектами. Вы должны настроить объект, который содержит запрос, и связать свойства этого объекта с различными компонентами графического интерфейса. Когда вы закончите, просто верните связанный объект, и он должен заполнить все поля.

Обратите внимание, что я на самом деле не использовал это раньше, но я видел эту концепцию и делал подобные вещи до ее выпуска.

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