УÑебнÑй кÑÑÑ Ð¿Ð¾ NetBeans CRUD Ð´Ð»Ñ Ð¿Ð»Ð°ÑÑоÑÐ¼Ñ NetBeans
Ð ÑÑом кÑÑÑе опиÑана инÑегÑаÑÐ¸Ñ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ MySQL в пÑиложение NetBeans Platform. ÐнаÑале ÑаÑÑмаÑÑиваеÑÑÑ Ð±Ð°Ð·Ð° даннÑÑ MySQL, Ð´Ð»Ñ ÐºÐ¾ÑоÑой ÑоздаеÑÑÑ ÐºÐ»Ð°ÑÑ ÑÑÑноÑÑей. СледÑÐµÑ Ð¾ÑмеÑиÑÑ, ÑÑо ÑÑи ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¿ÑÐ¸Ð¼ÐµÐ½Ð¸Ð¼Ñ Ð½Ðµ ÑолÑко Ð´Ð»Ñ MySQL. Ðни могÑÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð»Ñ Ð»Ñбой ÑелÑÑионной Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ , поддеÑживаемой ÑÑедой IDE NetBeans. ÐаÑем клаÑÑ ÑÑÑноÑÑей помеÑаеÑÑÑ Ð² оболоÑÐºÑ Ð¼Ð¾Ð´ÑÐ»Ñ Ð½Ð°ÑÑÐ´Ñ Ñ Ð¼Ð¾Ð´ÑлÑми Ð´Ð»Ñ ÑвÑзанного компоненÑа JPA JARS.
ÐоÑле Ñого как модÑли ÑÑановÑÑÑÑ ÑаÑÑÑÑ Ð¿ÑиложениÑ, ÑоздаеÑÑÑ Ð½Ð¾Ð²Ñй модÑлÑ, коÑоÑÑй обеÑпеÑÐ¸Ð²Ð°ÐµÑ Ð¿Ð¾Ð»ÑзоваÑелÑÑкий инÑеÑÑÐµÐ¹Ñ Ð¿ÑиложениÑ. ÐовÑй модÑÐ»Ñ Ð¿ÑедоÑÑавлÑÐµÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð´ÑевовиднÑÑ Ð¸ÐµÑаÑÑ Ð¸Ñ, оÑобÑажаÑÑÑÑ Ð´Ð°Ð½Ð½Ñе из Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ . ÐаÑем ÑоздаеÑÑÑ Ð´ÑÑгой модÑлÑ, позволÑÑÑий полÑзоваÑÐµÐ»Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑ Ð´Ð°Ð½Ð½Ñе, оÑобÑажаемÑе пеÑвÑм модÑлем. ÐÑделение ÑÑедÑÑва пÑоÑмоÑÑа и ÑÑедÑÑва Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² оÑделÑнÑе модÑли позволÑÐµÑ ÑÑÑанавливаÑÑ ÑазлиÑнÑе ÑедакÑоÑÑ Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑÑедÑÑва пÑоÑмоÑÑа, Ñак как ÑазлиÑнÑе ÑедакÑоÑÑ Ð¼Ð¾Ð³ÑÑ ÑоздаваÑÑÑÑ Ð²Ð½ÐµÑними пÑоизводиÑелÑми как на коммеÑÑеÑкой, Ñак и на беÑплаÑной оÑнове. Таким обÑазом, модÑлÑÐ½Ð°Ñ Ð°ÑÑ Ð¸ÑекÑÑÑа плаÑÑоÑÐ¼Ñ NetBeans обеÑпеÑÐ¸Ð²Ð°ÐµÑ Ð³Ð¸Ð±ÐºÐ¾ÑÑÑ.
ÐоÑле ÑÑÑановки ÑедакÑоÑа вÑполнÑеÑÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ðµ ÑÑнкÑий CRUD. ÐеÑвÑй ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ "R" ("Read", ÑÑение) обÑабаÑÑваеÑÑÑ Ð¾Ð¿Ð¸ÑаннÑм вÑÑе ÑÑедÑÑвом пÑоÑмоÑÑа. ÐаÑем вÑполнÑеÑÑÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ "U" ("Update", обновление), заÑем – "C" ("Create", Ñоздание) и "D" ("Delete", Ñдаление).
ÐÑÐ¾Ñ ÐºÑÑÑ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ ÑазлиÑнÑÑ ÑÑнкÑиÑÑ Ð¿Ð»Ð°ÑÑоÑÐ¼Ñ NetBeans, коÑоÑÑе ÑпоÑобÑÑвÑÑÑ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ñиложений Ñакого Ñода. ÐапÑимеÑ, в кÑÑÑе опиÑÐ°Ð½Ñ ÑÑедÑÑва UndoRedo.Manager и ExplorerManager, а Ñакже компоненÑÑ Ð¿Ð»Ð°ÑÑоÑÐ¼Ñ NetBeans Swing, напÑимеÑ, TopComponent и BeanTreeView.
СодеÑжание
- ÐаÑÑÑойка пÑиложениÑ
- ÐнÑегÑаÑÐ¸Ñ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
- Создание клаÑÑов ÑÑÑноÑÑей из Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
- ÐомеÑение Ñайла JAR клаÑÑа ÑÑÑноÑÑей в оболоÑÐºÑ Ð¼Ð¾Ð´ÑлÑ
- Создание дÑÑÐ³Ð¸Ñ ÑвÑзаннÑÑ Ð¼Ð¾Ð´Ñлей
- ÐÑоекÑиÑование полÑзоваÑелÑÑкого инÑеÑÑейÑа
- УÑÑановка завиÑимоÑÑей
- ÐапÑÑк пÑоÑоÑипа
- ÐнÑегÑаÑÐ¸Ñ ÑÑнкÑионалÑноÑÑи CRUD
- СвÑзаннÑе демо-Ñолики
ÐÐ»Ñ ÑабоÑÑ Ñ ÑÑим ÑÑководÑÑвом ÑÑебÑеÑÑÑ Ð¿ÑогÑаммное обеÑпеÑение и ÑеÑÑÑÑÑ, пеÑеÑиÑленнÑе в ÑледÑÑÑей ÑаблиÑе.
| ÐÑогÑаммное обеÑпеÑение или ÑеÑÑÑÑ | ТÑебÑÐµÐ¼Ð°Ñ Ð²ÐµÑÑÐ¸Ñ |
|---|---|
| СÑеда IDE NetBeans | веÑÑÐ¸Ñ 6.5 |
| ÐÐ¾Ð¼Ð¿Ð»ÐµÐºÑ Ð´Ð»Ñ ÑазÑабоÑÑика на ÑзÑке Java (JDK) | ÐеÑÑÐ¸Ñ 6 или веÑÑÐ¸Ñ 5 |
Создаваемое в ÑÑом кÑÑÑе пÑиложение вÑглÑÐ´Ð¸Ñ ÑледÑÑÑим обÑазом:

