nifty_gui_java_layout.html 54 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width,initial-scale=1">
  6. <title>Laying Out the GUI in Java :: jMonkeyEngine Docs</title>
  7. <link rel="canonical" href="https://wiki.jmonkeyengine.org/docs/jme3/advanced/nifty_gui_java_layout.html">
  8. <meta name="keywords" content="gui, documentation, nifty, hud">
  9. <meta name="generator" content="Antora 2.3.3">
  10. <link rel="stylesheet" href="../../../_/css/site.css">
  11. <meta property="og:image" content="https://wiki.jmonkeyengine.org/_/img/iconx128.png">
  12. <meta property="og:description" content="Laying Out the GUI in Java">
  13. <meta property="og:title" content="jMonkeyEngine Docs">
  14. <link rel="stylesheet" href="../../../_/css/site-extra.css">
  15. <link rel="stylesheet" href="../../../_/css/vendor/docsearch.min.css">
  16. <!-- fetched from https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.css -->
  17. <link rel="icon" href="../../../_/img/favicon.ico" type="image/x-icon">
  18. </head>
  19. <body class="article">
  20. <header class="header">
  21. <nav class="navbar">
  22. <div class="navbar-brand">
  23. <a class="navbar-item" href="https://wiki.jmonkeyengine.org">
  24. <img alt="" src="../../../_/img/jme-logo.png" height="32" type="image/x-icon">
  25. </a>
  26. <div class="navbar-item hide-for-print">
  27. <input id="search-input" type="text" placeholder="Search docs">
  28. </div>
  29. <button class="navbar-burger" data-target="topbar-nav">
  30. <span></span>
  31. <span></span>
  32. <span></span>
  33. </button>
  34. </div>
  35. <div id="topbar-nav" class="navbar-menu">
  36. <div class="navbar-end">
  37. <div class="navbar-item theme-switch-wrapper">
  38. <label class="theme-switch" for="checkbox">
  39. <input type="checkbox" id="checkbox" />
  40. <div class="slider round"></div>
  41. </label>
  42. </div>
  43. <a class="navbar-item" href="https://github.com/jmonkeyengine/wiki">Github</a>
  44. </div>
  45. </div>
  46. </nav>
  47. </header>
  48. <div class="body">
  49. <div class="nav-container" data-component="docs" data-version="master">
  50. <aside class="nav">
  51. <div class="panels">
  52. <div class="nav-panel-menu is-active" data-panel="menu">
  53. <nav class="nav-menu">
  54. <h3 class="title"><a href="../../documentation.html">Docs</a></h3>
  55. <ul class="nav-list">
  56. <li class="nav-item" data-depth="0">
  57. <ul class="nav-list">
  58. <li class="nav-item" data-depth="1">
  59. <a class="nav-link" href="../../documentation.html">Getting Started</a>
  60. </li>
  61. <li class="nav-item" data-depth="1">
  62. <a class="nav-link" href="https://javadoc.jmonkeyengine.org/v3.3.2-stable">JavaDoc</a>
  63. </li>
  64. <li class="nav-item" data-depth="1">
  65. <button class="nav-item-toggle"></button>
  66. <a class="nav-link" href="../../jme3.html">jMonkeyEngine 3</a>
  67. <ul class="nav-list">
  68. <li class="nav-item" data-depth="2">
  69. <button class="nav-item-toggle"></button>
  70. <span class="nav-text">Intermediate Tutorials</span>
  71. <ul class="nav-list">
  72. <li class="nav-item" data-depth="3">
  73. <button class="nav-item-toggle"></button>
  74. <span class="nav-text">Concepts</span>
  75. <ul class="nav-list">
  76. <li class="nav-item" data-depth="4">
  77. <a class="nav-link" href="../intermediate/best_practices.html">Best Practices</a>
  78. </li>
  79. <li class="nav-item" data-depth="4">
  80. <a class="nav-link" href="../intermediate/simpleapplication.html">Simple Application</a>
  81. </li>
  82. <li class="nav-item" data-depth="4">
  83. <a class="nav-link" href="../features.html">Features</a>
  84. </li>
  85. <li class="nav-item" data-depth="4">
  86. <a class="nav-link" href="../intermediate/optimization.html">Optimization</a>
  87. </li>
  88. <li class="nav-item" data-depth="4">
  89. <a class="nav-link" href="../faq.html">FAQ</a>
  90. </li>
  91. </ul>
  92. </li>
  93. <li class="nav-item" data-depth="3">
  94. <button class="nav-item-toggle"></button>
  95. <span class="nav-text">Math Concepts</span>
  96. <ul class="nav-list">
  97. <li class="nav-item" data-depth="4">
  98. <a class="nav-link" href="../math_for_dummies.html">Math For Dummies</a>
  99. </li>
  100. <li class="nav-item" data-depth="4">
  101. <a class="nav-link" href="../intermediate/math.html">Math</a>
  102. </li>
  103. <li class="nav-item" data-depth="4">
  104. <a class="nav-link" href="../math.html">More Math</a>
  105. </li>
  106. <li class="nav-item" data-depth="4">
  107. <a class="nav-link" href="../rotate.html">Rotate</a>
  108. </li>
  109. <li class="nav-item" data-depth="4">
  110. <a class="nav-link" href="../math_video_tutorials.html">Math Video Tutorials</a>
  111. </li>
  112. </ul>
  113. </li>
  114. <li class="nav-item" data-depth="3">
  115. <button class="nav-item-toggle"></button>
  116. <span class="nav-text">3D Graphics Concepts</span>
  117. <ul class="nav-list">
  118. <li class="nav-item" data-depth="4">
  119. <a class="nav-link" href="../intermediate/multi-media_asset_pipeline.html">Multi-Media Asset Pipeline</a>
  120. </li>
  121. <li class="nav-item" data-depth="4">
  122. <a class="nav-link" href="../scenegraph_for_dummies.html">Scenegraph for Dummies</a>
  123. </li>
  124. <li class="nav-item" data-depth="4">
  125. <a class="nav-link" href="../../tutorials/beginner/hellovector.html">Hello Vector</a>
  126. </li>
  127. <li class="nav-item" data-depth="4">
  128. <a class="nav-link" href="../terminology.html">Terminology</a>
  129. </li>
  130. <li class="nav-item" data-depth="4">
  131. <a class="nav-link" href="../intermediate/how_to_use_materials.html">How to Use Materials</a>
  132. </li>
  133. <li class="nav-item" data-depth="4">
  134. <a class="nav-link" href="../intermediate/transparency_sorting.html">Transparency and Sorting</a>
  135. </li>
  136. <li class="nav-item" data-depth="4">
  137. <a class="nav-link" href="../external/blender.html">Importing from Blender</a>
  138. </li>
  139. <li class="nav-item" data-depth="4">
  140. <a class="nav-link" href="../external/3dsmax.html">Importing from 3DS Max</a>
  141. </li>
  142. </ul>
  143. </li>
  144. </ul>
  145. </li>
  146. </ul>
  147. </li>
  148. <li class="nav-item" data-depth="1">
  149. <a class="nav-link" href="../../logo.html">Logo Usage</a>
  150. </li>
  151. <li class="nav-item" data-depth="1">
  152. <a class="nav-link" href="../../bsd_license.html">License</a>
  153. </li>
  154. <li class="nav-item" data-depth="1">
  155. <a class="nav-link" href="../../github_tips.html">Github Tips</a>
  156. </li>
  157. </ul>
  158. </li>
  159. <li class="nav-item" data-depth="0">
  160. <ul class="nav-list">
  161. <li class="nav-item" data-depth="1">
  162. <button class="nav-item-toggle"></button>
  163. <span class="nav-text">Tutorials</span>
  164. <ul class="nav-list">
  165. <li class="nav-item" data-depth="2">
  166. <button class="nav-item-toggle"></button>
  167. <a class="nav-link" href="../../tutorials/beginner/beginner.html">Beginner tutorials</a>
  168. <ul class="nav-list">
  169. <li class="nav-item" data-depth="3">
  170. <a class="nav-link" href="../../tutorials/beginner/hello_simpleapplication.html">Hello SimpleApplication</a>
  171. </li>
  172. <li class="nav-item" data-depth="3">
  173. <a class="nav-link" href="../../tutorials/beginner/hello_node.html">Hello Node</a>
  174. </li>
  175. <li class="nav-item" data-depth="3">
  176. <a class="nav-link" href="../../tutorials/beginner/hello_asset.html">Hello Asset</a>
  177. </li>
  178. <li class="nav-item" data-depth="3">
  179. <a class="nav-link" href="../../tutorials/beginner/hello_main_event_loop.html">Hello Update Loop</a>
  180. </li>
  181. <li class="nav-item" data-depth="3">
  182. <a class="nav-link" href="../../tutorials/beginner/hello_input_system.html">Hello Input System</a>
  183. </li>
  184. <li class="nav-item" data-depth="3">
  185. <a class="nav-link" href="../../tutorials/beginner/hello_material.html">Hello Material</a>
  186. </li>
  187. <li class="nav-item" data-depth="3">
  188. <a class="nav-link" href="../../tutorials/beginner/hello_animation.html">Hello Animation</a>
  189. </li>
  190. <li class="nav-item" data-depth="3">
  191. <a class="nav-link" href="../../tutorials/beginner/hello_picking.html">Hello Picking</a>
  192. </li>
  193. <li class="nav-item" data-depth="3">
  194. <a class="nav-link" href="../../tutorials/beginner/hello_collision.html">Hello Collision</a>
  195. </li>
  196. <li class="nav-item" data-depth="3">
  197. <a class="nav-link" href="../../tutorials/beginner/hello_terrain.html">Hello Terrain</a>
  198. </li>
  199. <li class="nav-item" data-depth="3">
  200. <a class="nav-link" href="../../tutorials/beginner/hello_audio.html">Hello Audio</a>
  201. </li>
  202. <li class="nav-item" data-depth="3">
  203. <a class="nav-link" href="../../tutorials/beginner/hello_effects.html">Hello Effects</a>
  204. </li>
  205. <li class="nav-item" data-depth="3">
  206. <a class="nav-link" href="../../tutorials/beginner/hello_physics.html">Hello Physics</a>
  207. </li>
  208. </ul>
  209. </li>
  210. </ul>
  211. </li>
  212. </ul>
  213. </li>
  214. <li class="nav-item" data-depth="0">
  215. <ul class="nav-list">
  216. <li class="nav-item" data-depth="1">
  217. <button class="nav-item-toggle"></button>
  218. <a class="nav-link" href="../../sdk/sdk.html">SDK</a>
  219. <ul class="nav-list">
  220. <li class="nav-item" data-depth="2">
  221. <button class="nav-item-toggle"></button>
  222. <span class="nav-text">Video Tutorials</span>
  223. <ul class="nav-list">
  224. <li class="nav-item" data-depth="3">
  225. <button class="nav-item-toggle"></button>
  226. <span class="nav-text">SDK Use Case Tutorials</span>
  227. <ul class="nav-list">
  228. <li class="nav-item" data-depth="4">
  229. <a class="nav-link" href="http://www.youtube.com/watch?v=-OzRZscLlHY">Demo 1 (Quixote demo)</a>
  230. </li>
  231. <li class="nav-item" data-depth="4">
  232. <a class="nav-link" href="http://www.youtube.com/watch?v=6-YWxD3JByE">Demo 2 (Models and Materials)</a>
  233. </li>
  234. </ul>
  235. </li>
  236. <li class="nav-item" data-depth="3">
  237. <button class="nav-item-toggle"></button>
  238. <span class="nav-text">SDK Tutorials</span>
  239. <ul class="nav-list">
  240. <li class="nav-item" data-depth="4">
  241. <a class="nav-link" href="http://www.youtube.com/watch?v=M1_0pbeyJzI">Basics</a>
  242. </li>
  243. <li class="nav-item" data-depth="4">
  244. <a class="nav-link" href="http://www.youtube.com/watch?v=nL7woH40i5c">Importing Models</a>
  245. </li>
  246. <li class="nav-item" data-depth="4">
  247. <a class="nav-link" href="http://www.youtube.com/watch?v=DUmgAjiNzhY">Dragging&amp;Dropping Nodes</a>
  248. </li>
  249. <li class="nav-item" data-depth="4">
  250. <a class="nav-link" href="http://www.youtube.com/watch?v=ntPAmtsQ6eM">Scene Composing</a>
  251. </li>
  252. <li class="nav-item" data-depth="4">
  253. <a class="nav-link" href="http://www.youtube.com/watch?v=zgPV3W6dD4s">Terrain with Collision Shape</a>
  254. </li>
  255. <li class="nav-item" data-depth="4">
  256. <a class="nav-link" href="http://www.youtube.com/watch?v=Feu3-mrpolc">Working with Materials</a>
  257. </li>
  258. <li class="nav-item" data-depth="4">
  259. <a class="nav-link" href="http://www.youtube.com/watch?v=MNDiZ9YHIpM">Custom Controls</a>
  260. </li>
  261. <li class="nav-item" data-depth="4">
  262. <a class="nav-link" href="http://www.youtube.com/watch?v=oZnssg8TBWQ">WebStart Deployment</a>
  263. </li>
  264. <li class="nav-item" data-depth="4">
  265. <a class="nav-link" href="http://www.youtube.com/watch?v=D7JM4VMKqPc">Animation and Effect TrackEditing</a>
  266. </li>
  267. </ul>
  268. </li>
  269. </ul>
  270. </li>
  271. <li class="nav-item" data-depth="2">
  272. <button class="nav-item-toggle"></button>
  273. <span class="nav-text">Getting Started</span>
  274. <ul class="nav-list">
  275. <li class="nav-item" data-depth="3">
  276. <a class="nav-link" href="../../sdk/update_center.html">Updating jMonkeyEngine SDK</a>
  277. </li>
  278. <li class="nav-item" data-depth="3">
  279. <a class="nav-link" href="../../sdk/troubleshooting.html">Troubleshooting</a>
  280. </li>
  281. </ul>
  282. </li>
  283. <li class="nav-item" data-depth="2">
  284. <button class="nav-item-toggle"></button>
  285. <span class="nav-text">Java Development Features</span>
  286. <ul class="nav-list">
  287. <li class="nav-item" data-depth="3">
  288. <a class="nav-link" href="../../sdk/project_creation.html">Project Creation</a>
  289. </li>
  290. <li class="nav-item" data-depth="3">
  291. <a class="nav-link" href="../../sdk/code_editor.html">Code Editor and Palette</a>
  292. </li>
  293. <li class="nav-item" data-depth="3">
  294. <a class="nav-link" href="../../sdk/version_control.html">File Version Control</a>
  295. </li>
  296. <li class="nav-item" data-depth="3">
  297. <a class="nav-link" href="../../sdk/debugging_profiling_testing.html">Debug, Profile, Test</a>
  298. </li>
  299. <li class="nav-item" data-depth="3">
  300. <button class="nav-item-toggle"></button>
  301. <a class="nav-link" href="../../sdk/application_deployment.html">Application Deployment</a>
  302. <ul class="nav-list">
  303. <li class="nav-item" data-depth="4">
  304. <a class="nav-link" href="../../sdk/default_build_script.html">Default Build Script</a>
  305. </li>
  306. <li class="nav-item" data-depth="4">
  307. <a class="nav-link" href="../../sdk/android.html">Android</a>
  308. </li>
  309. <li class="nav-item" data-depth="4">
  310. <a class="nav-link" href="../../sdk/android_cheat_sheet.html">Android Cheat Sheet</a>
  311. </li>
  312. <li class="nav-item" data-depth="4">
  313. <a class="nav-link" href="../../sdk/ios.html">iOS</a>
  314. </li>
  315. </ul>
  316. </li>
  317. </ul>
  318. </li>
  319. <li class="nav-item" data-depth="2">
  320. <button class="nav-item-toggle"></button>
  321. <span class="nav-text">Unique Features</span>
  322. <ul class="nav-list">
  323. <li class="nav-item" data-depth="3">
  324. <button class="nav-item-toggle"></button>
  325. <a class="nav-link" href="../../sdk/model_loader_and_viewer.html">Import, View, Convert Models</a>
  326. <ul class="nav-list">
  327. <li class="nav-item" data-depth="4">
  328. <a class="nav-link" href="../../sdk/asset_packs.html">Asset Packs</a>
  329. </li>
  330. </ul>
  331. </li>
  332. <li class="nav-item" data-depth="3">
  333. <a class="nav-link" href="../../sdk/scene_explorer.html">The SceneExplorer</a>
  334. </li>
  335. <li class="nav-item" data-depth="3">
  336. <a class="nav-link" href="../../sdk/scene_composer.html">Composing a Scene</a>
  337. </li>
  338. <li class="nav-item" data-depth="3">
  339. <a class="nav-link" href="../../sdk/terrain_editor.html">Terrain Editor</a>
  340. </li>
  341. <li class="nav-item" data-depth="3">
  342. <a class="nav-link" href="../../sdk/sample_code.html">Sample Code</a>
  343. </li>
  344. <li class="nav-item" data-depth="3">
  345. <a class="nav-link" href="../../sdk/material_editing.html">Material Editing</a>
  346. </li>
  347. <li class="nav-item" data-depth="3">
  348. <a class="nav-link" href="../../sdk/font_creation.html">Creating Bitmap Fonts</a>
  349. </li>
  350. <li class="nav-item" data-depth="3">
  351. <button class="nav-item-toggle"></button>
  352. <a class="nav-link" href="https://hub.jmonkeyengine.org/t/effecttrack-and-audiotrack-editing-in-the-sdk/23378">Audio and Effect Track Editing</a>
  353. <ul class="nav-list">
  354. <li class="nav-item" data-depth="4">
  355. <a class="nav-link" href="https://www.youtube.com/watch?v=D7JM4VMKqPc">Video: Effect and AudioTrack editing in jMonkeyEngine 3 sdk</a>
  356. </li>
  357. </ul>
  358. </li>
  359. <li class="nav-item" data-depth="3">
  360. <a class="nav-link" href="../../sdk/filters.html">Post-Processor Filter Editor and Viewer</a>
  361. </li>
  362. <li class="nav-item" data-depth="3">
  363. <a class="nav-link" href="application_states.html">Application States</a>
  364. </li>
  365. <li class="nav-item" data-depth="3">
  366. <a class="nav-link" href="custom_controls.html">Custom Controls</a>
  367. </li>
  368. <li class="nav-item" data-depth="3">
  369. <a class="nav-link" href="../../sdk/vehicle_creator.html">Vehicle Creator</a>
  370. </li>
  371. </ul>
  372. </li>
  373. <li class="nav-item" data-depth="2">
  374. <button class="nav-item-toggle"></button>
  375. <span class="nav-text">Advanced Usage</span>
  376. <ul class="nav-list">
  377. <li class="nav-item" data-depth="3">
  378. <a class="nav-link" href="../../sdk/build_platform.html">Building jMonkeyEngine SDK</a>
  379. </li>
  380. <li class="nav-item" data-depth="3">
  381. <a class="nav-link" href="../../sdk/use_own_jme.html#.adoc">Using your own (modified) version of jME3 in jMonkeyEngine SDK</a>
  382. </li>
  383. <li class="nav-item" data-depth="3">
  384. <a class="nav-link" href="../../sdk/increasing_heap_memory.html">Increasing Heap Memory</a>
  385. </li>
  386. <li class="nav-item" data-depth="3">
  387. <a class="nav-link" href="../../sdk/log_files.html">Log Files</a>
  388. </li>
  389. </ul>
  390. </li>
  391. <li class="nav-item" data-depth="2">
  392. <button class="nav-item-toggle"></button>
  393. <span class="nav-text">Available external plugins</span>
  394. <ul class="nav-list">
  395. <li class="nav-item" data-depth="3">
  396. <a class="nav-link" href="../contributions.html">Contributions</a>
  397. </li>
  398. <li class="nav-item" data-depth="3">
  399. <a class="nav-link" href="../../sdk/neotexture.html">Neo Texture Editor for procedural textures</a>
  400. </li>
  401. <li class="nav-item" data-depth="3">
  402. <a class="nav-link" href="http://www.youtube.com/watch?v=yS9a9o4WzL8">Video: Mesh Tool &amp; Physics Editor</a>
  403. </li>
  404. </ul>
  405. </li>
  406. <li class="nav-item" data-depth="2">
  407. <button class="nav-item-toggle"></button>
  408. <a class="nav-link" href="../../sdk/development.html">Developing plugins for jMonkeyEngine SDK</a>
  409. <ul class="nav-list">
  410. <li class="nav-item" data-depth="3">
  411. <a class="nav-link" href="../../sdk/development/setup.html">Creating a plugin</a>
  412. </li>
  413. <li class="nav-item" data-depth="3">
  414. <a class="nav-link" href="../../sdk/development/general.html">Creating components</a>
  415. </li>
  416. <li class="nav-item" data-depth="3">
  417. <a class="nav-link" href="../../sdk/development/scene.html">The Main Scene</a>
  418. </li>
  419. <li class="nav-item" data-depth="3">
  420. <a class="nav-link" href="../../sdk/development/sceneexplorer.html">The Scene Explorer</a>
  421. </li>
  422. <li class="nav-item" data-depth="3">
  423. <a class="nav-link" href="../../sdk/development/projects_assets.html">Projects and Assets</a>
  424. </li>
  425. <li class="nav-item" data-depth="3">
  426. <a class="nav-link" href="../../sdk/development/extension_library.html">Create a library plugin from a jar file</a>
  427. </li>
  428. <li class="nav-item" data-depth="3">
  429. <a class="nav-link" href="../../sdk/development/model_loader.html">Create a new or custom model filetype and loader</a>
  430. </li>
  431. </ul>
  432. </li>
  433. </ul>
  434. </li>
  435. </ul>
  436. </li>
  437. </ul>
  438. </nav>
  439. </div>
  440. <div class="nav-panel-explore" data-panel="explore">
  441. <div class="context">
  442. <span class="title">Docs</span>
  443. <span class="version">master</span>
  444. </div>
  445. <ul class="components">
  446. <li class="component is-current">
  447. <span class="title">Docs</span>
  448. <ul class="versions">
  449. <li class="version is-current is-latest">
  450. <a href="../../documentation.html">master</a>
  451. </li>
  452. </ul>
  453. </li>
  454. <li class="component">
  455. <span class="title">Wiki UI</span>
  456. <ul class="versions">
  457. <li class="version is-latest">
  458. <a href="../../../wiki-ui/index.html">master</a>
  459. </li>
  460. </ul>
  461. </li>
  462. </ul>
  463. </div>
  464. </div>
  465. </aside>
  466. </div>
  467. <main class="article">
  468. <div class="toolbar" role="navigation">
  469. <button class="nav-toggle"></button>
  470. <nav class="breadcrumbs" aria-label="breadcrumbs">
  471. <ul>
  472. <li><a href="../../documentation.html">Docs</a></li>
  473. <li><a href="nifty_gui_java_layout.html">Laying Out the GUI in Java</a></li>
  474. </ul>
  475. </nav>
  476. <div class="edit-this-page"><a href="https://github.com/jMonkeyEngine/wiki/edit/master/docs/modules/ROOT/pages/jme3/advanced/nifty_gui_java_layout.adoc">Edit this Page</a></div>
  477. </div>
  478. <div class="content">
  479. <article class="doc">
  480. <h1 class="page">Laying Out the GUI in Java</h1>
  481. <div id="preamble">
  482. <div class="sectionbody">
  483. <div class="olist arabic">
  484. <ol class="arabic">
  485. <li>
  486. <p><a href="nifty_gui.html" class="page">Nifty GUI Concepts</a></p>
  487. </li>
  488. <li>
  489. <p><a href="nifty_gui_best_practices.html" class="page">Nifty GUI Best Practices</a></p>
  490. </li>
  491. <li>
  492. <p><a href="nifty_gui_xml_layout.html" class="page">Nifty GUI XML Layout</a> or <strong>Nifty <abbr title="Graphical User Interface">GUI</abbr> Java Layout</strong></p>
  493. </li>
  494. <li>
  495. <p><a href="nifty_gui_overlay.html" class="page">Nifty GUI Overlay</a> or <a href="nifty_gui_projection.html" class="page">Nifty GUI Projection</a></p>
  496. </li>
  497. <li>
  498. <p><a href="nifty_gui_java_interaction.html" class="page">Interact with the GUI from Java</a></p>
  499. </li>
  500. </ol>
  501. </div>
  502. <div class="paragraph">
  503. <p>You can &#8220;draw&#8221; the <abbr title="Graphical User Interface">GUI</abbr> to the screen by writing Java code – alternatively to using XML. Typically you lay out the static base <abbr title="Graphical User Interface">GUI</abbr> in XML, and use Java commands if you need to change the <abbr title="Graphical User Interface">GUI</abbr> dynamically at runtime. In theory, you can also lay out the whole <abbr title="Graphical User Interface">GUI</abbr> in Java (but we don&#8217;t cover that here).</p>
  504. </div>
  505. </div>
  506. </div>
  507. <div class="sect1">
  508. <h2 id="sample-code"><a class="anchor" href="#sample-code"></a>Sample Code</h2>
  509. <div class="sectionbody">
  510. <div class="paragraph">
  511. <p>Sample project</p>
  512. </div>
  513. <div class="ulist">
  514. <ul>
  515. <li>
  516. <p><strong>Original Source Code:</strong> <a href="https://github.com/nifty-gui/nifty-gui/tree/1.4/nifty-examples/src/main/java/de/lessvoid/nifty/examples/defaultcontrols">/nifty-examples/src/main/java/de/lessvoid/nifty/examples/defaultcontrols/</a>.</p>
  517. </li>
  518. </ul>
  519. </div>
  520. <div class="paragraph">
  521. <p>Just so you get a quick picture what Nifty <abbr title="Graphical User Interface">GUI</abbr>'s Java Syntax looks like, here is the most basic example. It creates a screen with a layer and a panel that contains a button.</p>
  522. </div>
  523. <div class="listingblock">
  524. <div class="content">
  525. <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">package mygame;
  526. import com.jme3.app.Application;
  527. import com.jme3.app.SimpleApplication;
  528. import com.jme3.app.state.BaseAppState;
  529. import com.jme3.niftygui.NiftyJmeDisplay;
  530. import de.lessvoid.nifty.Nifty;
  531. import de.lessvoid.nifty.builder.LayerBuilder;
  532. import de.lessvoid.nifty.builder.PanelBuilder;
  533. import de.lessvoid.nifty.builder.ScreenBuilder;
  534. import de.lessvoid.nifty.controls.button.builder.ButtonBuilder;
  535. import de.lessvoid.nifty.screen.DefaultScreenController;
  536. public class MyStartScreen extends BaseAppState {
  537. @Override
  538. protected void initialize(Application app) {
  539. //It is technically safe to do all initialization and cleanup in the
  540. //onEnable()/onDisable() methods. Choosing to use initialize() and
  541. //cleanup() for this is a matter of performance specifics for the
  542. //implementor.
  543. //TODO: initialize your AppState, e.g. attach spatials to rootNode
  544. }
  545. @Override
  546. protected void cleanup(Application app) {
  547. //TODO: clean up what you initialized in the initialize method,
  548. //e.g. remove all spatials from rootNode
  549. }
  550. //onEnable()/onDisable() can be used for managing things that should
  551. //only exist while the state is enabled. Prime examples would be scene
  552. //graph attachment or input listener attachment.
  553. @Override
  554. protected void onEnable() {
  555. NiftyJmeDisplay niftyDisplay = NiftyJmeDisplay.newNiftyJmeDisplay(
  556. getApplication().getAssetManager(),
  557. getApplication().getInputManager(),
  558. getApplication().getAudioRenderer(),
  559. getApplication().getGuiViewPort());
  560. Nifty nifty = niftyDisplay.getNifty();
  561. getApplication().getGuiViewPort().addProcessor(niftyDisplay);
  562. ((SimpleApplication) getApplication()).getFlyByCamera().setDragToRotate(true);
  563. nifty.loadStyleFile("nifty-default-styles.xml");
  564. nifty.loadControlFile("nifty-default-controls.xml");
  565. // &lt;screen&gt;
  566. nifty.addScreen("Screen_ID", new ScreenBuilder("Hello Nifty Screen"){{
  567. controller(new DefaultScreenController()); // Screen properties
  568. // &lt;layer&gt;
  569. layer(new LayerBuilder("Layer_ID") {{
  570. childLayoutVertical(); // layer properties, add more...
  571. // &lt;panel&gt;
  572. panel(new PanelBuilder("Panel_ID") {{
  573. childLayoutCenter(); // panel properties, add more...
  574. // GUI elements
  575. control(new ButtonBuilder("Button_ID", "Hello Nifty"){{
  576. alignCenter();
  577. valignCenter();
  578. height("5%");
  579. width("15%");
  580. }});
  581. //.. add more GUI elements here
  582. }});
  583. // &lt;/panel&gt;
  584. }});
  585. // &lt;/layer&gt;
  586. }}.build(nifty));
  587. // &lt;/screen&gt;
  588. nifty.gotoScreen("Screen_ID"); // start the screen
  589. }
  590. @Override
  591. protected void onDisable() {
  592. //Called when the state was previously enabled but is now disabled
  593. //either because setEnabled(false) was called or the state is being
  594. //cleaned up.
  595. }
  596. @Override
  597. public void update(float tpf) {
  598. //TODO: implement behavior during runtime
  599. }
  600. }</code></pre>
  601. </div>
  602. </div>
  603. </div>
  604. </div>
  605. <div class="sect1">
  606. <h2 id="implement-your-gui-layout"><a class="anchor" href="#implement-your-gui-layout"></a>Implement Your GUI Layout</h2>
  607. <div class="sectionbody">
  608. <div class="imageblock text-left">
  609. <div class="content">
  610. <img src="../../_images/jme3/advanced/gui-layout-draft.png" alt="gui-layout-draft.png" width="" height="">
  611. </div>
  612. </div>
  613. <div class="paragraph">
  614. <p>In this tutorial, you recreate the same screen as in the <a href="nifty_gui_xml_layout.html" class="page">Laying out the GUI in XML</a> example.</p>
  615. </div>
  616. <div class="paragraph">
  617. <p>Create an Screen.Java file that extends BaseAppState in the mygame directory of your project. One Java file can contain several, or even all screens. As a reminder: Nifty displays one screen at a time; a screen contains several layers on top of one another; each layer contains panels that are embedded into another; the panels contain the actual content (text, images, or controls).</p>
  618. </div>
  619. <div class="paragraph">
  620. <p>Next, setup your Nifty display.</p>
  621. </div>
  622. <div class="listingblock">
  623. <div class="content">
  624. <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">NiftyJmeDisplay niftyDisplay = NiftyJmeDisplay.newNiftyJmeDisplay(
  625. getApplication().getAssetManager(),
  626. getApplication().getInputManager(),
  627. getApplication().getAudioRenderer(),
  628. getApplication().getGuiViewPort());
  629. Nifty nifty = niftyDisplay.getNifty();
  630. getApplication().getGuiViewPort().addProcessor(niftyDisplay);
  631. ((SimpleApplication) getApplication()).getFlyByCamera().setDragToRotate(true);
  632. nifty.loadStyleFile("nifty-default-styles.xml");
  633. nifty.loadControlFile("nifty-default-controls.xml");
  634. // &lt;!-- ... --&gt;
  635. nifty.gotoScreen("start"); // start the screen</code></pre>
  636. </div>
  637. </div>
  638. <div class="sect2">
  639. <h3 id="make-screens"><a class="anchor" href="#make-screens"></a>Make Screens</h3>
  640. <div class="paragraph">
  641. <p>The following minimal Java file contains a start screen and a HUD screen. (Neither has been defined yet.)</p>
  642. </div>
  643. <div class="listingblock">
  644. <div class="content">
  645. <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">nifty.addScreen("start", new ScreenBuilder("start") {{
  646. controller(new DefaultScreenController());
  647. // &lt;!-- ... --&gt;
  648. }}.build(nifty));
  649. nifty.addScreen("hud", new ScreenBuilder("hud") {{
  650. controller(new DefaultScreenController());
  651. // &lt;!-- ... --&gt;
  652. }}.build(nifty));</code></pre>
  653. </div>
  654. </div>
  655. <div class="paragraph">
  656. <p>Every Nifty <abbr title="Graphical User Interface">GUI</abbr> must have a start screen. The others (in this example, the HUD screen) are optional.</p>
  657. </div>
  658. </div>
  659. <div class="sect2">
  660. <h3 id="make-layers"><a class="anchor" href="#make-layers"></a>Make Layers</h3>
  661. <div class="paragraph">
  662. <p>The following Java code shows how we add layers to the start screen and HUD screen. Add the following to your <code>Screen.java</code> file:</p>
  663. </div>
  664. <div class="listingblock">
  665. <div class="content">
  666. <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">nifty.addScreen("start", new ScreenBuilder("start") {{
  667. controller(new DefaultScreenController());
  668. // layer added
  669. layer(new LayerBuilder("background") {{
  670. childLayoutCenter();
  671. backgroundColor("#000f");
  672. // &lt;!-- ... --&gt;
  673. }});
  674. layer(new LayerBuilder("foreground") {{
  675. childLayoutVertical();
  676. backgroundColor("#0000");
  677. // &lt;!-- ... --&gt;
  678. }});
  679. // layer added
  680. }}.build(nifty));</code></pre>
  681. </div>
  682. </div>
  683. <div class="paragraph">
  684. <p>Repeat the same, but use</p>
  685. </div>
  686. <div class="listingblock">
  687. <div class="content">
  688. <pre class="highlightjs highlight"><code>nifty.addScreen("hud", new ScreenBuilder("hud"){{</code></pre>
  689. </div>
  690. </div>
  691. <div class="paragraph">
  692. <p>for the HUD screen.</p>
  693. </div>
  694. <div class="paragraph">
  695. <p>In a layer, you can now add panels and arrange them. Panels are containers that mark the areas where you want to display text, images, or controls (buttons etc) later.</p>
  696. </div>
  697. </div>
  698. <div class="sect2">
  699. <h3 id="make-panels"><a class="anchor" href="#make-panels"></a>Make Panels</h3>
  700. <div class="paragraph">
  701. <p>A panel is the inner-most container (that will contain the actual content: text, images, or controls). You place panels inside layers. The following panels go into in the <code>start</code> screen <code>foreground</code> layer:</p>
  702. </div>
  703. <div class="listingblock">
  704. <div class="content">
  705. <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">nifty.addScreen("start", new ScreenBuilder("start") {{
  706. controller(new DefaultScreenController());
  707. // layer added
  708. layer(new LayerBuilder("background") {{
  709. childLayoutCenter();
  710. backgroundColor("#000f");
  711. // &lt;!-- ... --&gt;
  712. }});
  713. layer(new LayerBuilder("foreground") {{
  714. childLayoutVertical();
  715. backgroundColor("#0000");
  716. // panel added
  717. panel(new PanelBuilder("panel_top") {{
  718. childLayoutCenter();
  719. alignCenter();
  720. backgroundColor("#f008");
  721. height("25%");
  722. width("75%");
  723. }});
  724. panel(new PanelBuilder("panel_mid") {{
  725. childLayoutCenter();
  726. alignCenter();
  727. backgroundColor("#0f08");
  728. height("50%");
  729. width("75%");
  730. }});
  731. panel(new PanelBuilder("panel_bottom") {{
  732. childLayoutHorizontal();
  733. alignCenter();
  734. backgroundColor("#00f8");
  735. height("25%");
  736. width("75%");
  737. panel(new PanelBuilder("panel_bottom_left") {{
  738. childLayoutCenter();
  739. valignCenter();
  740. backgroundColor("#44f8");
  741. height("50%");
  742. width("50%");
  743. }});
  744. panel(new PanelBuilder("panel_bottom_right") {{
  745. childLayoutCenter();
  746. valignCenter();
  747. backgroundColor("#88f8");
  748. height("50%");
  749. width("50%");
  750. }});
  751. }}); // panel added
  752. }});
  753. // layer added
  754. }}.build(nifty));</code></pre>
  755. </div>
  756. </div>
  757. <div class="paragraph">
  758. <p>The following panels go into in the <code>hud</code> screen:</p>
  759. </div>
  760. <div class="listingblock">
  761. <div class="content">
  762. <pre class="highlightjs highlight"><code class="language-Java hljs" data-lang="Java">nifty.addScreen("hud", new ScreenBuilder("hud") {{
  763. controller(new DefaultScreenController());
  764. layer(new LayerBuilder("background") {{
  765. childLayoutCenter();
  766. backgroundColor("#000f");
  767. // &lt;!-- ... --&gt;
  768. }});
  769. layer(new LayerBuilder("foreground") {{
  770. childLayoutHorizontal();
  771. backgroundColor("#0000");
  772. // panel added
  773. panel(new PanelBuilder("panel_left") {{
  774. childLayoutVertical();
  775. backgroundColor("#0f08");
  776. height("100%");
  777. width("80%");
  778. // &lt;!-- spacer --&gt;
  779. }});
  780. panel(new PanelBuilder("panel_right") {{
  781. childLayoutVertical();
  782. backgroundColor("#00f8");
  783. height("100%");
  784. width("20%");
  785. panel(new PanelBuilder("panel_top_right1") {{
  786. childLayoutCenter();
  787. backgroundColor("#00f8");
  788. height("15%");
  789. width("100%");
  790. }});
  791. panel(new PanelBuilder("panel_top_right2") {{
  792. childLayoutCenter();
  793. backgroundColor("#44f8");
  794. height("15%");
  795. width("100%");
  796. }});
  797. panel(new PanelBuilder("panel_bot_right") {{
  798. childLayoutCenter();
  799. valignCenter();
  800. backgroundColor("#88f8");
  801. height("70%");
  802. width("100%");
  803. }});
  804. }}); // panel added
  805. }});
  806. }}.build(nifty));</code></pre>
  807. </div>
  808. </div>
  809. <div class="paragraph">
  810. <p>Try the sample. Remember to activate a screen using <code>nifty.gotoScreen("start");</code> or <code>hud</code> respectively.
  811. The result should look as follows:</p>
  812. </div>
  813. <div class="imageblock text-center">
  814. <div class="content">
  815. <img src="../../_images/jme3/advanced/nifty-gui-panels.png" alt="nifty-gui-panels.png" width="" height="">
  816. </div>
  817. </div>
  818. </div>
  819. </div>
  820. </div>
  821. <div class="sect1">
  822. <h2 id="adding-content-to-panels"><a class="anchor" href="#adding-content-to-panels"></a>Adding Content to Panels</h2>
  823. <div class="sectionbody">
  824. <div class="paragraph">
  825. <p>See also <a href="https://github.com/nifty-gui/nifty-gui/raw/1.4/nifty-core/manual/nifty-gui-the-manual-1.3.2.pdf">Nifty GUI - the Manual: Layouts</a> on the Nifty <abbr title="Graphical User Interface">GUI</abbr> site.</p>
  826. </div>
  827. <div class="sect2">
  828. <h3 id="add-images"><a class="anchor" href="#add-images"></a>Add Images</h3>
  829. <div class="paragraph">
  830. <p>The <code>start-background.png</code> image is a fullscreen background picture. In the <code>start</code> screen, add the following image element:</p>
  831. </div>
  832. <div class="listingblock">
  833. <div class="content">
  834. <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">nifty.addScreen("start", new ScreenBuilder("start") {{
  835. controller(new DefaultScreenController());
  836. // layer added
  837. layer(new LayerBuilder("background") {{
  838. childLayoutCenter();
  839. backgroundColor("#000f");
  840. // add image
  841. image(new ImageBuilder() {{
  842. filename("Interface/start-background.png");
  843. }});
  844. }});
  845. // &lt;!-- ... --&gt;
  846. }}.build(nifty));</code></pre>
  847. </div>
  848. </div>
  849. <div class="paragraph">
  850. <p>The <code>hud-frame.png</code> image is a transparent frame that we use as HUD decoration. In the <code>hud</code> screen, add the following image element:</p>
  851. </div>
  852. <div class="listingblock">
  853. <div class="content">
  854. <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">nifty.addScreen("hud", new ScreenBuilder("hud") {{
  855. controller(new DefaultScreenController());
  856. layer(new LayerBuilder("background") {{
  857. childLayoutCenter();
  858. backgroundColor("#000f");
  859. // add image
  860. image(new ImageBuilder() {{
  861. filename("Interface/hud-frame.png");
  862. }});
  863. }});
  864. // &lt;!-- ... --&gt;
  865. }}.build(nifty));</code></pre>
  866. </div>
  867. </div>
  868. <div class="paragraph">
  869. <p>The <code>face1.png</code> image is an image that you want to use as a status icon.
  870. In the <code>hud</code> screens <code>foreground</code> layer, add the following image element:</p>
  871. </div>
  872. <div class="listingblock">
  873. <div class="content">
  874. <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">panel(new PanelBuilder("panel_top_right2") {{
  875. childLayoutCenter();
  876. backgroundColor("#44f8");
  877. height("15%");
  878. width("100%");
  879. // add image
  880. image(new ImageBuilder() {{
  881. filename("Interface/face1.png");
  882. valignCenter();
  883. alignCenter();
  884. height("50%");
  885. width("30%");
  886. }});
  887. }});</code></pre>
  888. </div>
  889. </div>
  890. <div class="paragraph">
  891. <p>This image is scaled to use 50% of the height and 30% of the width of its container.</p>
  892. </div>
  893. </div>
  894. <div class="sect2">
  895. <h3 id="add-static-text"><a class="anchor" href="#add-static-text"></a>Add Static Text</h3>
  896. <div class="paragraph">
  897. <p>The game title is a typical example of static text. In the <code>start</code> screen <code>foreground</code> layer, add the following text element:</p>
  898. </div>
  899. <div class="listingblock">
  900. <div class="content">
  901. <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">// panel added
  902. panel(new PanelBuilder("panel_top") {{
  903. childLayoutCenter();
  904. alignCenter();
  905. backgroundColor("#f008");
  906. height("25%");
  907. width("75%");
  908. text(new TextBuilder() {{
  909. text("My Cool Game");
  910. font("Interface/Fonts/Default.fnt");
  911. height("100%");
  912. width("100%");
  913. }});
  914. }});</code></pre>
  915. </div>
  916. </div>
  917. <div class="paragraph">
  918. <p>For longer pieces of static text, such as an introduction, you can use <code>wrap="true"</code>. Setting <code>wrap="true"</code> will only work when you set a width for the text element, so that Nifty knows when to wrap a line. Add the following text element to the <code>Start</code> screen <code>foreground</code> layer:</p>
  919. </div>
  920. <div class="listingblock">
  921. <div class="content">
  922. <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">panel(new PanelBuilder("panel_mid") {{
  923. childLayoutCenter();
  924. alignCenter();
  925. backgroundColor("#0f08");
  926. height("50%");
  927. width("75%");
  928. // add text
  929. text(new TextBuilder() {{
  930. text("Here goes some text describing the game and the rules and stuff. "
  931. + "Incidentally, the text is quite long and needs to wrap at the end of lines.");
  932. font("Interface/Fonts/Default.fnt");
  933. wrap(true);
  934. height("100%");
  935. width("100%");
  936. }});
  937. }});</code></pre>
  938. </div>
  939. </div>
  940. <div class="paragraph">
  941. <p>The font used is jME3&#8217;s default font &#8220;Interface/Fonts/Default.fnt&#8221; which is included in the jMonkeyEngine.JAR. You can add your own fonts to your own <code>assets/Interface</code> directory. Set your font to the one you created during the start of the <a href="nifty_gui_xml_layout.html#implement-your-gui-layout#" class="page">Gui Implementation</a> phase of your game.</p>
  942. </div>
  943. </div>
  944. <div class="sect2">
  945. <h3 id="add-controls"><a class="anchor" href="#add-controls"></a>Add Controls</h3>
  946. <div class="paragraph">
  947. <p>Before you can use any control, you must load a Control Definition first. Thats why we add the following two lines <em>before</em> the screen definitions:</p>
  948. </div>
  949. <div class="listingblock">
  950. <div class="content">
  951. <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">nifty.loadStyleFile("nifty-default-styles.xml");
  952. nifty.loadControlFile("nifty-default-controls.xml");</code></pre>
  953. </div>
  954. </div>
  955. <div class="sect3">
  956. <h4 id="label-control"><a class="anchor" href="#label-control"></a>Label Control</h4>
  957. <div class="paragraph">
  958. <p>Use label controls for text that you want to edit dynamically from Java. One example for this is the score display.
  959. In the <code>hud</code> screen&#8217;s <code>foreground</code> layer, add the following text element:</p>
  960. </div>
  961. <div class="listingblock">
  962. <div class="content">
  963. <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">panel(new PanelBuilder("panel_top_right1") {{
  964. childLayoutCenter();
  965. backgroundColor("#00f8");
  966. height("15%");
  967. width("100%");
  968. control(new LabelBuilder(){{
  969. color("#000");
  970. text("123");
  971. width("100%");
  972. height("100%");
  973. }});
  974. }});</code></pre>
  975. </div>
  976. </div>
  977. <div class="paragraph">
  978. <p>Note that the width and height do not scale the bitmap font, but make indirectly certain it is centered. If you want a different size for the font, you need to provide an extra bitmap font (they come with fixes sizes and don&#8217;t scale well).</p>
  979. </div>
  980. </div>
  981. <div class="sect3">
  982. <h4 id="button-control"><a class="anchor" href="#button-control"></a>Button Control</h4>
  983. <div class="paragraph">
  984. <p>Our <abbr title="Graphical User Interface">GUI</abbr> plan asks for two buttons on the start screen. You add the Start and Quit buttons to the bottom panel of the <code>start</code> screen using the <code>&lt;control&gt;</code> element:</p>
  985. </div>
  986. <div class="listingblock">
  987. <div class="content">
  988. <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">panel(new PanelBuilder("panel_bottom_left") {{
  989. childLayoutCenter();
  990. valignCenter();
  991. backgroundColor("#44f8");
  992. height("50%");
  993. width("50%");
  994. // add control
  995. control(new ButtonBuilder("StartButton", "Start") {{
  996. alignCenter();
  997. valignCenter();
  998. height("50%");
  999. width("50%");
  1000. }});
  1001. }});
  1002. panel(new PanelBuilder("panel_bottom_right") {{
  1003. childLayoutCenter();
  1004. valignCenter();
  1005. backgroundColor("#88f8");
  1006. height("50%");
  1007. width("50%");
  1008. // add control
  1009. control(new ButtonBuilder("QuitButton", "Quit") {{
  1010. alignCenter();
  1011. valignCenter();
  1012. height("50%");
  1013. width("50%");
  1014. }});
  1015. }});</code></pre>
  1016. </div>
  1017. </div>
  1018. <div class="paragraph">
  1019. <p>Note that these controls don&#8217;t do anything yet – we&#8217;ll get to that soon.</p>
  1020. </div>
  1021. </div>
  1022. <div class="sect3">
  1023. <h4 id="other-controls"><a class="anchor" href="#other-controls"></a>Other Controls</h4>
  1024. <div class="paragraph">
  1025. <p>Nifty additionally offers many customizable controls such as check boxes, text fields, menus, chats, tabs, …</p>
  1026. </div>
  1027. <div class="paragraph">
  1028. <p>See also:</p>
  1029. </div>
  1030. <div class="ulist">
  1031. <ul>
  1032. <li>
  1033. <p><a href="https://github.com/nifty-gui/nifty-gui/raw/1.4/nifty-core/manual/nifty-gui-the-manual-1.3.2.pdf">Nifty GUI - the Manual: Elements</a></p>
  1034. </li>
  1035. <li>
  1036. <p><a href="https://github.com/nifty-gui/nifty-gui/wiki/Controls">Controls</a></p>
  1037. </li>
  1038. </ul>
  1039. </div>
  1040. </div>
  1041. </div>
  1042. </div>
  1043. </div>
  1044. <div class="sect1">
  1045. <h2 id="intermediate-result"><a class="anchor" href="#intermediate-result"></a>Intermediate Result</h2>
  1046. <div class="sectionbody">
  1047. <div class="paragraph">
  1048. <p>When you preview this code in the jMonkeyEngine SDK, our tutorial demo should looks as follows: A start screen with two buttons, and a game screen with a simple HUD frame and a blue cube (which stands for any jME3 game content).</p>
  1049. </div>
  1050. <div class="admonitionblock tip">
  1051. <table>
  1052. <tr>
  1053. <td class="icon">
  1054. <i class="fa icon-tip" title="Tip"></i>
  1055. </td>
  1056. <td class="content">
  1057. Remove all lines that set background colors, you only needed them to see the arrangement.
  1058. </td>
  1059. </tr>
  1060. </table>
  1061. </div>
  1062. <div class="imageblock text-center">
  1063. <div class="content">
  1064. <img src="../../_images/jme3/advanced/nifty-gui-simple-demo.png" alt="nifty-gui-simple-demo.png" width="" height="">
  1065. </div>
  1066. </div>
  1067. <div class="paragraph">
  1068. <p>Your <code>Screen.java</code> file should look like this:</p>
  1069. </div>
  1070. <div class="listingblock">
  1071. <div class="content">
  1072. <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">package mygame;
  1073. import com.jme3.app.Application;
  1074. import com.jme3.app.SimpleApplication;
  1075. import com.jme3.app.state.BaseAppState;
  1076. import com.jme3.niftygui.NiftyJmeDisplay;
  1077. import de.lessvoid.nifty.Nifty;
  1078. import de.lessvoid.nifty.builder.ImageBuilder;
  1079. import de.lessvoid.nifty.builder.LayerBuilder;
  1080. import de.lessvoid.nifty.builder.PanelBuilder;
  1081. import de.lessvoid.nifty.builder.ScreenBuilder;
  1082. import de.lessvoid.nifty.builder.TextBuilder;
  1083. import de.lessvoid.nifty.controls.button.builder.ButtonBuilder;
  1084. import de.lessvoid.nifty.controls.label.builder.LabelBuilder;
  1085. import de.lessvoid.nifty.screen.DefaultScreenController;
  1086. public class Screen extends BaseAppState {
  1087. @Override
  1088. protected void initialize(Application app) {
  1089. //It is technically safe to do all initialization and cleanup in the
  1090. //onEnable()/onDisable() methods. Choosing to use initialize() and
  1091. //cleanup() for this is a matter of performance specifics for the
  1092. //implementor.
  1093. //TODO: initialize your AppState, e.g. attach spatials to rootNode
  1094. }
  1095. @Override
  1096. protected void cleanup(Application app) {
  1097. //TODO: clean up what you initialized in the initialize method,
  1098. //e.g. remove all spatials from rootNode
  1099. }
  1100. //onEnable()/onDisable() can be used for managing things that should
  1101. //only exist while the state is enabled. Prime examples would be scene
  1102. //graph attachment or input listener attachment.
  1103. @Override
  1104. protected void onEnable() {
  1105. NiftyJmeDisplay niftyDisplay = NiftyJmeDisplay.newNiftyJmeDisplay(
  1106. getApplication().getAssetManager(),
  1107. getApplication().getInputManager(),
  1108. getApplication().getAudioRenderer(),
  1109. getApplication().getGuiViewPort());
  1110. Nifty nifty = niftyDisplay.getNifty();
  1111. getApplication().getGuiViewPort().addProcessor(niftyDisplay);
  1112. ((SimpleApplication) getApplication()).getFlyByCamera().setDragToRotate(true);
  1113. nifty.loadStyleFile("nifty-default-styles.xml");
  1114. nifty.loadControlFile("nifty-default-controls.xml");
  1115. nifty.addScreen("start", new ScreenBuilder("start") {{
  1116. controller(new DefaultScreenController());
  1117. // layer added
  1118. layer(new LayerBuilder("background") {{
  1119. childLayoutCenter();
  1120. // backgroundColor("#000f");
  1121. // add image
  1122. image(new ImageBuilder() {{
  1123. filename("Interface/start-background.png");
  1124. }});
  1125. }});
  1126. layer(new LayerBuilder("foreground") {{
  1127. childLayoutVertical();
  1128. // backgroundColor("#0000");
  1129. // panel added
  1130. panel(new PanelBuilder("panel_top") {{
  1131. childLayoutCenter();
  1132. alignCenter();
  1133. // backgroundColor("#f008");
  1134. height("25%");
  1135. width("75%");
  1136. text(new TextBuilder() {{
  1137. text("My Cool Game");
  1138. font("Interface/Fonts/Arial.fnt");
  1139. height("100%");
  1140. width("100%");
  1141. }});
  1142. }});
  1143. panel(new PanelBuilder("panel_mid") {{
  1144. childLayoutCenter();
  1145. alignCenter();
  1146. // backgroundColor("#0f08");
  1147. height("50%");
  1148. width("75%");
  1149. // add text
  1150. text(new TextBuilder() {{
  1151. text("Here goes some text describing the game and the rules and stuff. "
  1152. + "Incidentally, the text is quite long and needs to wrap at the end of lines. ");
  1153. font("Interface/Fonts/Arial.fnt");
  1154. wrap(true);
  1155. height("100%");
  1156. width("100%");
  1157. }});
  1158. }});
  1159. panel(new PanelBuilder("panel_bottom") {{
  1160. childLayoutHorizontal();
  1161. alignCenter();
  1162. // backgroundColor("#00f8");
  1163. height("25%");
  1164. width("75%");
  1165. panel(new PanelBuilder("panel_bottom_left") {{
  1166. childLayoutCenter();
  1167. valignCenter();
  1168. // backgroundColor("#44f8");
  1169. height("50%");
  1170. width("50%");
  1171. // add control
  1172. control(new ButtonBuilder("StartButton", "Start") {{
  1173. alignCenter();
  1174. valignCenter();
  1175. height("50%");
  1176. width("50%");
  1177. }});
  1178. }});
  1179. panel(new PanelBuilder("panel_bottom_right") {{
  1180. childLayoutCenter();
  1181. valignCenter();
  1182. // backgroundColor("#88f8");
  1183. height("50%");
  1184. width("50%");
  1185. // add control
  1186. control(new ButtonBuilder("QuitButton", "Quit") {{
  1187. alignCenter();
  1188. valignCenter();
  1189. height("50%");
  1190. width("50%");
  1191. }});
  1192. }});
  1193. }}); // panel added
  1194. }});
  1195. // layer added
  1196. }}.build(nifty));
  1197. nifty.addScreen("hud", new ScreenBuilder("hud") {{
  1198. controller(new DefaultScreenController());
  1199. layer(new LayerBuilder("background") {{
  1200. childLayoutCenter();
  1201. // backgroundColor("#000f");
  1202. // add image
  1203. image(new ImageBuilder() {{
  1204. filename("Interface/hud-frame.png");
  1205. }});
  1206. }});
  1207. layer(new LayerBuilder("foreground") {{
  1208. childLayoutHorizontal();
  1209. // backgroundColor("#0000");
  1210. // panel added
  1211. panel(new PanelBuilder("panel_left") {{
  1212. childLayoutVertical();
  1213. // backgroundColor("#0f08");
  1214. height("100%");
  1215. width("80%");
  1216. // &lt;!-- spacer --&gt;
  1217. }});
  1218. panel(new PanelBuilder("panel_right") {{
  1219. childLayoutVertical();
  1220. // backgroundColor("#00f8");
  1221. height("100%");
  1222. width("20%");
  1223. panel(new PanelBuilder("panel_top_right1") {{
  1224. childLayoutCenter();
  1225. // backgroundColor("#00f8");
  1226. height("15%");
  1227. width("100%");
  1228. control(new LabelBuilder(){{
  1229. color("#000");
  1230. text("123");
  1231. width("100%");
  1232. height("100%");
  1233. }});
  1234. }});
  1235. panel(new PanelBuilder("panel_top_right2") {{
  1236. childLayoutCenter();
  1237. // backgroundColor("#44f8");
  1238. height("15%");
  1239. width("100%");
  1240. // add image
  1241. image(new ImageBuilder() {{
  1242. filename("Interface/face1.png");
  1243. valignCenter();
  1244. alignCenter();
  1245. height("50%");
  1246. width("30%");
  1247. }});
  1248. }});
  1249. panel(new PanelBuilder("panel_bot_right") {{
  1250. childLayoutCenter();
  1251. valignCenter();
  1252. // backgroundColor("#88f8");
  1253. height("70%");
  1254. width("100%");
  1255. }});
  1256. }}); // panel added
  1257. }});
  1258. }}.build(nifty));
  1259. nifty.gotoScreen("hud"); // start the screen
  1260. }
  1261. @Override
  1262. protected void onDisable() {
  1263. //Called when the state was previously enabled but is now disabled
  1264. //either because setEnabled(false) was called or the state is being
  1265. //cleaned up.
  1266. }
  1267. @Override
  1268. public void update(float tpf) {
  1269. //TODO: implement behavior during runtime
  1270. }
  1271. }</code></pre>
  1272. </div>
  1273. </div>
  1274. </div>
  1275. </div>
  1276. <div class="sect1">
  1277. <h2 id="nifty-java-settings"><a class="anchor" href="#nifty-java-settings"></a>Nifty Java Settings</h2>
  1278. <div class="sectionbody">
  1279. <div class="paragraph">
  1280. <p>Before initializing the nifty screens, you set up properties and register media.</p>
  1281. </div>
  1282. <table class="tableblock frame-all grid-all stretch">
  1283. <colgroup>
  1284. <col style="width: 50%;">
  1285. <col style="width: 50%;">
  1286. </colgroup>
  1287. <thead>
  1288. <tr>
  1289. <th class="tableblock halign-left valign-top">Nifty Method</th>
  1290. <th class="tableblock halign-left valign-top">Description</th>
  1291. </tr>
  1292. </thead>
  1293. <tbody>
  1294. <tr>
  1295. <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
  1296. <p>registerSound("mysound", "Interface/abc.wav");</p>
  1297. </div></div></td>
  1298. <td class="tableblock halign-left valign-top"><div class="content"></div></td>
  1299. </tr>
  1300. <tr>
  1301. <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
  1302. <p>registerMusic("mymusic", "Interface/xyz.ogg");</p>
  1303. </div></div></td>
  1304. <td class="tableblock halign-left valign-top"><div class="content"></div></td>
  1305. </tr>
  1306. <tr>
  1307. <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
  1308. <p>registerMouseCursor("mypointer", "Interface/abc.png", 5, 4);</p>
  1309. </div></div></td>
  1310. <td class="tableblock halign-left valign-top"><div class="content"></div></td>
  1311. </tr>
  1312. <tr>
  1313. <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
  1314. <p>registerEffect(?);</p>
  1315. </div></div></td>
  1316. <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
  1317. <p>?</p>
  1318. </div></div></td>
  1319. </tr>
  1320. <tr>
  1321. <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
  1322. <p>setDebugOptionPanelColors(true);</p>
  1323. </div></div></td>
  1324. <td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
  1325. <p>Highlight all panels, makes it easier to arrange them.</p>
  1326. </div></div></td>
  1327. </tr>
  1328. </tbody>
  1329. </table>
  1330. <div class="paragraph">
  1331. <p>Example:</p>
  1332. </div>
  1333. <div class="listingblock">
  1334. <div class="content">
  1335. <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">nifty.registerMouseCursor("hand", "Interface/mouse-cursor-hand.png", 5, 4);</code></pre>
  1336. </div>
  1337. </div>
  1338. </div>
  1339. </div>
  1340. <div class="sect1">
  1341. <h2 id="next-steps"><a class="anchor" href="#next-steps"></a>Next Steps</h2>
  1342. <div class="sectionbody">
  1343. <div class="paragraph">
  1344. <p>Integrate the <abbr title="Graphical User Interface">GUI</abbr> into the game. Typically, you will overlay the <abbr title="Graphical User Interface">GUI</abbr>.</p>
  1345. </div>
  1346. <div class="ulist">
  1347. <ul>
  1348. <li>
  1349. <p><a href="nifty_gui_overlay.html" class="page">Nifty GUI Overlay</a> (recommended)</p>
  1350. </li>
  1351. <li>
  1352. <p><a href="nifty_gui_projection.html" class="page">Nifty GUI Projection</a> (optional)</p>
  1353. </li>
  1354. </ul>
  1355. </div>
  1356. </div>
  1357. </div>
  1358. </article>
  1359. <aside class="toc sidebar" data-title="Contents" data-levels="2">
  1360. <div class="toc-menu"></div>
  1361. </aside>
  1362. </div>
  1363. </main>
  1364. </div>
  1365. <footer class="footer">
  1366. <p>Copyright 2020 jMonkeyEngine Wiki Contributors. Licensed BSD-3.</p>
  1367. </footer>
  1368. <script src="../../../_/js/vendor/docsearch.min.js"></script>
  1369. <!-- fetched from https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.js -->
  1370. <script>
  1371. var search = docsearch({
  1372. apiKey: 'a736b6d93de805e26ec2f49b55013fbd',
  1373. indexName: 'jmonkeyengine',
  1374. inputSelector: '#search-input',
  1375. autocompleteOptions: { hint: false, keyboardShortcuts: ['s'] },
  1376. algoliaOptions: { hitsPerPage: 10 }
  1377. }).autocomplete
  1378. search.on('autocomplete:closed', function () { search.autocomplete.setVal() })
  1379. function focusSearchInput () { document.querySelector('#search-input').focus() }
  1380. if (document.querySelector('.home-link.is-current')) window.addEventListener('load', focusSearchInput)
  1381. </script>
  1382. <script src="../../../_/js/site.js"></script>
  1383. <script async src="../../../_/js/vendor/highlight.js"></script>
  1384. </body>
  1385. </html>