Java против C++ для создания GUI, который имеет бэкэнд C++ [закрыт]

в настоящее время у меня есть бэкэнд C++, который мне нужно подключить с GUI, и поскольку я никогда не строил GUI раньше, я был смущен тем, с чего начать.

Мне удобно писать код на C++ и Java, поэтому я бы предпочел, чтобы мой GUI был на одном из этих языков. Кроме того, GUI должен быть разумно независимым от ОС Windows и Linux (и, надеюсь, следовательно, Macs).

теперь я понимаю, что если я использую Java для этого, мне понадобятся некоторые обертки - но я также слышал (строго секонд-хенд), что писать GUI на C++ - это боль.

Я не хочу переписывать слишком много кода для серверной части на Java (кто делает??) и я надеялся на ввод:

  • предлагает ли любой язык серьезные преимущества/недостатки по сравнению с другим?
  • насколько серьезна проблема с упаковкой и сколько переписывания придет, если я использую Java.
  • есть ли какие-то конкретные ресурсы, которые я должен посмотреть, что люди думают, будет уместно?

спасибо и ура всем :)

11 ответов


вы говорите, что уже знаете C++ и Java, и что вы никогда не делали GUI раньше. Это значит:

  • независимо от того, если вы идете на Java GUI или C++ GUI, вам нужно будет научиться обрабатывать GUI framework
  • Если вы выбрали Java, вам также нужно научиться взаимодействовать между двумя языками

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

вы можете узнать, проще ли писать GUI на Java или делать это на C++. Это зависит от выбранной структуры. Для Java у вас есть AWT и Swing, которые являются частью дистрибутива Java по умолчанию, а затем есть SWT, который используется Eclipse, например. Для C++ существует множество наборов инструментов с Qt, GTK и wxWidgets будучи самыми популярными, и все три поддерживают каждую основную платформу. Большинство из этих" C++ " GUI toolkits также имеют привязку Java или даже порт Java, поэтому вы можете использовать их с Java.

до сих пор я использовал Swing, Qt и несколько других, которые не помогают в вашей ситуации (UI thingy, который пришел с Borland C++ Builder и WinForms на .NET). В принципе, концепции одинаковы для всех этих фреймворков, и я обнаружил, что ни один из них не сложнее или легче другого. Единственный исключение может быть Java, потому что я никогда не заставлял эти LayoutManagers работать, хотя другие наборы инструментов имеют эквиваленты LayoutManagers, которые легко освоить. Но, может быть, это только я.

люди также скажут вам, что Java GUIs всегда уродливы и не подходят для хост-системы. Ну, большинство Java GUIs действительно есть, но IMHO это не из-за Java, а из-за плохого программирования. Требуется две строки кода, чтобы приложение Swing адаптировалось к внешнему виду ОС и большинству программистов просто не вкладывайте достаточно усилий в свои Java GUIs, чтобы скопировать и вставить эти две строки... вы можете себе представить, насколько они заботятся об остальной части своего дизайна GUI.

для вашей текущей ситуации я бы рекомендовал графический интерфейс C++, но если вы знаете, как выглядят ваши будущие планы, и если вы знаете, что будете делать Java GUIs всю оставшуюся жизнь, тогда, вероятно, нормально начать это сейчас и предпринять дополнительные усилия .

и если вы выбрали C++ для GUI, люди расскажут вам все такие вещи тянут тебя в любом направлении. Все три больших портативных фреймворка имеют свои плюсы и минусы, но я не верю, что среди них есть один лучший или худший. Я бы рекомендовал в Qt просто потому, что я уже использовал его, - но если бы я happten нужно использовать GTK или wxWidgets, в, Я бы, наверное, предположить, что.


посмотреть Qt.

по моему опыту общение между двумя разными языковыми средами выполнения всегда сложно. Если у вас есть нетривиальное приложение для создания следующих часто возникают проблемы: -

  • Обработка Ошибок.
  • Управление Памятью.
  • многопоточность и синхронизация Семантика.

кроме увеличения одного уровня косвенности из-за обертки, это требует много думая, как обстоятельства, когда вам нужно передать структуры данных через GUI и бэкэнд и т. д.

: - рассмотрите возможность передачи Java String с GUI для серверной части на C++. По сути, мы должны извлечь символы из Java String объект и сделать их доступными для разработчика C++ без утечки памяти, которая их содержит. Это пример основной проблемы (есть и другие аспекты, такие как кодировка, в которой символы должны быть возвращены).