РекомендÑеÑÑÑ Ð¿ÑоÑмоÑÑеÑÑ ÑеÑÐ¸Ñ Ð´ÐµÐ¼Ð¾-Ñоликов 10 лÑÑÑÐ¸Ñ Ð¸Ð½ÑеÑÑейÑов API NetBeans пеÑед наÑалом ÑабоÑÑ Ñ ÑÑим кÑÑÑом. Ðногие иÑполÑзÑемÑе в ÑÑом кÑÑÑе понÑÑÐ¸Ñ Ð±Ð¾Ð»ÐµÐµ подÑобно ÑаÑÑмаÑÑиваÑÑÑÑ Ð² демо-ÑÐ¾Ð»Ð¸ÐºÐ°Ñ .
ÐаÑÑÑойка пÑиложениÑ
ÐаÑнем Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð»Ð°ÑÑоÑÐ¼Ñ NetBeans.
- ÐÑбеÑиÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ "File > New Project" (Ctrl+Shift+N). Ð Ñазделе "Categories", вÑбеÑиÑе паÑамеÑÑ "NetBeans Modules". Ð Ñазделе "Projects", вÑбеÑиÑе паÑамеÑÑ "NetBeans Platform Application". ÐажмиÑе ÐºÐ½Ð¾Ð¿ÐºÑ "Next".
- Ðа панели "Name and Location" введиÑе ÑекÑÑ DBManager в поле "Project Name". ÐажмиÑе ÐºÐ½Ð¾Ð¿ÐºÑ "Finish".
СÑедой IDE бÑÐ´ÐµÑ Ñоздан пÑÐ¾ÐµÐºÑ DBManager. ÐÑÐ¾ÐµÐºÑ ÑвлÑеÑÑÑ ÐºÐ¾Ð½ÑейнеÑом Ð´Ð»Ñ Ð²ÑÐµÑ Ð¾ÑÑалÑнÑÑ ÑоздаваемÑÑ Ð¼Ð¾Ð´Ñлей.
ÐнÑегÑаÑÐ¸Ñ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
ÐÐ»Ñ Ð¸Ð½ÑегÑаÑии Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ ÑледÑÐµÑ ÑоздаÑÑ ÐºÐ»Ð°ÑÑÑ ÑÑÑноÑÑей из Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¸ инÑегÑиÑоваÑÑ ÑÑи клаÑÑÑ Ð²Ð¼ÐµÑÑе Ñо ÑвÑзаннÑми Ñайлами JAR в модÑли, коÑоÑÑе Ð²Ñ Ð¾Ð´ÑÑ Ð² ÑоÑÑав пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ NetBeans Platform.
Создание клаÑÑов ÑÑÑноÑÑей
Ð ÑÑом Ñазделе вÑполнÑеÑÑÑ Ñоздание клаÑÑов ÑÑÑноÑÑей из вÑбÑанной Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ .
ÐÐ»Ñ ÑÑого пÑимеÑа вÑбеÑиÑе или ÑоздайÑе Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ states, в коÑоÑой ÑÐºÐ°Ð·Ð°Ð½Ñ ÑÑаÑÑ Ð¡Ð¨Ð Ð¸ Ð¸Ñ ÑокÑаÑениÑ.
Ðозможно Ñакже вÑбÑаÑÑ Ð»ÑбÑÑ Ð´ÑÑгÑÑ Ð±Ð°Ð·Ñ Ð¸ пÑимениÑÑ Ð°Ð´Ð°Ð¿ÑиÑоваÑÑ Ð´ÐµÐ¹ÑÑÐ²Ð¸Ñ Ðº конкÑеÑÐ½Ð¾Ð¼Ñ ÑлÑÑаÑ. ÐÐ»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ Ñведений об ÑÑом дейÑÑвии обÑаÑиÑеÑÑ Ðº ÑÐ°Ð·Ð´ÐµÐ»Ñ ÐодклÑÑение к базе даннÑÑ MySQL.
- Ð ÑÑеде IDE вÑбеÑиÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ "File" | "New Project", а заÑем –" "Java" | "Java Class Library" Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ пÑоекÑа библиоÑеки Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ StatesLibrary.
Рокне "Projects" пÑавой кнопкой мÑÑи ÑелкниÑе пÑÐ¾ÐµÐºÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñеки и вÑбеÑиÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ "File" | "New File", а заÑем – "Persistence" | "Entity Classes from Database". РмаÑÑеÑе вÑбеÑиÑе ÑÑÑÐ»ÐºÑ "EclipseLink" на ÑÑапе ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¼Ð¾Ð´ÑÐ»Ñ ÑоÑÑоÑниÑ. УкажиÑе Ð¸Ð¼Ñ demo Ð´Ð»Ñ Ð¿Ð°ÐºÐµÑа, в коÑоÑом бÑдÑÑ ÑÐ¾Ð·Ð´Ð°Ð½Ñ ÐºÐ»Ð°ÑÑÑ ÑÑÑноÑÑей.
ÐоÑле вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑого дейÑÑÐ²Ð¸Ñ Ð¿ÑоÑмоÑÑиÑе ÑозданнÑй код и обÑаÑиÑе внимание на Ñо, ÑÑо ÑепеÑÑ Ð² папке META-INF ÑаÑполагаеÑÑÑ Ñайл persistence.xml, а Ñакже клаÑÑÑ ÑÑÑноÑÑей Ð´Ð»Ñ Ð²ÑÐµÑ ÑаблиÑ:
СоздайÑе библиоÑÐµÐºÑ Java, и Ñайл JAR бÑÐ´ÐµÑ ÑазмеÑен в папке "dist", коÑоÑÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ пÑоÑмоÑÑеÑÑ Ð² окне "Files":
ÐомеÑение Ñайла JAR клаÑÑа ÑÑÑноÑÑей в оболоÑÐºÑ Ð¼Ð¾Ð´ÑлÑ
Ð ÑÑом Ñазделе ÑоздаеÑÑÑ Ð½Ð¾Ð²Ñй модÑÐ»Ñ NetBeans, коÑоÑÑй помеÑÐ°ÐµÑ ÑозданнÑй в пÑедÑдÑÑем Ñазделе Ñайл JAR в новÑй Ñаздел.
- ÐÑавой кнопкой мÑÑи ÑелкниÑе Ñзел "DBManager's Modules" в окне "Projects" и вÑбеÑиÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ "Add New Library".
- ÐÑбеÑиÑе Ñайл JAR, ÑозданнÑй в пÑедÑдÑÑем подÑазделе, а заÑем завеÑÑиÑе ÑабоÑÑ Ð¼Ð°ÑÑеÑа, Ñказав лÑбÑе знаÑениÑ.
ТепеÑÑ Ð² новом пÑиложении Ñоздан пеÑвÑй полÑзоваÑелÑÑкий модÑлÑ.
Создание дÑÑÐ³Ð¸Ñ ÑвÑзаннÑÑ Ð¼Ð¾Ð´Ñлей
Ð ÑÑом Ñазделе ÑоздаеÑÑÑ Ð´Ð²Ð° новÑÑ Ð¼Ð¾Ð´ÑлÑ, коÑоÑÑе помеÑаÑÑ ÑÐ°Ð¹Ð»Ñ JAR EclipseLink в оболоÑкÑ, а Ñакже ÑоединиÑÐµÐ»Ñ Ð±Ð°Ð· даннÑÑ JAR.
ÐÑполниÑе Ñе же дейÑÑвиÑ, ÑÑо и пÑи Ñоздании оболоÑки библиоÑеки Ð´Ð»Ñ Ñайла JAR клаÑÑа ÑÑÑноÑÑей, Ð´Ð»Ñ Ñайлов JAR EclipseLink, коÑоÑÑе ÑаÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ñ Ð² Ñайле ÑаÑпÑоÑÑÑÐ°Ð½ÐµÐ½Ð¸Ñ GlassFish. ÐÑи ÑÑом ÑбедиÑеÑÑ Ð² Ñом, ÑÑо иÑполÑзÑеÑÑÑ Ð¸ Ñайл ÑоÑÑоÑÐ½Ð¸Ñ JAR.
ÐÑполÑзÑйÑе ÑоÑеÑание "Ctrl+ÑелÑок" Ð´Ð»Ñ Ð²ÑбоÑа неÑколÑÐºÐ¸Ñ Ñайлов JAR, как показано ниже:

ÐÑли ÑазÑабоÑÑÐ¸ÐºÑ Ð½ÐµÐ¸Ð·Ð²ÐµÑÑно, какие ÑÐ°Ð¹Ð»Ñ Ð½Ñжно вклÑÑиÑÑ Ð² оболоÑкÑ, ÑледÑÐµÑ Ð²ÐµÑнÑÑÑÑÑ Ð² ÑозданнÑй Ñанее пÑÐ¾ÐµÐºÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñеки, а заÑем ÑаÑкÑÑÑÑ Ð¿Ð°Ð¿ÐºÑ "Libraries", в коÑоÑой бÑдÑÑ Ð¾ÑобÑажаÑÑÑÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ñе библиоÑеки.
- ÐаÑем ÑледÑÐµÑ ÑоздаÑÑ ÐµÑе один модÑÐ»Ñ Ð¾Ð±Ð¾Ð»Ð¾Ñки библиоÑеки Ð´Ð»Ñ ÑоединиÑÐµÐ»Ñ MySQL JAR, коÑоÑÑй доÑÑÑпен в каÑалоге ÑÑÑановки ÑÑÐµÐ´Ñ IDE NetBeans (в папке ide10/modules/ext).
ÐÑоекÑиÑование полÑзоваÑелÑÑкого инÑеÑÑейÑа
Ð ÑÑом Ñазделе ÑоздаеÑÑÑ Ð¿ÑоÑÑой пÑоÑоÑип полÑзоваÑелÑÑкого инÑеÑÑейÑа, коÑоÑÑй пÑедоÑÑавлÑÐµÑ Ð¾ÐºÐ½Ð¾ JTextArea Ð´Ð»Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ , извлеÑеннÑÑ Ð¸Ð· Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ .
- ÐÑавой кнопкой мÑÑи ÑелкниÑе Ñзел "DBManager's Modules" в окне "Projects" и вÑбеÑиÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ "Add New". СоздайÑе новÑй модÑÐ»Ñ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ StatesViewer Ñ Ð±Ð°Ð·Ð¾Ð²Ñм кодовÑм именем org.demo.states.viewer.
- Рокне "Projects" пÑавой кнопкой мÑÑи ÑелкниÑе новÑй модÑÐ»Ñ Ð¸ вÑбеÑиÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ "New" | "Window Component". УкажиÑе, ÑÑо ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ бÑÑÑ Ñоздан в положении editor и должен оÑкÑÑваÑÑÑÑ Ð¿Ñи запÑÑке пÑиложениÑ. УÑÑановиÑе States в каÑеÑÑве пÑеÑикÑа имени клаÑÑа окна.
ÐÑполÑзÑйÑе палиÑÑÑ (Ctrl+Shift+8) Ð´Ð»Ñ Ð¿ÐµÑеÑаÑÐºÐ¸Ð²Ð°Ð½Ð¸Ñ JTextArea в новое окно:

- ÐобавÑÑе ÑÑÐ¾Ñ ÐºÐ¾Ð´ в ÐºÐ¾Ð½ÐµÑ ÐºÐ¾Ð½ÑÑÑÑкÑоÑа TopComponent:
EntityManager entityManager = Persistence.createEntityManagerFactory("StatesLibraryPU").createEntityManager(); Query query = entityManager.createQuery("SELECT c FROM States c"); List<States> resultList = query.getResultList(); for (States c : resultList) { jTextArea1.append(c.getName() + " (" + c.getAbbrev() + ")" + "\n"); }Так как не ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ñ Ð·Ð°Ð²Ð¸ÑимоÑÑи модÑлей, коÑоÑÑе пÑедоÑÑавлÑÑÑ Ð¾Ð±ÑÐµÐºÑ States и ÑÐ°Ð¹Ð»Ñ ÑоÑÑоÑÐ½Ð¸Ñ JAR, ÑказаннÑе вÑÑе опеÑаÑоÑÑ Ð±ÑдÑÑ Ð¾ÑмеÑÐµÐ½Ñ ÐºÑаÑнÑм подÑеÑкиванием. ÐÑо бÑÐ´ÐµÑ ÑÑÑÑанено в ÑледÑÑÑем Ñазделе.
ÐÑÑе пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ ÑÑÑлки на модÑÐ»Ñ ÑоÑÑоÑÐ½Ð¸Ñ StatesLibraryPU, Ð¸Ð¼Ñ ÐºÐ¾ÑоÑого ÑÑÑановлено в Ñайле persistence.xml. ÐÑоме Ñого, здеÑÑ Ð¸Ð¼ÐµÐµÑÑÑ ÑÑÑлка на один из клаÑÑов ÑÑÑноÑÑей Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ States, коÑоÑÑй Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð² модÑле клаÑÑов ÑÑÑноÑÑей. ÐдапÑиÑÑйÑе ÑÑÐ¾Ñ ÐºÐ¾Ð´ к конкÑеÑной ÑиÑÑаÑии.
УÑÑановка завиÑимоÑÑей
Ð ÑÑом Ñазделе некоÑоÑÑе модÑли наÑÑÑаиваÑÑÑÑ Ð½Ð° иÑполÑзование кода из дÑÑÐ³Ð¸Ñ Ð¼Ð¾Ð´Ñлей. ÐÑо вÑполнÑеÑÑÑ ÑвнÑм обÑазом пÑÑем ÑÑÑановки ÑоглаÑений Ð¼ÐµÐ¶Ð´Ñ ÑвÑзаннÑми модÑлÑми. РдÑÑÐ³Ð¸Ñ ÑлÑÑаÑÑ Ð¿Ñи оÑÑÑÑÑÑвии ÑÑÑогой модÑлÑной аÑÑ Ð¸ÑекÑÑÑÑ Ð¿Ð»Ð°ÑÑоÑÐ¼Ñ NetBeans возможно ÑлÑÑайное и Ñ Ð°Ð¾ÑиÑеÑкое иÑполÑзование кода.
- ÐодÑÐ»Ñ ÐºÐ»Ð°ÑÑов ÑÑÑноÑÑей должен имеÑÑ Ð·Ð°Ð²Ð¸ÑимоÑÑи Ð¾Ñ Ð¼Ð¾Ð´ÑÐ»Ñ MySQL, а Ñакже Ð¾Ñ Ð¼Ð¾Ð´ÑÐ»Ñ EclipseLink. ÐÑавой кнопкой мÑÑи ÑелкниÑе модÑÐ»Ñ StatesLibrary, вÑбеÑиÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ "Properties", а заÑем пеÑейдиÑе на Ð²ÐºÐ»Ð°Ð´ÐºÑ "Libraries" Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð·Ð°Ð²Ð¸ÑимоÑÑей Ð¾Ñ Ð´Ð²ÑÑ Ð¼Ð¾Ð´Ñлей, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼ÑÑ Ð¼Ð¾Ð´ÑÐ»Ñ StatesLibrary.
- ÐодÑÐ»Ñ StatesViewer ÑÑебÑÐµÑ Ð½Ð°Ð»Ð¸ÑÐ¸Ñ Ð·Ð°Ð²Ð¸ÑимоÑÑи Ð¾Ñ Ð¼Ð¾Ð´ÑÐ»Ñ EclipseLink, а Ñакже Ð¾Ñ Ð¼Ð¾Ð´ÑÐ»Ñ ÐºÐ»Ð°ÑÑов ÑÑÑноÑÑей. ÐÑавой кнопкой мÑÑи ÑелкниÑе модÑÐ»Ñ StatesViewer, вÑбеÑиÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ "Properties", а заÑем пеÑейдиÑе на Ð²ÐºÐ»Ð°Ð´ÐºÑ "Libraries" Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð·Ð°Ð²Ð¸ÑимоÑÑей Ð¾Ñ Ð´Ð²ÑÑ Ð¼Ð¾Ð´Ñлей, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼ÑÑ Ð¼Ð¾Ð´ÑÐ»Ñ StatesViewer.
- ÐÑкÑойÑе ÑÐ»ÐµÐ¼ÐµÐ½Ñ StatesTopComponent в пÑедÑÑавлении "Source", пÑавой кнопкой мÑÑи ÑелкниÑе окно ÑедакÑоÑа и вÑбеÑиÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ "Fix Imports". СÑеда IDE ÑепеÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ñе опеÑаÑоÑÑ Ð¸Ð¼Ð¿Ð¾ÑÑа, Ñак как модÑли, ÑодеÑжаÑие Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ñе клаÑÑÑ, ÑепеÑÑ Ð´Ð¾ÑÑÑÐ¿Ð½Ñ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñа StatesTopComponent.
ТепеÑÑ Ð¼ÐµÐ¶Ð´Ñ Ð¼Ð¾Ð´ÑлÑми пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ñ ÑоглаÑениÑ, коÑоÑÑе даÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð²Ð¸ÑимоÑÑÑми в оÑделÑнÑÑ ÑаÑÑÑÑ ÐºÐ¾Ð´Ð°.
ÐапÑÑк пÑоÑоÑипа
Ð ÑÑом Ñазделе бÑÐ´ÐµÑ Ð·Ð°Ð¿ÑÑено пÑиложение, ÑÑÐ¾Ð±Ñ ÑдоÑÑовеÑиÑÑÑÑ Ð² коÑÑекÑноÑÑи доÑÑÑпа к базе даннÑÑ .
- ÐапÑÑÑиÑе ÑеÑÐ²ÐµÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ .
- ÐапÑÑÑиÑе пÑиложение. Ðа ÑкÑане должно оÑобÑазиÑÑÑÑ ÑледÑÑÑее изобÑажение:

Таким обÑазом бÑÐ´ÐµÑ Ñоздан пÑоÑÑой пÑоÑоÑип, коÑоÑÑй бÑÐ´ÐµÑ ÑаÑÑиÑÑÑÑÑÑ Ð² ÑледÑÑÑем Ñазделе.
ÐнÑегÑаÑÐ¸Ñ ÑÑнкÑионалÑноÑÑи CRUD
ЧÑÐ¾Ð±Ñ Ð¾Ð±ÐµÑпеÑиÑÑ ÑÑнкÑионалÑноÑÑÑ CRUD, коÑоÑÐ°Ñ Ð¾Ð±ÐµÑпеÑÐ¸Ð²Ð°ÐµÑ ÑеÑнÑÑ Ð¸Ð½ÑегÑаÑÐ¸Ñ Ñ Ð¿Ð»Ð°ÑÑоÑмой NetBeans, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ ÑеализоваÑÑ Ð¾ÑобÑе ÑÐ°Ð±Ð»Ð¾Ð½Ñ ÐºÐ¾Ð´Ð° плаÑÑоÑÐ¼Ñ NetBeans. Ð ÑледÑÑÑÐ¸Ñ ÑÐ°Ð·Ð´ÐµÐ»Ð°Ñ ÑÑи ÑÐ°Ð±Ð»Ð¾Ð½Ñ ÑаÑÑмаÑÑиваÑÑÑÑ Ð±Ð¾Ð»ÐµÐµ подÑобно.
ЧÑение
Ð ÑÑом Ñазделе пÑоизводиÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ðµ введенного в ÑледÑÑÑем Ñазделе ÑлеменÑа JTextArea Ð´Ð»Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñоводника плаÑÑоÑÐ¼Ñ NetBeans. ÐÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñоводника плаÑÑоÑÐ¼Ñ NetBeans ÑвлÑÑÑÑÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñами Swing, коÑоÑÑе обеÑпеÑиваÑÑ ÑлÑÑÑеннÑÑ Ð¸Ð½ÑегÑаÑÐ¸Ñ Ñ Ð¿Ð»Ð°ÑÑоÑмой NetBeans по ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñо ÑÑандаÑÑнÑми компоненÑами Swing. ÐаннÑе бÑдÑÑ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ð² обÑей иеÑаÑÑ Ð¸ÑеÑкой модели, пÑедоÑÑавленной клаÑÑом плаÑÑоÑÐ¼Ñ NetBeans Node, коÑоÑÑй оÑобÑажаеÑÑÑ Ð²Ð¾ вÑÐµÑ Ð¿ÑедÑÑавлениÑÑ Ð¿Ñоводника плаÑÑоÑÐ¼Ñ NetBeans. РконÑе данного Ñаздела опиÑан пÑоÑеÑÑ ÑÐ¸Ð½Ñ ÑонизаÑии пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñоводника Ñ Ð¾ÐºÐ½Ð¾Ð¼ "Properties" плаÑÑоÑÐ¼Ñ NetBeans.
- РкомпоненÑе TopComponent ÑдалиÑе ÑÐ»ÐµÐ¼ÐµÐ½Ñ JTextArea в пÑедÑÑавлении "Design" и закомменÑиÑÑйÑе ÑвÑзаннÑй Ñ Ð½Ð¸Ð¼ код в пÑедÑÑавлении "Source":
EntityManager entityManager = Persistence.createEntityManagerFactory("StatesLibraryPU").createEntityManager(); Query query = entityManager.createQuery("SELECT c FROM States c"); List<States> resultList = query.getResultList(); //for (States c : resultList) { // jTextArea1.append(c.getName() + " (" + c.getAbbrev() + ")" + "\n"); //} - ÐÑавой кнопкой мÑÑи ÑелкниÑе модÑÐ»Ñ StatesViewer, вÑбеÑиÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ "Properties", а заÑем пеÑейдиÑе на Ð²ÐºÐ»Ð°Ð´ÐºÑ "Libraries" Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð·Ð°Ð²Ð¸ÑимоÑÑей инÑеÑÑейÑа API Nodes и инÑеÑÑейÑа API Explorer & Property Sheet.
- ÐаÑем измениÑе подпиÑÑ ÐºÐ»Ð°ÑÑа Ð´Ð»Ñ ÑеализаÑии ÑлеменÑа ExplorerManager.Provider:
final class StatesTopComponent extends TopComponent implements ExplorerManager.Provider
- ÐÑкÑойÑе пÑедÑÑавление "Design" Ð´Ð»Ñ TopComponent, пÑавой кнопкой ÑелкниÑе палиÑÑÑ, вÑбеÑиÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ "Palette Manager" | "Add from JAR". ÐаÑем пеÑейдиÑе к ÑлеменÑÑ org-openide-explorer.jar, коÑоÑÑй Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð² папке platform9/modules внÑÑÑи каÑалога ÑÑÑановки ÑÑÐµÐ´Ñ IDE NetBeans. ÐÑбеÑиÑе ÑÐ»ÐµÐ¼ÐµÐ½Ñ BeanTreeView и завеÑÑиÑе ÑабоÑÑ Ð¼Ð°ÑÑеÑа. ТепеÑÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ BeanTreeView должен оÑобÑажаÑÑÑÑ Ð½Ð° палиÑÑе. ÐеÑеÑаÑиÑе его Ñ Ð¿Ð°Ð»Ð¸ÑÑÑ Ð² окно.
- СоздайÑе ÑÐ»ÐµÐ¼ÐµÐ½Ñ Node, моделиÑÑÑÑий даннÑе:
import demo.States; import java.util.List; import org.openide.nodes.AbstractNode; import org.openide.nodes.ChildFactory; import org.openide.nodes.Children; import org.openide.nodes.Node; class StateChildFactory extends ChildFactory<States> { private List<States> resultList; public StateChildFactory(List<States> resultList) { this.resultList = resultList; } @Override protected boolean createKeys(List<States> list) { for (States states : resultList) { list.add(states); } return true; } @Override protected Node createNodeForKey(States s) { Node node = new AbstractNode(Children.LEAF); node.setDisplayName(s.getName()); node.setShortDescription(s.getAbbrev()); return node; } } - ÐовÑоÑно вÑбеÑиÑе ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ StatesTopComponent и иÑполÑзÑйÑе ExplorerManager Ð´Ð»Ñ Ð¿ÐµÑедаÑи ÑезÑлÑÑаÑа из запÑоÑа JPA в ÑÐ»ÐµÐ¼ÐµÐ½Ñ Node:
EntityManager entityManager = Persistence.createEntityManagerFactory("StatesLibraryPU").createEntityManager(); Query query = entityManager.createQuery("SELECT c FROM States c"); List<States> resultList = query.getResultList(); em.setRootContext(new AbstractNode(Children.create(new StateChildFactory(resultList), true))); //for (States c : resultList) { // jTextArea1.append(c.getName() + " (" + c.getAbbrev() + ")" + "\n"); //} ÐапÑÑÑиÑе пÑиложение. ÐоÑле запÑÑка пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¾ÑкÑойÑе окно "Properties". ÐбÑаÑиÑе внимание на Ñо, ÑÑо неÑмоÑÑÑ Ð½Ð° доÑÑÑпноÑÑÑ Ð´Ð°Ð½Ð½ÑÑ , оÑобÑажаемÑÑ Ð² BeanTreeView, ÑÐ»ÐµÐ¼ÐµÐ½Ñ BeanTreeView не ÑÐ¸Ð½Ñ ÑонизиÑован Ñ Ð¾ÐºÐ½Ð¾Ð¼ "Properties", коÑоÑое оÑкÑÑваеÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ "Window" | "Properties". ÐÑÑгими Ñловами, пÑи пеÑемеÑении по дÑевовидной иеÑаÑÑ Ð¸Ð¸ в окне "Properties" ÑлеменÑÑ Ð½Ðµ оÑобÑажаÑÑÑÑ:

- СинÑ
ÑонизаÑÐ¸Ñ Ð¾ÐºÐ½Ð° "Properties" Ñ ÑлеменÑом BeanTreeView оÑÑÑеÑÑвлÑеÑÑÑ Ð¿ÑÑем Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² конÑÑÑÑкÑÐ¾Ñ ÑлеменÑа TopComponent ÑледÑÑÑего кода:
ActionMap map = getActionMap(); associateLookup(ExplorerUtils.createLookup(em, map));
ÐовÑоÑно запÑÑÑиÑе пÑиложение и обÑаÑиÑе внимание на Ñо, ÑÑо окно "Properties" ÑепеÑÑ ÑÐ¸Ð½Ñ ÑонизиÑовано Ñ Ð¿ÑедÑÑавлением пÑоводника:

ÐÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ пеÑеопÑеделиÑÑ getExplorerManager()
@Override
public ExplorerManager getExplorerManager() {
return em;
}
РнаÑале клаÑÑа ÑледÑÐµÑ Ð¾Ð±ÑÑвиÑÑ Ð¸ иниÑиализиÑоваÑÑ ExplorerManager:
private static ExplorerManager em = new ExplorerManager();
ÐбÑаÑиÑеÑÑ Ðº ÑÐ¾Ð»Ð¸ÐºÑ 10 лÑÑÑÐ¸Ñ Ð¸Ð½ÑеÑÑейÑов API NetBeans Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´ÑобнÑÑ Ñведений о пÑиведенном вÑÑе коде, в оÑобенноÑÑи демо-Ñолик об инÑеÑÑейÑе Nodes API и инÑеÑÑейÑе Explorer & Property Sheet API.
ÐдеÑÑ ÑлеменÑÑ TopComponent ActionMap и ExplorerManager добавлÑÑÑÑÑ Ð² ÑÐ»ÐµÐ¼ÐµÐ½Ñ Lookup TopComponent. ÐÑо Ñакже пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº ÑомÑ, ÑÑо в окне "Properties" поÑвлÑеÑÑÑ Ð¾ÑобÑажаемое Ð¸Ð¼Ñ Ð¸ ÑекÑÑ Ð²ÑплÑваÑÑей подÑказки вÑбÑанного ÑлеменÑа Node.
ТепеÑÑ Ð´Ð°Ð½Ð½Ñе можно пÑоÑмоÑÑеÑÑ Ð² дÑевовидной иеÑаÑÑ Ð¸Ð¸, как и в ÑлÑÑае Ñ ÑлеменÑом JTree. Ð Ñо же вÑÐµÐ¼Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶ÐµÐ½ пеÑÐµÑ Ð¾Ð´ в дÑÑгое пÑедÑÑавление пÑоводника без Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð´ÐµÐ»Ð¸, Ñак как ExplorerManager вÑполнÑÐµÑ ÑÐ¾Ð»Ñ Ð¿Ð¾ÑÑедника Ð¼ÐµÐ¶Ð´Ñ Ð¼Ð¾Ð´ÐµÐ»ÑÑ Ð¸ пÑедÑÑавлением. ÐÑоме Ñого, ÑепеÑÑ Ð±ÑÐ´ÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð° ÑÐ¸Ð½Ñ ÑонизаÑÐ¸Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ Ð¾ÐºÐ½Ð¾Ð¼ "Properties".
Ðбновление
Ð ÑÑом Ñазделе внаÑале ÑоздаеÑÑÑ ÑедакÑоÑ. РедакÑÐ¾Ñ Ð±ÑÐ´ÐµÑ Ð¿ÑедоÑÑавлен новÑм модÑлем NetBeans. Таким обÑазом, внаÑале бÑÐ´ÐµÑ Ñоздан новÑй модÑлÑ. ÐаÑем в ÑÑом модÑле бÑÐ´ÐµÑ Ñоздан новÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ TopComponent, ÑодеÑжаÑий два Ð¿Ð¾Ð»Ñ JTextFields (Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑÑолбÑа, коÑоÑÑй доÑÑÑпен полÑзоваÑÐµÐ»Ñ Ð´Ð»Ñ ÑедакÑиÑованиÑ). ÐодÑÐ»Ñ ÑÑедÑÑва пÑоÑмоÑÑа Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ ÑазÑеÑиÑÑ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð´ÐµÐ¹ÑÑвие Ñ Ð¼Ð¾Ð´Ñлем ÑедакÑоÑа. ÐаждÑй Ñаз пÑи вÑбоÑе нового ÑлеменÑа Node в модÑле ÑÑедÑÑва пÑоÑмоÑÑа ÑекÑÑий обÑÐµÐºÑ States бÑÐ´ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½ в окно Lookup. РмодÑле ÑедакÑоÑа бÑÐ´ÐµÑ Ð¾ÑÑÑеÑÑвлÑÑÑÑÑ Ð¿ÑоÑлÑÑивание Lookup на поÑвление обÑекÑов States. ÐÑи поÑвлении нового обÑекÑа States в Lookup бÑÐ´ÐµÑ Ð²Ñполнено обновление полей JTextFields в ÑедакÑоÑе.
ÐаÑем Ð¿Ð¾Ð»Ñ JTextFields бÑдÑÑ ÑÐ¸Ð½Ñ ÑонизиÑÐ¾Ð²Ð°Ð½Ñ Ñ ÑÑнкÑиÑми плаÑÑоÑÐ¼Ñ NetBeans "Undo", "Redo" и "Save". ÐÑÑгими Ñловами, пÑи внеÑении полÑзоваÑелем Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² поле JTextField ÑÑÑеÑÑвÑÑÑÐ°Ñ ÑÑнкÑионалÑноÑÑÑ Ð¿Ð»Ð°ÑÑоÑÐ¼Ñ NetBeans должна бÑÑÑ Ð´Ð¾ÑÑÑпной, ÑÑÐ¾Ð±Ñ Ð¾Ð±ÐµÑпеÑиваÑÑ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶ÐºÑ Ð¿Ð»Ð°ÑÑоÑÐ¼Ñ NetBeans, иÑклÑÑаÑÑÑÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑÑ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²ÑÑ ÑÑнкÑий. ÐÐ»Ñ ÑÑого Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ иÑполÑзоваÑÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ UndoRedoManager наÑÑÐ´Ñ Ñ ÑлеменÑом SaveCookie.
- СоздайÑе новÑй модÑÐ»Ñ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ StatesEditor и базовÑм кодовÑм именем org.demo.states.editor.
- ÐÑавой кнопкой мÑÑи ÑелкниÑе модÑÐ»Ñ StatesEditor и вÑбеÑиÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ "New" | "Window Component". УбедиÑеÑÑ Ð² Ñом, ÑÑо окно наÑÑÑоено на оÑобÑажение в положении editor и оÑкÑÑÑие пÑи запÑÑке пÑиложениÑ. Ðа поÑледней панели маÑÑеÑа задайÑе пÑеÑÐ¸ÐºÑ Ð¸Ð¼ÐµÐ½Ð¸ клаÑÑа "Editor".
ÐÑполÑзÑйÑе палиÑÑÑ (Ctrl+Shift+8) Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð²ÑÑ Ð¼ÐµÑок JLabels и двÑÑ Ð¿Ð¾Ð»ÐµÐ¹ JTextFields в новое окно. ÐадайÑе ÑекÑÑÑ Ð¼ÐµÑок "State" и "Abbreviation", а заÑем ÑÑÑановиÑе имена пеÑеменнÑÑ Ð¿Ð¾Ð»ÐµÐ¹ JTextFields ÑавнÑми nameField и abbrevField.
Ð GUI Builder окно ÑепеÑÑ Ð´Ð¾Ð»Ð¶Ð½Ð¾ вÑглÑдеÑÑ ÑледÑÑÑим обÑазом:

- ÐеÑниÑеÑÑ Ðº модÑÐ»Ñ StatesViewer и ÑбедиÑеÑÑ Ð² Ñом, ÑÑо Ñайл layer.xml ÑказÑÐ²Ð°ÐµÑ Ð½Ð° Ñо, ÑÑо окно бÑÐ´ÐµÑ Ð¾ÑобÑажаÑÑÑÑ Ð² Ñежиме explorer.
ÐÑавой кнопкой мÑÑи ÑелкниÑе пÑÐ¾ÐµÐºÑ Ð¸ вÑбеÑиÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ "Clean", пеÑÐµÐ¹Ð´Ñ Ð² Ñайл layer.xml. ÐоÑемÑ? ÐÑи каждом запÑÑке пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¸ его закÑÑÑии Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¾ÐºÐ¾Ð½ ÑÐ¾Ñ ÑанÑÑÑÑÑ Ð² полÑзоваÑелÑÑком каÑалоге. Таким обÑазом, еÑли ÑÐ»ÐµÐ¼ÐµÐ½Ñ StatesViewer изнаÑалÑно оÑобÑажалÑÑ Ð² Ñежиме editor, он оÑÑанеÑÑÑ Ð² Ñежиме editor до вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ "Clean", коÑоÑÐ°Ñ ÑбÑаÑÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð»ÑзоваÑелÑÑкий каÑалог (Ñ.е. ÑдалÑÐµÑ ÐµÐ³Ð¾) и позволÑÐµÑ Ð¾ÑобÑажаÑÑ StatesViewer в положении, ÑÑÑановленном в наÑÑоÑÑий Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð² Ñайле layer.xml.
- ТепеÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ пÑиÑÑÑпиÑÑ Ðº Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð°. ÐнаÑале необÑ
одимо оÑобÑазиÑÑ Ð²ÑбÑаннÑй в наÑÑоÑÑий Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¾Ð±ÑÐµÐºÑ States в ÑедакÑоÑе:
- ÐнаÑале наÑÑÑойÑе модÑÐ»Ñ StatesViewer Ñаким обÑазом, ÑÑÐ¾Ð±Ñ ÑекÑÑий обÑÐµÐºÑ States добавлÑлÑÑ Ð² окно ÑÑедÑÑва пÑоÑмоÑÑа Lookup пÑи каждом вÑбоÑе ÑлеменÑа Node. ÐÐ»Ñ ÑÑого измениÑе ÑÐ»ÐµÐ¼ÐµÐ½Ñ Node, ÑозданнÑй StateChildFactory, Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ð±ÑекÑа States в окно Lookup ÑледÑÑÑим обÑазом (обÑаÑиÑе внимание на вÑделеннÑй жиÑнÑм ÑекÑÑ):
@Override protected Node createNodeForKey(States s) { Node node = new AbstractNode(Children.LEAF, Lookups.singleton(s)); node.setDisplayName(s.getName()); node.setShortDescription(s.getAbbrev()); return node; } - ТепеÑÑ ÑледÑÐµÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ Ð¼Ð¾Ð´ÑÐ»Ñ ÑедакÑоÑа Ñаким обÑазом, ÑÑÐ¾Ð±Ñ ÐµÐ³Ð¾ окно оÑÑлеживало обÑекÑÑ States, добавлÑемÑе в окно Lookup. ÐнаÑале ÑÑÑановиÑе в модÑле ÑедакÑоÑа завиÑимоÑÑÑ Ð¾Ñ Ð¼Ð¾Ð´ÑлÑ, коÑоÑÑй пÑедоÑÑавлÑÐµÑ ÐºÐ»Ð°ÑÑ ÑÑÑноÑÑей, а Ñакже Ð¾Ñ Ð¼Ð¾Ð´ÑлÑ, пÑедоÑÑавлÑÑÑего ÑÐ°Ð¹Ð»Ñ ÑоÑÑоÑÐ½Ð¸Ñ JAR.
- ÐаÑем наÑÑÑойÑе подпиÑÑ ÐºÐ»Ð°ÑÑа EditorTopComponent Ð´Ð»Ñ Ð²Ð½ÐµÐ´ÑÐµÐ½Ð¸Ñ LookupListener:
public final class EditorTopComponent extends TopComponent implements LookupListener
- ÐеÑеопÑеделиÑе resultChanged Ñаким обÑазом, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»Ñ JTextFields обновлÑлиÑÑ Ð¿Ñи вÑÑавке нового обÑекÑа States в окно Lookup:
@Override public void resultChanged(LookupEvent lookupEvent) { Lookup.Result r = (Lookup.Result) lookupEvent.getSource(); Collection<States> c = r.allInstances(); if (!c.isEmpty()) { for (States s : c) { nameField.setText(s.getName()); abbrevField.setText(s.getAbbrev()); } } else { nameField.setText("[no state]"); abbrevField.setText("[no abbreviation]"); } } - ÐоÑле опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ LookupListener Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ добавиÑÑ ÐµÐ³Ð¾ к какомÑ-либо ÑлеменÑÑ. Рданном ÑлÑÑае он добавлÑеÑÑÑ Ðº ÑлеменÑÑ Lookup.Result, полÑÑÐµÐ½Ð½Ð¾Ð¼Ñ Ð¸Ð· глобалÑного конÑекÑÑа. ÐлобалÑнÑй конÑекÑÑ Ð¸ÑполÑзÑеÑÑÑ Ð² каÑеÑÑве поÑÑедника Ð´Ð»Ñ ÐºÐ¾Ð½ÑекÑÑа вÑбÑанного ÑлеменÑа Node. ÐапÑимеÑ, еÑли в дÑевовидной иеÑаÑÑ Ð¸Ð¸ вÑбÑано знаÑение "Missouri", Ñо обÑÐµÐºÑ States Ð´Ð»Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ "Missouri" добавлÑеÑÑÑ Ð² окно Lookup ÑлеменÑа Node. Так как ÑÐ»ÐµÐ¼ÐµÐ½Ñ Node ÑвлÑеÑÑÑ Ð²ÑбÑаннÑм в наÑÑоÑÑее вÑÐµÐ¼Ñ ÑлеменÑом, обÑÐµÐºÑ States Ð´Ð»Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ "Missouri" ÑÑановиÑÑÑ Ð´Ð¾ÑÑÑпнÑм в глобалÑном конÑекÑÑе. ÐÑо пеÑедаеÑÑÑ Ð² ÑÐ»ÐµÐ¼ÐµÐ½Ñ resultChanged и пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑекÑÑовÑÑ Ð¿Ð¾Ð»ÐµÐ¹.
ТепеÑÑ Ð¿Ñи каждом Ñоздании ÑлеменÑа Node, коÑоÑое вÑполнÑеÑÑÑ Ð¿Ñи вÑбоÑе нового ÑоÑÑоÑÐ½Ð¸Ñ Ð² ÑÑедÑÑве пÑоÑмоÑÑа, новÑй обÑÐµÐºÑ States добавлÑеÑÑÑ Ð² окно Lookup ÑлеменÑа Node.
ÐÑе опиÑаннÑе опеÑаÑии вÑполнÑÑÑÑÑ, когда ÑÐ»ÐµÐ¼ÐµÐ½Ñ LookupListener ÑÑановиÑÑÑ Ð°ÐºÑивнÑм пÑи каждом оÑкÑÑÑии окна ÑедакÑоÑа, как показано ниже:
@Override public void componentOpened() { result = Utilities.actionsGlobalContext().lookupResult(States.class); result.addLookupListener(this); resultChanged(new LookupEvent(result)); } @Override public void componentClosed() { result.removeLookupListener(this); result = null; } - ÐнаÑале наÑÑÑойÑе модÑÐ»Ñ StatesViewer Ñаким обÑазом, ÑÑÐ¾Ð±Ñ ÑекÑÑий обÑÐµÐºÑ States добавлÑлÑÑ Ð² окно ÑÑедÑÑва пÑоÑмоÑÑа Lookup пÑи каждом вÑбоÑе ÑлеменÑа Node. ÐÐ»Ñ ÑÑого измениÑе ÑÐ»ÐµÐ¼ÐµÐ½Ñ Node, ÑозданнÑй StateChildFactory, Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ð±ÑекÑа States в окно Lookup ÑледÑÑÑим обÑазом (обÑаÑиÑе внимание на вÑделеннÑй жиÑнÑм ÑекÑÑ):
- ÐаÑем необÑ
одимо ÑледÑÑÑим обÑазом обÑÑвиÑÑ Ð¿ÐµÑеменнÑÑ result в наÑале клаÑÑа:
private Lookup.Result result = null;
ÐапÑÑÑиÑе пÑиложение повÑоÑно и обÑаÑиÑе внимание на Ñо, ÑÑо окно ÑедакÑоÑа обновлÑеÑÑÑ Ð¿Ñи вÑбоÑе нового ÑлеменÑа Node:

Ð Ñо же вÑÐµÐ¼Ñ ÑледÑÐµÑ Ð¾ÑмеÑиÑÑ Ð¾Ð¿ÐµÑаÑии, вÑполнÑемÑе пÑи пеÑÐµÑ Ð¾Ð´Ðµ в окно ÑедакÑоÑа:

Так как ÑÐ»ÐµÐ¼ÐµÐ½Ñ Node болÑÑе не ÑвлÑеÑÑÑ ÑекÑÑим, обÑÐµÐºÑ States не Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð² глобалÑном конÑекÑÑе. ÐÑо пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð¿Ð¾ÑомÑ, ÑÑо глобалÑнÑй конÑекÑÑ Ð²ÑÑÑÑÐ¿Ð°ÐµÑ Ð¿Ð¾ÑÑедником Ð´Ð»Ñ Ð¾ÐºÐ½Ð° Lookup ÑекÑÑего ÑлеменÑа Node. Таким обÑазом, в ÑÑом ÑлÑÑае глобалÑнÑй конÑекÑÑ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ. ÐмеÑÑо ÑÑого бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð»Ð¾ÐºÐ°Ð»Ñное окно Lookup, пÑедоÑÑавленное окном States.
- ТепеÑÑ ÑледÑÐµÑ Ð¿ÐµÑейÑи к ÑÑнкÑиÑм "Undo" и "Redo". ÐеобÑ
одимо добиÑÑÑÑ Ñого, ÑÑÐ¾Ð±Ñ Ð¿Ñи изменении полÑзоваÑелем одного из полей JTextFields ÑÑали доÑÑÑÐ¿Ð½Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸ "Undo" и "Redo", а Ñакже ÑвÑзаннÑе Ñ Ð½Ð¸Ð¼Ð¸ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¼ÐµÐ½Ñ "Edit". ÐÐ»Ñ ÑÑого плаÑÑоÑма NetBeans пÑедоÑÑавлÑÐµÑ UndoRedo.Manager.
- ÐбÑÑвиÑе новÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ UndoRedoManager и ÑоздайÑе его ÑкземплÑÑ Ð² наÑале ÑлеменÑа EditorTopComponent:
private UndoRedo.Manager manager = new UndoRedo.Manager();
- ÐаÑем ÑледÑÐµÑ Ð¿ÐµÑеопÑеделиÑÑ Ð¼ÐµÑод getUndoRedo() в компоненÑе EditorTopComponent:
@Override public UndoRedo getUndoRedo() { return manager; } - РконÑÑÑÑкÑоÑе ÑлеменÑа EditorTopComponent ÑледÑÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ KeyListener в Ð¿Ð¾Ð»Ñ JTextFields. ÐаÑем добавÑÑе пÑоÑлÑÑиваÑели UndoRedoListeners в ÑвÑзаннÑе ÑобÑÑиÑ, коÑоÑÑе необÑ
одимо внедÑиÑÑ:
nameField.addKeyListener(new KeyListener() { public void keyTyped(KeyEvent e) { nameField.getDocument().addUndoableEditListener(manager); abbrevField.getDocument().addUndoableEditListener(manager); } public void keyPressed(KeyEvent e) { nameField.getDocument().addUndoableEditListener(manager); abbrevField.getDocument().addUndoableEditListener(manager); } public void keyReleased(KeyEvent e) { nameField.getDocument().addUndoableEditListener(manager); abbrevField.getDocument().addUndoableEditListener(manager); } }); abbrevField.addKeyListener(new KeyListener() { public void keyTyped(KeyEvent e) { nameField.getDocument().addUndoableEditListener(manager); abbrevField.getDocument().addUndoableEditListener(manager); } public void keyPressed(KeyEvent e) { nameField.getDocument().addUndoableEditListener(manager); abbrevField.getDocument().addUndoableEditListener(manager); } public void keyReleased(KeyEvent e) { nameField.getDocument().addUndoableEditListener(manager); abbrevField.getDocument().addUndoableEditListener(manager); } }); - ÐапÑÑÑиÑе пÑиложение и пÑовеÑÑÑе ÑÑнкÑии "Undo" и "Redo" в дейÑÑвии Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ½Ð¾Ð¿Ð¾Ðº и команд менÑ:

ФÑнкÑии бÑдÑÑ ÑабоÑаÑÑ Ð¾Ð¶Ð¸Ð´Ð°ÐµÐ¼Ñм обÑазом. Ðожно измениÑÑ Ð¿ÑоÑлÑÑиваÑÐµÐ»Ñ KeyListener Ñаким обÑазом, ÑÑÐ¾Ð±Ñ Ð½Ðµ ÐСРклавиÑи вÑзÑвали вклÑÑение ÑÑнкÑий "Undo" и "Redo". ÐапÑимеÑ, пÑи нажаÑии клавиÑи Enter вклÑÑение ÑÑнкÑий "Undo" и "Redo", ÑкоÑее вÑего, не бÑÐ´ÐµÑ Ð½Ñжно. СледÑÐµÑ ÑооÑвеÑÑÑвÑÑÑим обÑазом иÑпÑавиÑÑ ÐºÐ¾Ð´, ÑÑÐ¾Ð±Ñ Ð¾Ð½ ÑооÑвеÑÑÑвовал ÑÑебованиÑм пÑедпÑиÑÑиÑ.
- ÐбÑÑвиÑе новÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ UndoRedoManager и ÑоздайÑе его ÑкземплÑÑ Ð² наÑале ÑлеменÑа EditorTopComponent:
- ÐеобÑ
одимо Ñакже вÑполниÑÑ Ð¸Ð½ÑегÑаÑÐ¸Ñ Ñ ÑÑнкÑионалÑноÑÑÑÑ Ð¿Ð»Ð°ÑÑоÑÐ¼Ñ NetBeans "Save":
- Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð½Ð° панели инÑÑÑÑменÑов плаÑÑоÑÐ¼Ñ NetBeans доÑÑÑпна кнопка "Save All". Ð ÑаÑÑмаÑÑиваемой ÑиÑÑаÑии ÑоÑ
Ñанение "вÑеÑ
" ÑлеменÑов не ÑÑебÑеÑÑÑ, Ñак как понÑÑие "вÑе" подÑазÑÐ¼ÐµÐ²Ð°ÐµÑ Ð½Ð°Ð»Ð¸Ñие ÑазлиÑнÑÑ
докÑменÑов. ÐдеÑÑ Ð¸Ð¼ÐµÐµÑÑÑ ÑолÑко один "докÑменÑ", Ñо еÑÑÑ ÑедакÑоÑ, коÑоÑÑй иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð²ÑеÑ
Ñзлов дÑевовидной иеÑаÑÑ
ии. УдалиÑе ÐºÐ½Ð¾Ð¿ÐºÑ "Save All" и добавÑÑе ÐºÐ½Ð¾Ð¿ÐºÑ "Save". ÐÐ»Ñ ÑÑого добавÑÑе ÑледÑÑÑий код в Ñайл layer модÑÐ»Ñ StatesEditor:
<folder name="Toolbars"> <folder name="File"> <file name="org-openide-actions-SaveAllAction.instance_hidden"/> <file name="org-openide-actions-SaveAction.instance"/> </folder> </folder> - УÑÑановиÑе завиÑимоÑÑи Ð¾Ñ Ð¸Ð½ÑеÑÑейÑа API Dialogs и инÑеÑÑейÑа API Nodes.
- СоздайÑе новÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Node. ÐÑÐ¾Ñ Ñзел бÑÐ´ÐµÑ Ð½Ð°Ð·ÑваÑÑÑÑ "DummyNode", Ñак как ÑÑнкÑионалÑноÑÑÑ "Save" плаÑÑоÑÐ¼Ñ NetBeans добавлÑеÑÑÑ Ð¸Ð¼ÐµÐ½Ð½Ð¾ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑлеменÑа Node. ÐÐ»Ñ ÑÑого ÑоздаеÑÑÑ Ð½Ð¾Ð²Ñй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Node, добавлÑÑÑий новÑе ÑеализаÑии SaveCookie в Ð½Ð°Ð±Ð¾Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑей. ÐÑÐ¾Ñ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð·Ð°Ñем ÑÑÑанавливаеÑÑÑ Ð² каÑеÑÑве акÑивиÑованного ÑлеменÑа Node компоненÑа TopComponent.
private class DummyNode extends AbstractNode { SaveCookieImpl impl; public DummyNode() { super(Children.LEAF); impl = new SaveCookieImpl(); } public void fire(boolean modified) { if (modified) { //ÐÑли ÑекÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½, //вÑполнÑеÑÑÑ Ð²Ð½ÐµÐ´Ñение SaveCookie, //и ÑеализаÑÐ¸Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÑеÑÑÑ Ð² ÑÐ»ÐµÐ¼ÐµÐ½Ñ cookieset, //коÑоÑÑй опÑеделÑÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑи ÑлеменÑа Node, //в ÑÑом ÑлÑÑае – возможноÑÑÑ ÑÐ¾Ñ ÑанениÑ: getCookieSet().assign(SaveCookie.class, impl); } else { //РпÑоÑивном ÑлÑÑае пÑиÑвоение не вÑполнÑеÑÑÑ, //а ÑÐ»ÐµÐ¼ÐµÐ½Ñ SaveCookie не ÑÑÑанавливаеÑÑÑ Ð² каÑеÑÑве //одной из возможноÑÑей ÑлеменÑа Node: getCookieSet().assign(SaveCookie.class); } } private class SaveCookieImpl implements SaveCookie { public void save() throws IOException { Confirmation msg = new NotifyDescriptor.Confirmation("Do you want to save \"" + nameField.getText() + " (" + abbrevField.getText() + ") " + "\"?", NotifyDescriptor.OK_CANCEL_OPTION, NotifyDescriptor.QUESTION_MESSAGE); Object result = DialogDisplayer.getDefault().notify(msg); //Ðогда полÑзоваÑÐµÐ»Ñ ÑÐµÐ»ÐºÐ°ÐµÑ ÐºÐ½Ð¾Ð¿ÐºÑ "Yes", подÑвеÑÐ¶Ð´Ð°Ñ ÑÐ¾Ñ Ñанение, //ÑледÑÐµÑ Ð¾ÑклÑÑиÑÑ ÐºÐ½Ð¾Ð¿ÐºÑ "Save" и ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¼ÐµÐ½Ñ "Save", //ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð¸ могли иÑполÑзоваÑÑÑÑ ÑолÑко пÑи внеÑении ÑледÑÑÑего Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ //в ÑекÑÑовое поле: if (NotifyDescriptor.YES_OPTION.equals(result)) { fire(false); //ÐдеÑÑ Ð±ÑÐ´ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½ код обÑабоÑки дейÑÑÐ²Ð¸Ñ "Save". } } } } - ÐбÑÑвиÑе ÑÐ»ÐµÐ¼ÐµÐ½Ñ Node в наÑале клаÑÑа TopComponent:
private DummyNode dummyNode;
ÐÑи запÑÑке пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° панели инÑÑÑÑменÑов оÑобÑазиÑÑÑ Ð´ÑÑгой знаÑок. ÐмеÑÑо кнопки "Save All" бÑÐ´ÐµÑ Ð´Ð¾ÑÑÑпна кнопка "Save".
ТепеÑÑ ÑледÑÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ ÐµÐ³Ð¾ в конÑÑÑÑкÑоÑе TopComponent к акÑивиÑованнÑм Ñзлам TopComponent:
setActivatedNodes(new Node[]{dummyNode = new DummyNode()}); - Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð½Ð° панели инÑÑÑÑменÑов плаÑÑоÑÐ¼Ñ NetBeans доÑÑÑпна кнопка "Save All". Ð ÑаÑÑмаÑÑиваемой ÑиÑÑаÑии ÑоÑ
Ñанение "вÑеÑ
" ÑлеменÑов не ÑÑебÑеÑÑÑ, Ñак как понÑÑие "вÑе" подÑазÑÐ¼ÐµÐ²Ð°ÐµÑ Ð½Ð°Ð»Ð¸Ñие ÑазлиÑнÑÑ
докÑменÑов. ÐдеÑÑ Ð¸Ð¼ÐµÐµÑÑÑ ÑолÑко один "докÑменÑ", Ñо еÑÑÑ ÑедакÑоÑ, коÑоÑÑй иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð²ÑеÑ
Ñзлов дÑевовидной иеÑаÑÑ
ии. УдалиÑе ÐºÐ½Ð¾Ð¿ÐºÑ "Save All" и добавÑÑе ÐºÐ½Ð¾Ð¿ÐºÑ "Save". ÐÐ»Ñ ÑÑого добавÑÑе ÑледÑÑÑий код в Ñайл layer модÑÐ»Ñ StatesEditor:
- СледÑÐµÑ Ð²ÑзваÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ðµ в DummyNode пÑи каждом изменении ÑлеменÑа JTextFields, коÑоÑÑй добавлÑÐµÑ ÑеализаÑÐ¸Ñ SaveCookie к возможноÑÑÑм акÑивиÑованного ÑлеменÑа Node Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ "DummyNode":
nameField.addKeyListener(new KeyListener() { public void keyTyped(KeyEvent e) { nameField.getDocument().addUndoableEditListener(manager); abbrevField.getDocument().addUndoableEditListener(manager); dummyNode.fire(true); } public void keyPressed(KeyEvent e) { nameField.getDocument().addUndoableEditListener(manager); abbrevField.getDocument().addUndoableEditListener(manager); dummyNode.fire(true); } public void keyReleased(KeyEvent e) { nameField.getDocument().addUndoableEditListener(manager); abbrevField.getDocument().addUndoableEditListener(manager); dummyNode.fire(true); } }); abbrevField.addKeyListener(new KeyListener() { public void keyTyped(KeyEvent e) { nameField.getDocument().addUndoableEditListener(manager); abbrevField.getDocument().addUndoableEditListener(manager); dummyNode.fire(true); } public void keyPressed(KeyEvent e) { nameField.getDocument().addUndoableEditListener(manager); abbrevField.getDocument().addUndoableEditListener(manager); dummyNode.fire(true); } public void keyReleased(KeyEvent e) { nameField.getDocument().addUndoableEditListener(manager); abbrevField.getDocument().addUndoableEditListener(manager); dummyNode.fire(true); } }); ÐапÑÑÑиÑе пÑиложение и обÑаÑиÑе внимание на вклÑÑение и оÑклÑÑение кнопки "Save":

- ÐаÑем ÑледÑÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ ÐºÐ¾Ð´ JPA Ð´Ð»Ñ ÑоÑ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹. ÐÐ»Ñ ÑÑого замениÑе комменÑаÑий «//ÐдеÑÑ Ð±ÑÐ´ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½ код обÑабоÑки дейÑÑÐ²Ð¸Ñ "Save"». ÐÑÐ¾Ñ ÐºÐ¾Ð¼Ð¼ÐµÐ½ÑаÑий необÑ
одимо замениÑÑ ÑледÑÑÑим кодом.
EntityManager entityManager = Persistence.createEntityManagerFactory("StatesLibraryPU").createEntityManager(); entityManager.getTransaction().begin(); States states = entityManager.find(States.class, s.getId()); states.setName(nameField.getText()); states.setAbbrev(abbrevField.getText()); entityManager.getTransaction().commit(); ÐапÑÑÑиÑе пÑиложение и измениÑе даннÑе. РнаÑÑоÑÑее вÑÐµÐ¼Ñ ÑÑнкÑионалÑноÑÑÑ "Refresh" оÑÑÑÑÑÑвÑеÑ, поÑÑÐ¾Ð¼Ñ Ð´Ð»Ñ Ð¿ÑоÑмоÑÑа обновленной инÑоÑмаÑии ÑледÑÐµÑ Ð¿ÐµÑезапÑÑÑиÑÑ Ð¿Ñиложение. ÐапÑимеÑ, в данном ÑлÑÑае дÑÐµÐ²Ð¾Ð²Ð¸Ð´Ð½Ð°Ñ Ð¸ÐµÑаÑÑ Ð¸Ñ Ð¾ÑобÑÐ°Ð¶Ð°ÐµÑ ÑÐ¾Ñ Ñаненное Ð¸Ð¼Ñ ÑÑаÑа "Missouri":

- ÐаÑем ÑледÑÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ ÑÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑедÑÑва пÑоÑмоÑÑа States. РазÑабоÑÑик Ð¼Ð¾Ð¶ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Timer, коÑоÑÑй пеÑиодиÑеÑки обновлÑÐµÑ ÑÑедÑÑво пÑоÑмоÑÑа. Ð ÑÑом пÑимеÑе в Ñзел Root бÑÐ´ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð° команда Ð¼ÐµÐ½Ñ "Refresh", позволÑÑÑÐ°Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð²ÑÑÑнÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð¸ÑÑ ÑÑедÑÑво пÑоÑмоÑÑа.
- РоÑновном пакеÑе модÑÐ»Ñ StatesViewer необÑ
одимо ÑоздаÑÑ Ð½Ð¾Ð²Ñй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Node, заменÑÑÑий ÑÐ»ÐµÐ¼ÐµÐ½Ñ AbstractNode, коÑоÑÑй в наÑÑоÑÑее вÑÐµÐ¼Ñ Ð¸ÑполÑзÑеÑÑÑ Ð² каÑеÑÑве коÑневого ÑлеменÑа нижеÑÑоÑÑиÑ
ÑлеменÑов ÑÑедÑÑва пÑоÑмоÑÑа. ÐбÑаÑиÑе внимание на Ñо, ÑÑо дейÑÑвие "Refresh" Ñакже пÑивÑзÑваеÑÑÑ Ðº Ð½Ð¾Ð²Ð¾Ð¼Ñ ÐºÐ¾ÑÐ½ÐµÐ²Ð¾Ð¼Ñ ÑзлÑ.
class StatesRootNode extends AbstractNode { public StatesRootNode(Children kids) { super(kids); setDisplayName("Root"); } @Override public Action[] getActions(boolean context) { Action[] result = new Action[]{ new RefreshAction()}; return result; } private final class RefreshAction extends AbstractAction { public RefreshAction() { putValue(Action.NAME, "Refresh"); } public void actionPerformed(ActionEvent e) { StatesTopComponent.refreshNode(); } } } - ÐобавÑÑе ÑÑÐ¾Ñ Ð¼ÐµÑод в ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ StatesTopComponentÐ´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿ÑиложениÑ:
public static void refreshNode() { EntityManager entityManager = Persistence.createEntityManagerFactory("StatesLibraryPU").createEntityManager(); Query query = entityManager.createQuery("SELECT c FROM States c"); List<States> resultList = query.getResultList(); em.setRootContext(new StatesRootNode(Children.create(new StateChildFactory(resultList), true))); } ÐовÑоÑно запÑÑÑиÑе пÑиложение и обÑаÑиÑе внимание на Ñо, ÑÑо поÑвилÑÑ Ð½Ð¾Ð²Ñй коÑневой Ñзел Ñ Ð´ÐµÐ¹ÑÑвием "Refresh":

- ÐзмениÑе даннÑе, ÑÐ¾Ñ ÑаниÑе Ð¸Ñ , вÑполниÑе дейÑÑвие "Refresh" и ÑбедиÑеÑÑ Ð² Ñом, ÑÑо ÑÑедÑÑво пÑоÑмоÑÑа обновлÑеÑÑÑ.
ТепеÑÑ ÑледÑÐµÑ Ð·Ð°Ð¼ÐµÐ½Ð¸ÑÑ Ð¿ÑиведеннÑй вÑÑе код в конÑÑÑÑкÑоÑе StatesTopComponent на вÑзов ÑпомÑнÑÑого ÑлеменÑа. Ðак видно из вÑделенной ÑаÑÑи кода, ÑепеÑÑ Ð²Ð¼ÐµÑÑо ÑлеменÑа AbstractNode иÑполÑзÑеÑÑÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ StatesRootNode. ÐÐ»ÐµÐ¼ÐµÐ½Ñ StatesRootNode ÑодеÑÐ¶Ð¸Ñ Ð´ÐµÐ¹ÑÑвие "Refresh", коÑоÑое вÑзÑÐ²Ð°ÐµÑ Ð¿ÑиведеннÑй вÑÑе код.
- РоÑновном пакеÑе модÑÐ»Ñ StatesViewer необÑ
одимо ÑоздаÑÑ Ð½Ð¾Ð²Ñй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Node, заменÑÑÑий ÑÐ»ÐµÐ¼ÐµÐ½Ñ AbstractNode, коÑоÑÑй в наÑÑоÑÑее вÑÐµÐ¼Ñ Ð¸ÑполÑзÑеÑÑÑ Ð² каÑеÑÑве коÑневого ÑлеменÑа нижеÑÑоÑÑиÑ
ÑлеменÑов ÑÑедÑÑва пÑоÑмоÑÑа. ÐбÑаÑиÑе внимание на Ñо, ÑÑо дейÑÑвие "Refresh" Ñакже пÑивÑзÑваеÑÑÑ Ðº Ð½Ð¾Ð²Ð¾Ð¼Ñ ÐºÐ¾ÑÐ½ÐµÐ²Ð¾Ð¼Ñ ÑзлÑ.
СледÑÐµÑ Ñакже ÑбедиÑÑÑÑ Ð² Ñом, ÑÑо BeanTreeView в StatesViewer бÑÐ´ÐµÑ ÑаÑÑÑгиваÑÑÑÑ Ð¿Ð¾ гоÑизонÑали и веÑÑикали пÑи изменении ÑазмеÑа пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑзоваÑелем. ÐÐ»Ñ Ð¿ÑовеÑки ÑÑого оÑкÑойÑе окно, вÑбеÑиÑе ÑÐ»ÐµÐ¼ÐµÐ½Ñ BeanTreeView, а заÑем нажмиÑе кнопки Ñо ÑÑÑелками на панели инÑÑÑÑменÑов GUI Builder.
Так как ÑедакÑÐ¾Ñ Ð¾ÑкÑÑваеÑÑÑ Ð¿Ñи запÑÑке пÑиложениÑ, ÑÐ»ÐµÐ¼ÐµÐ½Ñ LookupListener Ñакже доÑÑÑпен пÑи запÑÑке пÑиложениÑ.
ÐамениÑе ÑÑÑокÑ
result = Utilities.actionsGlobalContext().lookupResult(States.class);
ÑледÑÑÑей ÑÑÑокой
result = WindowManager.getDefault().findTopComponent("StatesTopComponent").getLookup().lookupResult(States.class);
СÑÑока "StatesTopComponent" ÑвлÑеÑÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑом StatesTopComponent, коÑоÑÑй пÑедÑÑавлÑÐµÑ Ñобой ÑÑÑоковÑÑ ÐºÐ¾Ð½ÑÑанÑÑ, Ð½Ð°Ñ Ð¾Ð´ÑÑÑÑÑÑ Ð² иÑÑ Ð¾Ð´Ð½Ð¾Ð¼ коде ÑлеменÑа StatesTopComponent. ÐедоÑÑаÑком опиÑанного вÑÑе Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð° ÑвлÑеÑÑÑ Ñо, ÑÑо ÑÐ»ÐµÐ¼ÐµÐ½Ñ EditorTopComponent пÑи ÑÑом Ð¼Ð¾Ð¶ÐµÑ ÑабоÑаÑÑ ÑолÑко в Ñом ÑлÑÑае, еÑли обнаÑÑживаеÑÑÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ TopComponent Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑом "StatesTopComponent". ÐÑо должно ÑвнÑм обÑазом докÑменÑиÑоваÑÑÑÑ, ÑÑÐ¾Ð±Ñ Ð¸Ð½ÑоÑмиÑоваÑÑ Ð¿Ð¾Ð»ÑзоваÑелей дÑÑÐ³Ð¸Ñ ÑедакÑоÑов о Ñом, ÑÑо иденÑиÑикаÑÐ¸Ñ TopComponent ÑÑедÑÑва пÑоÑмоÑÑа вÑполнÑеÑÑÑ Ð¸Ð¼ÐµÐ½Ð½Ð¾ Ñаким обÑазом. РазÑабоÑÑик Ñакже Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ Ð¼Ð¾Ð´ÐµÐ»Ñ Ð²ÑбоÑа, как опиÑано здеÑÑ Ð¢Ð¸Ð¼Ð¾Ð¼ ÐÑдÑо.
ÐÑи иÑполÑзовании опиÑаннÑÑ Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð¾Ð² конÑекÑÑ Ð½Ðµ бÑÐ´ÐµÑ Ð¿Ð¾ÑеÑÑн пÑи пеÑÐµÑ Ð¾Ð´Ðµ к ÑлеменÑÑ EditorTopComponent, как показано ниже:

РнаÑÑоÑÑий Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¿Ñи нажаÑии кнопки "OK" в пÑиведенном вÑÑе диалоговом окне не пÑоиÑÑ Ð¾Ð´Ð¸Ñ. Ðа ÑледÑÑÑем ÑÑапе бÑÐ´ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½ код JPA, обÑабаÑÑваÑÑий ÑоÑÑоÑние изменений.
ÐнаÑение "s" в s.getId() в наÑÑоÑÑее вÑÐµÐ¼Ñ Ð½Ðµ опÑеделено. ÐовÑоÑно опÑеделиÑе resultChanged ÑледÑÑÑим обÑазом поÑле обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ States s; в наÑале клаÑÑа. ÐÑо позволÑÐµÑ Ð¾Ð±ÑекÑÑ States задаваÑÑ Ð·Ð½Ð°Ñение s, коÑоÑое иÑполÑзÑеÑÑÑ Ð² коде ÑоÑÑоÑÐ½Ð¸Ñ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑа ÑекÑÑего обÑекÑа States.
@Override
public void resultChanged(LookupEvent lookupEvent) {
Lookup.Result r = (Lookup.Result) lookupEvent.getSource();
Collection<States> c = r.allInstances();
if (!c.isEmpty()) {
for (States states : c) {
s = states;
nameField.setText(states.getName());
abbrevField.setText(states.getAbbrev());
}
} else {
nameField.setText("[no state]");
abbrevField.setText("[no abbreviation]");
}
}
Ð ÑÑом Ñазделе бÑл ÑаÑÑмоÑÑен ÑпоÑоб обÑабоÑки изменений полей JTextFields в плаÑÑоÑме NetBeans. ÐÑи изменении ÑекÑÑа кнопки плаÑÑоÑÐ¼Ñ NetBeans "Undo" и "Redo" бÑдÑÑ Ð²ÐºÐ»ÑÑÐµÐ½Ñ Ð¸Ð»Ð¸ оÑклÑÑенÑ. ÐÑоме Ñого, кнопка "Save" Ñакже коÑÑекÑно вклÑÑаеÑÑÑ Ð¸ оÑклÑÑаеÑÑÑ, ÑÑо позволÑÐµÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ ÑÐ¾Ñ ÑанÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð½Ñе даннÑе в Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ .
Создание
Ð ÑÑом Ñазделе полÑзоваÑÐµÐ»Ñ Ð¿ÑедоÑÑавлÑеÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð¹ запиÑи Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ .
ÐÑавой кнопкой мÑÑи ÑелкниÑе модÑÐ»Ñ StatesEditor и вÑбеÑиÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ "New" | "Action". ÐÑполÑзÑйÑе маÑÑÐµÑ "New Action" Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ дейÑÑÐ²Ð¸Ñ "Always Enabled". Ðовое дейÑÑвие должно оÑобÑажаÑÑÑÑ Ð½Ð° панели инÑÑÑÑменÑов и на панели менÑ.

Ðа ÑледÑÑÑем Ñаге маÑÑеÑа вÑзовиÑе дейÑÑвие NewAction:

УбедиÑеÑÑ Ð² налиÑии знаÑка ÑазмеÑом 16 на 16, коÑоÑÑй Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ вÑбÑаÑÑ Ð² маÑÑеÑе, еÑли дейÑÑвие должно вÑбиÑаÑÑÑÑ Ñ Ð¿Ð°Ð½ÐµÐ»Ð¸ инÑÑÑÑменÑов.
- РдейÑÑвии "New" ÑледÑÐµÑ Ð¾ÑкÑÑÑÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ TopComponent вмеÑÑе Ñ Ð¿ÑÑÑÑми полÑми JTextFields:
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public final class NewAction implements ActionListener { public void actionPerformed(ActionEvent e) { EditorTopComponent tc = EditorTopComponent.getDefault(); tc.resetFields(); tc.open(); tc.requestActive(); } }ÐÑо дейÑÑвие внедÑÑÐµÑ ÐºÐ»Ð°ÑÑ ActionListener, коÑоÑÑй пÑивÑзан к пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ÑеÑез запиÑи в Ñайле layer. ÐÑи запиÑи ÑоздаÑÑÑÑ Ð¼Ð°ÑÑеÑом "New Action". ÐÑедÑÑавÑÑе Ñебе легкоÑÑÑ Ð¿ÐµÑеноÑа ÑÑÑеÑÑвÑÑÑего пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Swing на плаÑÑоÑÐ¼Ñ NetBeans пÑи налиÑии возможноÑÑи иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑÐµÑ Ð¶Ðµ клаÑÑов Action, коÑоÑÑе иÑполÑзовалиÑÑ Ð² иÑÑ Ð¾Ð´Ð½Ð¾Ð¼ пÑиложении, без Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑооÑвеÑÑÑвии Ñ ÐºÐ»Ð°ÑÑами Action, пÑедоÑÑавлÑемÑми плаÑÑоÑмой NetBeans!
- Ð ÑлеменÑе SaveCookie ÑледÑÐµÑ ÑбедиÑÑÑÑ Ð² Ñом, ÑÑо возвÑÐ°Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ null ÑказÑÐ²Ð°ÐµÑ Ð½Ð° ÑоÑ
Ñанение новой запиÑи, а не на обновление ÑÑÑеÑÑвÑÑÑей запиÑи:
public void save() throws IOException { Confirmation msg = new NotifyDescriptor.Confirmation("Do you want to save \"" + nameField.getText() + " (" + abbrevField.getText() + ") " + "\"?", NotifyDescriptor.OK_CANCEL_OPTION, NotifyDescriptor.QUESTION_MESSAGE); Object result = DialogDisplayer.getDefault().notify(msg); //Ðогда полÑзоваÑÐµÐ»Ñ ÑÐµÐ»ÐºÐ°ÐµÑ ÐºÐ½Ð¾Ð¿ÐºÑ "Yes", подÑвеÑÐ¶Ð´Ð°Ñ ÑÐ¾Ñ Ñанение, //ÑледÑÐµÑ Ð¾ÑклÑÑиÑÑ ÐºÐ½Ð¾Ð¿ÐºÑ "Save" и ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¼ÐµÐ½Ñ "Save", //ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð¸ могли иÑполÑзоваÑÑÑÑ ÑолÑко пÑи внеÑении ÑледÑÑÑего Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ //в ÑекÑÑовое поле: if (NotifyDescriptor.YES_OPTION.equals(result)) { fire(false); EntityManager entityManager = Persistence.createEntityManagerFactory("StatesLibraryPU").createEntityManager(); entityManager.getTransaction().begin(); if (s.getId() != null) { States states = entityManager.find(States.class, s.getId()); states.setName(nameField.getText()); states.setAbbrev(abbrevField.getText()); entityManager.getTransaction().commit(); } else { Query query = entityManager.createQuery("SELECT c FROM States c"); List<States> resultList = query.getResultList(); s.setId(resultList.size()+1); s.setName(nameField.getText()); s.setAbbrev(abbrevField.getText()); entityManager.persist(s); entityManager.getTransaction().commit(); } } } ÐовÑоÑно запÑÑÑиÑе пÑиложение и добавÑÑе новое ÑоÑÑоÑние в Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ :

ÐÑи обновлении даннÑÑ Ð½Ð¾Ð²Ñе запиÑи бÑдÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑÑÑÑ Ð² нижнÑÑ ÑаÑÑÑ ÑпиÑка, Ñак как они ÑоÑÑиÑÑÑÑÑÑ Ð¿Ð¾ номеÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑа. Так, знаÑение "Disneyland" бÑÐ´ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¾ в конеÑ, а не в алÑавиÑном поÑÑдке.
РкомпоненÑе EditorTopComponent Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ добавиÑÑ ÑледÑÑÑий меÑод Ð´Ð»Ñ ÑбÑоÑа полей JTextFields и ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ обÑекÑа States:
public void resetFields() {
s = new States();
nameField.setText("");
abbrevField.setText("");
}
Удаление
Ð ÑÑом Ñазделе полÑзоваÑÐµÐ»Ñ Ð¿ÑедоÑÑавлÑеÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ ÑдалÑÑÑ Ð²ÑбÑаннÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð² базе даннÑÑ . С помоÑÑÑ Ð¾Ð¿Ð¸ÑаннÑÑ Ð²ÑÑе пÑиемов и кода внедÑиÑе дейÑÑвие "Delete" ÑамоÑÑоÑÑелÑно.
- СоздайÑе новое дейÑÑвие DeleteAction. СледÑÐµÑ Ð¾Ð¿ÑеделиÑÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑÑ Ð¿ÑивÑзки дейÑÑÐ²Ð¸Ñ Ðº ÑÐ·Ð»Ñ State, к панели инÑÑÑÑменÑов, к Ð¼ÐµÐ½Ñ Ð¸Ð»Ð¸ ко вÑем ÑлеменÑам. РзавиÑимоÑÑи Ð¾Ñ Ð¼ÐµÑÑа пÑивÑзки ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ ÑазлиÑнÑе клаÑÑÑ Ð¿Ð»Ð°ÑÑоÑÐ¼Ñ NetBeans. ÐовÑоÑно изÑÑиÑе ÑÑебнÑй кÑÑÑ, обÑаÑив оÑобое внимание на ÑпоÑоб ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð´ÐµÐ¹ÑÑÐ²Ð¸Ñ "New" в ÑÑавнении Ñ Ð´ÐµÐ¹ÑÑвием коÑневого Ñзла "Refresh".
- ÐолÑÑиÑе ÑекÑÑий обÑÐµÐºÑ States, возвÑаÑиÑе диалоговое окно "Are you sure?", а заÑем ÑдалиÑе запиÑÑ. ÐÐ»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ Ñведений повÑоÑно пÑоÑиÑайÑе ÑÑебнÑй кÑÑÑ, в оÑобенноÑÑи ÑÑ ÑаÑÑÑ, в коÑоÑой ÑеализÑеÑÑÑ ÑÑнкÑÐ¸Ñ "Save". ÐмеÑÑо ÑÐ¾Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñи ÑепеÑÑ Ð¿ÑоизводиÑÑÑ ÐµÐµ Ñдаление из Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ .
СвÑзаннÑе демо-Ñолики
ÐеÑвÑй демо-Ñолик опиÑÑÐ²Ð°ÐµÑ Ð¿ÑоÑеÑÑ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² плаÑÑоÑме NetBeans Ð´Ð»Ñ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ :
ÐÑоÑой демо-Ñолик обÑÑÑнÑÐµÑ ÑпоÑоб ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑвÑзанного ÑедакÑоÑа. (ÐланиÑÑеÑÑÑ).
ÐополниÑелÑÐ½Ð°Ñ Ð¸Ð½ÑоÑмаÑиÑ
Ðа ÑÑом ÑÑебнÑй кÑÑÑ Ð¿Ð¾ ÑÑнкÑиÑм CRUD в плаÑÑоÑме NetBeans завеÑÑен. Ð ÑÑом докÑменÑе опиÑано Ñоздание нового пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð»Ð°ÑÑоÑÐ¼Ñ NetBeans Ñ ÑÑнкÑионалÑноÑÑÑÑ CRUD Ð´Ð»Ñ Ð¾Ð¿Ñеделенной Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ . ÐополниÑелÑнÑе ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ Ñоздании и ÑазÑабоÑке пÑиложений пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ Ð² ÑледÑÑÑÐ¸Ñ ÑеÑÑÑÑÐ°Ñ :