в зависимости от ваших потребностей, простой веб-интерфейс может быть самым простым, когда у вас нет существующего кода фронтенда. Вставьте крошечный веб-сервер в приложение и откройте браузер на "http://localhost:12345" (или какой порт вы используете).


Я не могу сказать много о соединении Java и C++, но я предлагаю вам взглянуть на Qt. Это библиотека C++ для многих вещей, таких как доступ к файлам и сети, но она наиболее известна разработкой GUI. Он также имеет хорошую IDE, вы можете построить свой графический интерфейс с перетаскиванием. Я бы также сказал, что Qt так же OS-agnostic, как и для библиотек GUI.


написание графического интерфейса на C++ не более болезненно, чем на Java.

существует множество кросс-платформенных библиотек GUI. GTK, gtk--, FoX, WX, etc. Я бы не рекомендовал Qt, так как на самом деле это не C++ (использует расширенную версию языка, требующую специального препроцессора перед компиляцией). Плюс это стоит целое состояние, если вы не хотите отдавать свой продукт.

кстати, это не так, как используется слово "следовательно".


давайте все будем честными здесь. C++ просто нет на карте, когда дело доходит до портативных GUIs.

Java имеет последовательный, портативный, широко используемый, тщательно документированный, зрелый инструментарий GUI. C++ имеет кучу недоделанной ОСС библиотек, которые едва работают, никто по-настоящему портативный, плюс дорогие коммерческие библиотеки, которые не работают по всем целям они утверждают, работать пятнистой на оставшиеся цели, и инверсия управления, так что вы застряли в странных рамках.

Если вам не нужен C++ по другим причинам (которых много), выберите Java для GUI. Перекрестное кодирование тривиально для тех, кто знает оба языка, но оно может стать беспорядочным, поэтому вы захотите минимизировать собственный интерфейс как можно лучше. Мой совет здесь-заключить договор с вашей командой, что вы никогда не будете пытаться удерживать указатели (или ссылки) через интерфейс. Это просто становится более беспорядочным, если вы это делаете, и никакой отладчик не может спасти вас, когда линии запутываются. Вместо этого используйте целочисленные или строковые ключи и передайте их через собственный интерфейс.


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

Я работал с Qt, Swing и SWT и обычно использовал как C++, так и Java-код со всеми этими инструментами. Взаимодействие между языками может добавить дополнительные затраты / риск. Однако иногда эти затраты оправданы с учетом других преимуществ.

Если по какой-либо причине вы выбираете интерфейс Java, посмотрите на JNA и глоток.


Как насчет затмения? Выглядит хорошо и хорошо работает на всех платформах. Я предполагаю, что большая часть eclipse-Java.


Почему вы не изучаете родной C++ GUI, как WINAPI или X11. Затем вы делаете консольное программное обеспечение совместимым с одним из них, таким как winehq, cygwin или другим открытым исходным кодом или эмулируемым программным обеспечением. Поскольку вы никогда не разрабатывали GUI на C++. Не идите на Java, потому что сделайте более загруженный размер в ОЗУ. Если у вас нет большого размера ОЗУ. Eclipse может использовать 500 МБ ОЗУ при запуске без открытия проекта.


  1. Wrapping не переписывает, это просто адаптер, чтобы оба языка встретились. Это прямолинейно
  2. поскольку вы, похоже, не фиксированы на языке, я бы выбрал .NET Gui (с C++ CLR), у вас будет GUI, независимый от машины, и вы можете легко общаться с существующим кодом.

для начинающих WinForms, возможно, проще, но попробуйте использовать WPF, это самый современный вариант для разработки GUI в .NET мир.

Personnally я бы использовал C# / .NET для GUI и использовал DLL-оболочку C++ CLR. Но это не единственное решение.

в Linux лучшей реализацией .NET является MONO. Для всех приложений WinForms, которые я разработал (они не самые сумасшедшие), они работали без изменений. С C++ / Qt вам придется перекомпилировать для каждой целевой ОС.


Не используйте Java для создания GUIs, если независимость платформы не является обязательным. Пользовательский интерфейс будет вялым, а взаимодействие с C++ будет болезненным.

для создания собственного GUI в C++ вы можете использовать GTKmm вместе с библиотекой, такой как Boost или QT. Кроме того, эти библиотеки доступны для большинства платформ (GNU/Linux, Windows, OS X), поэтому ваше приложение можно перекомпилировать в любом месте.

edit: используйте поляна для быстро создание графического интерфейса и заполнение сигнальных слотов кодом C++ в GTKmm.