{"id":9669,"date":"2026-03-05T14:05:11","date_gmt":"2026-03-05T13:05:11","guid":{"rendered":"https:\/\/pomoc.comarch.pl\/cee\/?post_type=ht_kb&#038;p=9669"},"modified":"2026-03-05T14:05:24","modified_gmt":"2026-03-05T13:05:24","slug":"rozwoj-interfejsu","status":"publish","type":"ht_kb","link":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/","title":{"rendered":"Rozw\u00f3j interfejsu"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_89 ez-toc-wrap-left counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Spis tre\u015bci<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Prze\u0142\u0105cznik Spisu Tre\u015bci\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Grupa_docelowa\" >Grupa docelowa<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Wprowadzenie\" >Wprowadzenie<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Cechy_i_koncepcje\" >Cechy i koncepcje<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Elementy_i_hierarchia_kontenerow\" >Elementy i hierarchia kontener\u00f3w<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Zarzadzanie_ukladem\" >Zarz\u0105dzanie uk\u0142adem<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Ustawienia_menedzera_ukladu\" >Ustawienia mened\u017cera uk\u0142adu<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Wskazowki_dla_menedzera_ukladu\" >Wskaz\u00f3wki dla mened\u017cera uk\u0142adu<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Odstepy\" >Odst\u0119py<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#VisualElement\" >VisualElement<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Identyfikacja\" >Identyfikacja<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Metadane\" >Metadane<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Obsluga_zdarzen_Actions\" >Obs\u0142uga zdarze\u0144 (Actions)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Look_Feel\" >Look &amp; Feel<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Sterowanie_klawiatura\" >Sterowanie klawiatur\u0105<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Sterowanie_fokusem\" >Sterowanie fokusem<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Access_Keys_Mnemonics\" >Access Keys (Mnemonics)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Shortcuts_Accelerators\" >Shortcuts (Accelerators)<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Komunikaty\" >Komunikaty<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Aplikacje_dialogowe\" >Aplikacje dialogowe<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Elementy_specjalne\" >Elementy specjalne<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-21\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Listy_i_tabele\" >Listy i tabele<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-22\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#EntityFields\" >EntityFields<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-23\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Rozszerzanie_i_dostosowywanie_elementow_GUI\" >Rozszerzanie i dostosowywanie element\u00f3w GUI<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-24\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Powiazanie_z_comcisagpgmdialog\" >Powi\u0105zanie z com.cisag.pgm.dialog<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-25\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Referencja\" >Referencja<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-26\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Klasy_bazowe\" >Klasy bazowe<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-27\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#VisualElement-2\" >VisualElement<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-28\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Implementacja\" >Implementacja<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-29\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#VisualElement_API\" >VisualElement API<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-30\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#VisualElementContainer\" >VisualElementContainer<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-31\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#VisualElementContainer_API\" >VisualElementContainer API<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-32\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Window\" >Window<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-33\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Window_API\" >Window API<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-34\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Field\" >Field<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-35\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Wlasciwosci_ogolne\" >W\u0142a\u015bciwo\u015bci og\u00f3lne<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-36\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Field_API\" >Field API<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-37\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Kontenery_najwyzszego_poziomu\" >Kontenery najwy\u017cszego poziomu<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-38\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#ApplicationWindow\" >ApplicationWindow<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-39\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Dialog\" >Dialog<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-40\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Dialog_API\" >Dialog API<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-41\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#PopupWindow\" >PopupWindow<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-42\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#PopupWindow_API\" >PopupWindow API<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-43\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Kontenery_standardowe\" >Kontenery standardowe<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-44\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#View\" >View<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-45\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#View_API\" >View API<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-46\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#GroupBox\" >GroupBox<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-47\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#GroupBox_API\" >GroupBox API<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-48\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Shelf\" >Shelf<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-49\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Shelf_API\" >Shelf API<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-50\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#ScrollPane\" >ScrollPane<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-51\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#ScrollPane_API\" >ScrollPane API<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-52\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#SplitPane\" >SplitPane<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-53\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#SplitPane_API\" >SplitPane API<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-54\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#TabbedPane\" >TabbedPane<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-55\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#TabbedPane_API\" >TabbedPane API<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-56\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#LayeredPane\" >LayeredPane<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-57\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#LayeredPane_API\" >LayeredPane API<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-58\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Elementy_standardowe\" >Elementy standardowe<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-59\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Label\" >Label<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-60\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Label_API\" >Label API<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-61\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Button\" >Button<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-62\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#ToggleButton\" >ToggleButton<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-63\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#MenuButton\" >MenuButton<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-64\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#CheckBox\" >CheckBox<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-65\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#RadioButton\" >RadioButton<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-66\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#ListBox\" >ListBox<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-67\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Pola\" >Pola<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-68\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#TextField\" >TextField<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-69\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#ExtendedTextField\" >ExtendedTextField<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-70\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#MultiLineTextField\" >MultiLineTextField<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-71\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#EntityField\" >EntityField<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-72\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#ValueSetField\" >ValueSetField<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-73\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#MultiValueSetField\" >MultiValueSetField<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-74\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#BooleanField\" >BooleanField<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-75\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#RadioButtonGroup\" >RadioButtonGroup<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-76\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#DecimalField\" >DecimalField<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-77\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#PercentField\" >PercentField<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-78\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#ByteField_ShortField_IntegerField_LongField\" >ByteField, ShortField, IntegerField, LongField<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-79\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#CisDateField\" >CisDateField<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-80\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#CisDateField_API\" >CisDateField API<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-81\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#CisPointInTimeField\" >CisPointInTimeField<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-82\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#CisPointInTimeField_API\" >CisPointInTimeField API<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-83\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#TimeStampField\" >TimeStampField<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-84\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#TimeStampField_API\" >TimeStampField API<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-85\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#TimeOfDayField\" >TimeOfDayField<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-86\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#TimeOfDayField_API\" >TimeOfDayField API<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-87\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#LabelField\" >LabelField<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-88\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#IconField\" >IconField<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-89\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#LayeredIconField\" >LayeredIconField<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-90\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#GuidField\" >GuidField<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-91\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#FavoriteField\" >FavoriteField<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-92\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#PasswordField\" >PasswordField<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-93\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#CharacterField\" >CharacterField<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-94\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Pola_wyboru\" >Pola wyboru<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-95\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#TextSelectionField\" >TextSelectionField<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-96\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#DecimalSelectionField\" >DecimalSelectionField<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-97\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#DecimalSelectionField_API\" >DecimalSelectionField API<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-98\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#CisDateSelectionField\" >CisDateSelectionField<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-99\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#AbstractCisQuantitySelectionField\" >AbstractCisQuantitySelectionField<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-100\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#ValidFromUntilFieldSupport\" >ValidFromUntilFieldSupport<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-101\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#ValidFromUntilFieldSupport_API\" >ValidFromUntilFieldSupport API<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-102\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#ValidFromFieldSupport\" >ValidFromFieldSupport<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-103\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Listy_i_tabele-2\" >Listy i tabele<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-104\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Wspolne_wlasciwosci\" >Wsp\u00f3lne w\u0142a\u015bciwo\u015bci<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-105\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Obszar_naglowka\" >Obszar nag\u0142\u00f3wka<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-106\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Obszar_danych\" >Obszar danych<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-107\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Model_stron\" >Model stron<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-108\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Eksport_danych\" >Eksport danych<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-109\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#List\" >List<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-110\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#ListStyle\" >ListStyle<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-111\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#ListViewCreator\" >ListViewCreator<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-112\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#ListView\" >ListView<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-113\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#ExtendedListView\" >ExtendedListView<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-114\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#RowHeader\" >RowHeader<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-115\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Tabela\" >Tabela<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-116\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#TableDataManager\" >TableDataManager<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-117\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#PageButton\" >PageButton<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-118\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Specjalne_kontenery\" >Specjalne kontenery<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-119\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#CoolBar\" >CoolBar<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-120\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#ButtonBar\" >ButtonBar<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-121\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Menu\" >Menu<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-122\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#MenuBar\" >MenuBar<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-123\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#MessageGroupView\" >MessageGroupView<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-124\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Specjalne_elementy\" >Specjalne elementy<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-125\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Tree\" >Tree<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-126\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#TreeNode\" >TreeNode<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-127\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#TreeView\" >TreeView<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-128\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#EditableTreeView\" >EditableTreeView<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-129\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#HTMLPane\" >HTMLPane<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-130\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#HTMLEditor\" >HTMLEditor<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-131\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#PopupMenu\" >PopupMenu<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-132\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Glue\" >Glue<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-133\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Strut\" >Strut<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-134\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Layout_Manager\" >Layout Manager<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-135\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#StandardLayout\" >StandardLayout<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-136\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#ReferenceConstraints\" >ReferenceConstraints<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-137\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#BorderLayout\" >BorderLayout<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-138\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#BoxLayout\" >BoxLayout<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-139\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#FlowLayout\" >FlowLayout<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-140\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#XYLayout_XYConstraints\" >XYLayout, XYConstraints<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-141\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Komponenty_graficzne\" >Komponenty graficzne<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-142\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Border\" >Border<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-143\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#LineBorder\" >LineBorder<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-144\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#DecoratedBorder\" >DecoratedBorder<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-145\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#CompoundBorder\" >CompoundBorder<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-146\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#EmptyBorder\" >EmptyBorder<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-147\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Color\" >Color<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-148\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Font\" >Font<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-149\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Insets\" >Insets<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-150\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Icon\" >Icon<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-151\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#UIManager\" >UIManager<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-152\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Kolory\" >Kolory<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-153\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Komponenty_sterujace\" >Komponenty steruj\u0105ce<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-154\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Action_ActionListener\" >Action, ActionListener<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-155\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#ActionList\" >ActionList<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-156\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Przyklady_zastosowan\" >Przyk\u0142ady zastosowa\u0144<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-157\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Zastosowanie_menedzerow_ukladu\" >Zastosowanie mened\u017cer\u00f3w uk\u0142adu<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-158\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#StandardLayout-2\" >StandardLayout<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-159\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#BoxLayout-2\" >BoxLayout<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-160\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Zastosowanie_przyciskow\" >Zastosowanie przycisk\u00f3w<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-161\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#MenuButton-2\" >MenuButton<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-162\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Wykorzystanie_okien_dialogowych\" >Wykorzystanie okien dialogowych<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-163\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Graficzny_debugger\" >Graficzny debugger<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-164\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Wywolanie\" >Wywo\u0142anie<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-165\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Uprawnienia\" >Uprawnienia<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-166\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Obsluga\" >Obs\u0142uga<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-167\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Wyszukiwanie_elementow\" >Wyszukiwanie element\u00f3w<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-168\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Identyfikatory_elementow\" >Identyfikatory element\u00f3w<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-169\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Wyswietlanie_i_zmiana_wlasciwosci\" >Wy\u015bwietlanie i zmiana w\u0142a\u015bciwo\u015bci<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-170\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Zmiana_wlasciwosci\" >Zmiana w\u0142a\u015bciwo\u015bci<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-171\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Zachowanie_przy_wielokrotnym_wyborze\" >Zachowanie przy wielokrotnym wyborze<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-172\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Debugowanie_ukladu\" >Debugowanie uk\u0142adu<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-173\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Weryfikacja_granic_elementow\" >Weryfikacja granic element\u00f3w<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-174\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Zmiana_wskazowek_dla_menedzera_ukladu\" >Zmiana wskaz\u00f3wek dla mened\u017cera uk\u0142adu<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-175\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Wyswietlanie_linii_prowadzacych\" >Wy\u015bwietlanie linii prowadz\u0105cych<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-176\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Weryfikacja_sterowania_fokusem\" >Weryfikacja sterowania fokusem<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-177\" href=\"https:\/\/pomoc.comarch.pl\/cee\/index.php\/documentation\/rozwoj-interfejsu\/#Usuwanie_elementow\" >Usuwanie element\u00f3w<\/a><\/li><\/ul><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<p data-start=\"15\" data-end=\"141\">Niniejszy artyku\u0142 opisuje klasy zawarte w pakiecie <em data-start=\"67\" data-end=\"86\">com.cisag.pgm.gui<\/em>. Stanowi on uzupe\u0142nienie dokumentacji API (<em data-start=\"130\" data-end=\"139\">JavaDoc<\/em>).<\/p>\n<p data-start=\"143\" data-end=\"552\">Dokument pe\u0142ni funkcj\u0119 podr\u0119cznika referencyjnego, kt\u00f3ry zapewnia szybki przegl\u0105d oraz szczeg\u00f3\u0142owe informacje dotycz\u0105ce klas zawartych w pakiecie <em data-start=\"289\" data-end=\"308\">com.cisag.pgm.gui<\/em>. W celu przekazania podstawowej wiedzy zawiera rozdzia\u0142 wprowadzaj\u0105cy, opisuj\u0105cy istotne komponenty oraz mechanizmy programowania graficznych interfejs\u00f3w u\u017cytkownika. Artyku\u0142 ko\u0144czy si\u0119 rozdzia\u0142em zawieraj\u0105cym r\u00f3\u017cne przyk\u0142ady programistyczne.<\/p>\n<h3 data-start=\"143\" data-end=\"552\" id=\"grupa-docelowa\" ><span class=\"ez-toc-section\" id=\"Grupa_docelowa\"><\/span>Grupa docelowa<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p data-start=\"579\" data-end=\"773\">Artyku\u0142 jest przeznaczony dla programist\u00f3w oprogramowania, kt\u00f3rzy przy u\u017cyciu klas z pakietu <em data-start=\"673\" data-end=\"692\">com.cisag.pgm.gui<\/em> chc\u0105 tworzy\u0107 graficzne interfejsy u\u017cytkownika (<em data-start=\"740\" data-end=\"745\">GUI<\/em>) dla aplikacji <em data-start=\"761\" data-end=\"772\">Comarch ERP Enterprise<\/em>.<\/p>\n<p data-start=\"775\" data-end=\"971\">Zak\u0142ada si\u0119 znajomo\u015b\u0107 j\u0119zyka programowania Java oraz \u015brodowiska deweloperskiego <em data-start=\"761\" data-end=\"772\">Comarch ERP Enterprise<\/em>. Wprowadzenie do tworzenia aplikacji dla <em data-start=\"761\" data-end=\"772\">Comarch ERP Enterprise<\/em>\u00a0znajduje si\u0119 w artykule <em data-start=\"944\" data-end=\"970\">Podr\u0119cznik programowania<\/em>.<\/p>\n<p data-start=\"973\" data-end=\"1355\">Ponadto wymagane s\u0105 podstawowe umiej\u0119tno\u015bci w zakresie projektowania graficznych interfejs\u00f3w dla nowoczesnych system\u00f3w informatycznych. Dla os\u00f3b, kt\u00f3re nie zajmowa\u0142y si\u0119 dotychczas programowaniem GUI w j\u0119zyku Java, rekomendowane jest dodatkowo Java Tutorial <em data-start=\"1231\" data-end=\"1262\">Creating a GUI with JFC\/Swing.<\/em><\/p>\n<h3 data-start=\"973\" data-end=\"1355\" id=\"wprowadzenie\" ><span class=\"ez-toc-section\" id=\"Wprowadzenie\"><\/span>Wprowadzenie<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p data-start=\"1381\" data-end=\"1670\">Do projektowania graficznych interfejs\u00f3w u\u017cytkownika <em data-start=\"761\" data-end=\"772\">Comarch ERP Enterprise<\/em>\u00a0udost\u0119pnia obszar klas Java, kt\u00f3ry w wielu aspektach jest por\u00f3wnywalny z koncepcj\u0105 AWT oraz Swing w j\u0119zyku Java. Wiedza oraz techniki programistyczne z tych obszar\u00f3w mog\u0105 by\u0107 w wi\u0119kszo\u015bci przypadk\u00f3w bezpo\u015brednio zastosowane.<\/p>\n<p data-start=\"1672\" data-end=\"1866\">Java API (<em data-start=\"1682\" data-end=\"1717\">Application Programming Interface<\/em>) ukrywa przy tym \u015brodowisko klient\/serwer, jak r\u00f3wnie\u017c fakt, \u017ce klientem mo\u017ce by\u0107 na przyk\u0142ad przegl\u0105darka obs\u0142uguj\u0105ca jedynie HTML oraz JavaScript.<\/p>\n<p data-start=\"1868\" data-end=\"1923\">Obszar UI <em data-start=\"761\" data-end=\"772\">Comarch ERP Enterprise<\/em>\u00a0sk\u0142ada si\u0119 z dw\u00f3ch pakiet\u00f3w Java:<\/p>\n<ul>\n<li data-start=\"1925\" data-end=\"1973\"><em data-start=\"1927\" data-end=\"1946\">com.cisag.pgm.gui<\/em><\/li>\n<li data-start=\"1925\" data-end=\"1973\"><em data-start=\"1951\" data-end=\"1973\">com.cisag.pgm.dialog<\/em><\/li>\n<\/ul>\n<p data-start=\"1975\" data-end=\"2094\">Pakiet <em data-start=\"1982\" data-end=\"2001\">com.cisag.pgm.gui<\/em> udost\u0119pnia w\u0142a\u015bciwe API, natomiast pakiet <em data-start=\"2044\" data-end=\"2066\">com.cisag.pgm.dialog<\/em> stanowi jego implementacj\u0119.<\/p>\n<p data-start=\"2096\" data-end=\"2415\">Za pomoc\u0105 <em data-start=\"2106\" data-end=\"2125\">com.cisag.pgm.gui<\/em> budowane s\u0105 graficzne interfejsy aplikacji, natomiast <em data-start=\"2180\" data-end=\"2202\">com.cisag.pgm.dialog<\/em> jest zazwyczaj wykorzystywany do rozszerzania obszaru o dodatkowe komponenty. Poniewa\u017c g\u0142\u00f3wnym celem podr\u0119cznika jest rozw\u00f3j aplikacji, drugi pakiet jest w dalszej cz\u0119\u015bci omawiany jedynie w ograniczonym zakresie.<\/p>\n<p data-start=\"2455\" data-end=\"2566\">Podstawowa koncepcja jest analogiczna do AWT: interfejs GUI sk\u0142ada si\u0119 z r\u00f3\u017cnych komponent\u00f3w (<em data-start=\"2549\" data-end=\"2564\">VisualElement<\/em>).<\/p>\n<p data-start=\"2568\" data-end=\"2593\">Typowymi komponentami s\u0105:<\/p>\n<ul>\n<li data-start=\"2595\" data-end=\"2642\">pola tekstowe,<\/li>\n<li data-start=\"2595\" data-end=\"2642\">etykiety,<\/li>\n<li data-start=\"2595\" data-end=\"2642\">przyciski.<\/li>\n<\/ul>\n<p data-start=\"2644\" data-end=\"2905\">Szczeg\u00f3ln\u0105 kategori\u0119 komponent\u00f3w stanowi\u0105 kontenery (<em data-start=\"2697\" data-end=\"2721\">VisualElementContainer<\/em>). S\u0142u\u017c\u0105 one do grupowania, pozycjonowania oraz wsp\u00f3lnego sterowania innymi komponentami. W tym celu powi\u0105zane elementy s\u0105 dodawane do odpowiedniego kontenera przy u\u017cyciu metody <em data-start=\"2899\" data-end=\"2904\">add<\/em>.<\/p>\n<p data-start=\"2907\" data-end=\"3174\">Poniewa\u017c kontenery s\u0105 r\u00f3wnie\u017c komponentami, mog\u0105 one by\u0107 z kolei dodawane do kontener\u00f3w nadrz\u0119dnych. Interfejs GUI stanowi struktur\u0119 drzewiast\u0105 z\u0142o\u017con\u0105 z kontener\u00f3w oraz innych komponent\u00f3w, przy czym najwy\u017cszy kontener jest zawsze oknem (<em data-start=\"3145\" data-end=\"3153\">Window<\/em>) lub klas\u0105 pochodn\u0105.<\/p>\n<p data-start=\"0\" data-end=\"372\">Drug\u0105 podstawow\u0105 zasad\u0119 (r\u00f3wnie\u017c analogicznie do AWT) stanowi\u0105 mened\u017cery uk\u0142adu. Zamiast przypisywa\u0107 komponentom sta\u0142e rozmiary i wsp\u00f3\u0142rz\u0119dne, obliczanie rozmiaru i po\u0142o\u017cenia odbywa si\u0119 dynamicznie, tzn. warto\u015bci s\u0105 automatycznie wyznaczane dla danego zakresu tre\u015bci, u\u017cytej wielko\u015bci czcionki, rozmiaru okna oraz rozdzielczo\u015bci ekranu i dostosowywane w przypadku zmian.<\/p>\n<p data-start=\"374\" data-end=\"660\">Do ka\u017cdego kontenera przypisany jest mened\u017cer uk\u0142adu, kt\u00f3ry przejmuje zadanie rozmieszczania element\u00f3w. Mened\u017cer uk\u0142adu implementuje w pewnym sensie strategi\u0119, wed\u0142ug kt\u00f3rej komponenty kontenera s\u0105 rozmieszczane, oraz reguluje spos\u00f3b wykorzystania przestrzeni dost\u0119pnej dla kontenera.<\/p>\n<p data-start=\"662\" data-end=\"1037\" data-is-last-node=\"\" data-is-only-node=\"\">W odr\u00f3\u017cnieniu od bardziej uniwersalnych interfejs\u00f3w API (AWT, Swing, com.cisag.pgm.dialog), pakiet <em data-start=\"761\" data-end=\"780\">com.cisag.pgm.gui<\/em> oferuje r\u00f3wnie\u017c specjalne wsparcie dla programowania aplikacji standardowych w systemie Comarch ERP Enterprise. Obejmuje to wykorzystanie metadanych (repozytorium), implementacj\u0119 wytycznych stylistycznych oraz uproszczenie realizacji zada\u0144 standardowych.<\/p>\n<h4 data-start=\"662\" data-end=\"1037\" id=\"cechy-i-koncepcje\" ><span class=\"ez-toc-section\" id=\"Cechy_i_koncepcje\"><\/span>Cechy i koncepcje<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<h5 data-start=\"662\" data-end=\"1037\" id=\"elementy-i-hierarchia-kontenerow\" ><span class=\"ez-toc-section\" id=\"Elementy_i_hierarchia_kontenerow\"><\/span>Elementy i hierarchia kontener\u00f3w<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"662\" data-end=\"1037\" data-is-last-node=\"\" data-is-only-node=\"\">Niewielki przyk\u0142ad z cz\u0119sto u\u017cywanymi elementami ma pokaza\u0107, w jaki spos\u00f3b z pojedynczych element\u00f3w budowana jest hierarchia (kontener\u00f3w).<\/p>\n<p data-start=\"0\" data-end=\"91\">Przyk\u0142adowo, wykorzystano cztery elementy standardowe z pakietu <em data-start=\"69\" data-end=\"88\">com.cisag.pgm.gui<\/em>:<\/p>\n<ul>\n<li data-start=\"95\" data-end=\"133\">Dialog (<em data-start=\"103\" data-end=\"129\">com.cisag.pgm.gui.Dialog<\/em>)<\/li>\n<li data-start=\"136\" data-end=\"170\">View (<em data-start=\"142\" data-end=\"166\">com.cisag.pgm.gui.View<\/em>)<\/li>\n<li data-start=\"173\" data-end=\"211\">Button (<em data-start=\"181\" data-end=\"207\">com.cisag.pgm.gui.Button<\/em>)<\/li>\n<li data-start=\"214\" data-end=\"250\">Label (<em data-start=\"221\" data-end=\"246\">com.cisag.pgm.gui.Label<\/em>)<\/li>\n<\/ul>\n<p data-start=\"252\" data-end=\"464\"><em>Dialog <\/em>jest kontenerem typu <em data-start=\"284\" data-end=\"295\">top-level. <\/em>Udost\u0119pnia przestrze\u0144 dla wszystkich zawartych w nim element\u00f3w. Innymi cz\u0119sto u\u017cywanymi kontenerami typu <em data-start=\"404\" data-end=\"415\">top-level<\/em> s\u0105 na przyk\u0142ad okna aplikacji oraz okna dialogowe.<\/p>\n<p data-start=\"466\" data-end=\"764\"><em>View <\/em>jest kontenerem po\u015brednim lub pomocniczym. S\u0142u\u017cy do realizacji pozycjonowania przycisku (<em data-start=\"566\" data-end=\"574\">Button<\/em>) oraz etykiety (<em data-start=\"591\" data-end=\"598\">Label<\/em>). Inne kontenery po\u015brednie lub pomocnicze, takie jak na przyk\u0142ad <em data-start=\"664\" data-end=\"676\">ScrollPane<\/em> lub <em data-start=\"681\" data-end=\"693\">TabbedPane<\/em>, oferuj\u0105 dodatkowo r\u00f3wnie\u017c dodatkowe w\u0142a\u015bciwo\u015bci (np. interaktywne).<\/p>\n<p data-start=\"766\" data-end=\"1070\"><em>Button <\/em>oraz <em>Label <\/em>nale\u017c\u0105 do <em data-start=\"802\" data-end=\"824\">element\u00f3w atomarnych<\/em>, tzn. nie s\u0142u\u017c\u0105 do umieszczania w nich innych element\u00f3w, lecz zazwyczaj prezentuj\u0105 informacje. Cz\u0119sto wykorzystywane s\u0105 tak\u017ce do przyjmowania danych wej\u015bciowych, jak ma to miejsce na przyk\u0142ad w polach tekstowych, <em data-start=\"1040\" data-end=\"1053\">ComboBoxach<\/em> oraz tabelach.<\/p>\n<p data-start=\"1072\" data-end=\"1344\" data-is-last-node=\"\" data-is-only-node=\"\">Poni\u017cszy diagram przedstawia hierarchi\u0119 kontener\u00f3w w przyk\u0142adzie. Zawiera ka\u017cdy utworzony lub u\u017cyty kontener wraz z elementami, kt\u00f3re si\u0119 w nim znajduj\u0105. Nale\u017cy zwr\u00f3ci\u0107 uwag\u0119, \u017ce ka\u017cde okno (<em data-start=\"1263\" data-end=\"1271\">Window<\/em>), a tak\u017ce ka\u017cdy dialog, tworzy w\u0142asn\u0105, niezale\u017cn\u0105 hierarchi\u0119 kontener\u00f3w.<\/p>\n<p data-start=\"1072\" data-end=\"1344\" data-is-last-node=\"\" data-is-only-node=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-42545 \" src=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2026\/02\/GUI_2.png\" alt=\"\" width=\"451\" height=\"280\" srcset=\"https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2026\/02\/GUI_2.png 818w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2026\/02\/GUI_2-300x186.png 300w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2026\/02\/GUI_2-768x477.png 768w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2026\/02\/GUI_2-50x31.png 50w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2026\/02\/GUI_2-600x373.png 600w, https:\/\/pomoc.comarch.pl\/cee\/wp-content\/uploads\/2026\/02\/GUI_2-320x199.png 320w\" sizes=\"auto, (max-width: 451px) 100vw, 451px\" \/><\/p>\n<p style=\"text-align: center;\" data-start=\"1072\" data-end=\"1344\" data-is-last-node=\"\" data-is-only-node=\"\"><em>Hierarchia kontener\u00f3w<\/em><\/p>\n<p data-start=\"0\" data-end=\"165\">Z diagramu wynika, \u017ce nawet prosty przyk\u0142ad posiada hierarchi\u0119 kontener\u00f3w o wielu poziomach. Korzeniem hierarchii kontener\u00f3w jest zawsze kontener typu <em data-start=\"151\" data-end=\"162\">top-level<\/em>.<\/p>\n<p data-start=\"167\" data-end=\"646\">Ka\u017cdy kontener typu <em data-start=\"187\" data-end=\"198\">top-level<\/em> zawiera (czasami r\u00f3wnie\u017c po\u015brednio) kontener po\u015bredni lub pomocniczy, okre\u015blany jako <em data-start=\"284\" data-end=\"298\">content-pane<\/em>. W wi\u0119kszo\u015bci program\u00f3w nie ma znaczenia, czy i jakie kontenery znajduj\u0105 si\u0119 faktycznie pomi\u0119dzy kontenerem typu <em data-start=\"412\" data-end=\"423\">top-level<\/em> a jego <em data-start=\"431\" data-end=\"445\">content-pane<\/em>. Zasadniczo <em data-start=\"458\" data-end=\"472\">content-pane<\/em> zawiera (bezpo\u015brednio lub po\u015brednio) wszystkie widoczne elementy okna. Wyj\u0105tek stanowi okno aplikacji, kt\u00f3re obejmuje dodatkowe obszary (<em>CoolBar<\/em>, <em>StatusBar<\/em>, <em>Navigator<\/em>, \u2026).<\/p>\n<p data-start=\"648\" data-end=\"1068\">Aby doda\u0107 komponent do kontenera, nale\u017cy u\u017cy\u0107 jednej z dost\u0119pnych metod <em data-start=\"720\" data-end=\"725\">add<\/em>. Metoda <em data-start=\"734\" data-end=\"739\">add<\/em> wymaga co najmniej jednego argumentu (elementu, kt\u00f3ry ma zosta\u0107 dodany). Czasami konieczne jest podanie dodatkowego argumentu w celu okre\u015blenia szczeg\u00f3\u0142owych informacji dotycz\u0105cych uk\u0142adu. W poni\u017cszym przyk\u0142adzie kodu wykorzystano to na przyk\u0142ad do umieszczenia kontenera <em data-start=\"1012\" data-end=\"1018\">View<\/em> w centralnej cz\u0119\u015bci kontenera (<em data-start=\"1050\" data-end=\"1064\">content-pane<\/em>).<\/p>\n<p data-start=\"1070\" data-end=\"1140\" data-is-last-node=\"\" data-is-only-node=\"\">Za pomoc\u0105 poni\u017cszego kodu mo\u017cna utworzy\u0107 przedstawiony powy\u017cej dialog:<\/p>\n<p data-start=\"1070\" data-end=\"1140\" data-is-last-node=\"\" data-is-only-node=\"\"><em>dialog = new Dialog(&#8230;);<\/em><br \/>\n<em>button = new Button(&#8230;);<\/em><br \/>\n<em>label = new Label(&#8230;);<\/em><br \/>\n<em>view = new View(&#8230;);<\/em><br \/>\n<em>view.add(button);<\/em><br \/>\n<em>view.add(label);<\/em><br \/>\n<em>dialog.getContentPane().add(view, &#8230;);<\/em><\/p>\n<h5 data-start=\"1070\" data-end=\"1140\" id=\"zarzadzanie-ukladem\" ><span class=\"ez-toc-section\" id=\"Zarzadzanie_ukladem\"><\/span>Zarz\u0105dzanie uk\u0142adem<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"32\" data-end=\"302\">Obliczanie rozmiaru i po\u0142o\u017cenia element\u00f3w wewn\u0105trz kontenera okre\u015blane jest jako zarz\u0105dzanie uk\u0142adem (<em data-start=\"134\" data-end=\"153\">Layout-Management<\/em>). Ka\u017cdy kontener posiada mened\u017cera uk\u0142adu. Jest to obiekt, kt\u00f3ry przeprowadza obliczenia uk\u0142adu dla element\u00f3w znajduj\u0105cych si\u0119 w danym kontenerze.<\/p>\n<p data-start=\"304\" data-end=\"517\">Elementy przekazuj\u0105 mened\u017cerowi uk\u0142adu informacje dotycz\u0105ce wymaganego przez nie rozmiaru lub wyr\u00f3wnania. Na podstawie przyj\u0119tej strategii uk\u0142adu mened\u017cer uk\u0142adu decyduje, czy informacje te zostan\u0105 uwzgl\u0119dnione.<\/p>\n<p data-start=\"0\" data-end=\"80\">\u015arodowisko UI udost\u0119pnia pi\u0119ciu mened\u017cer\u00f3w uk\u0142adu (wi\u0119cej informacji znajduje si\u0119 w rozdziale <em>Mened\u017cery uk\u0142adu<\/em>):<\/p>\n<ul>\n<li data-start=\"84\" data-end=\"99\">BorderLayout<\/li>\n<li data-start=\"102\" data-end=\"114\">BoxLayout<\/li>\n<li data-start=\"117\" data-end=\"130\">FlowLayout<\/li>\n<li data-start=\"133\" data-end=\"150\">StandardLayout<\/li>\n<li data-start=\"153\" data-end=\"164\">XYLayout<\/li>\n<\/ul>\n<p data-start=\"166\" data-end=\"275\">Pierwsze trzy uk\u0142ady zachowuj\u0105 si\u0119 analogicznie do mened\u017cer\u00f3w uk\u0142adu o tych samych nazwach w AWT lub Swing.<\/p>\n<p data-start=\"277\" data-end=\"497\"><em>StandardLayout <\/em>jest najcz\u0119\u015bciej u\u017cywanym mened\u017cerem uk\u0142adu w systemie Comarch ERP Enterprise i oferuje specjalne wsparcie dla uk\u0142ad\u00f3w wielokolumnowych z polami oraz dla linii wyr\u00f3wnania (<em>Guides<\/em>) przebiegaj\u0105cych przez kontenery.<\/p>\n<p data-start=\"499\" data-end=\"721\"><em>XYLayout <\/em>umo\u017cliwia pikselowo dok\u0142adne pozycjonowanie element\u00f3w, jednak powinien by\u0107 stosowany wy\u0142\u0105cznie wtedy, gdy maj\u0105 by\u0107 rozmieszczane elementy niezale\u017cne od czcionek (ich rozmiar\u00f3w) i\/lub rozdzielczo\u015bci ekranu.<\/p>\n<p data-start=\"723\" data-end=\"1243\" data-is-last-node=\"\" data-is-only-node=\"\">Za ka\u017cdym razem, gdy element jest wstawiany do kontenera za pomoc\u0105 <em data-start=\"790\" data-end=\"795\">add<\/em>, nale\u017cy uwzgl\u0119dni\u0107 mened\u017cera uk\u0142adu ustawionego dla tego kontenera. Mened\u017cery uk\u0142adu (<em>BorderLayout, StandardLayout, XYLayout<\/em>) wymagaj\u0105 dodatkowych informacji (okre\u015blanych r\u00f3wnie\u017c jako <em data-start=\"980\" data-end=\"993\">constraints<\/em>) na potrzeby pozycjonowania w kontenerze. Informacje te nale\u017cy przekaza\u0107 jako dodatkowy parametr metody <em data-start=\"1098\" data-end=\"1103\">add<\/em>. Pozosta\u0142e mened\u017cery uk\u0142adu (<em>BoxLayout, FlowLayout<\/em>) rozmieszczaj\u0105 elementy po prostu w kolejno\u015bci, w jakiej zosta\u0142y dodane za pomoc\u0105 <em data-start=\"1237\" data-end=\"1242\">add<\/em>.<\/p>\n<h6 data-start=\"723\" data-end=\"1243\" id=\"ustawienia-menedzera-ukladu\" ><span class=\"ez-toc-section\" id=\"Ustawienia_menedzera_ukladu\"><\/span>Ustawienia mened\u017cera uk\u0142adu<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"43\" data-end=\"435\">W odr\u00f3\u017cnieniu od AWT lub Swing, dla kontener\u00f3w \u015brodowiska UI zawsze musi by\u0107 ustawiony mened\u017cer uk\u0142adu. Pozycjonowanie absolutne <em data-start=\"172\" data-end=\"189\">setLayout(null)<\/em> nie jest obs\u0142ugiwane. Mo\u017cna je obej\u015b\u0107 za pomoc\u0105 <em data-start=\"238\" data-end=\"248\">XYLayout<\/em>, jednak zasadniczo nie jest to zalecane, poniewa\u017c takie uk\u0142ady nie dostosowuj\u0105 si\u0119 przy zmianie rozmiaru okna, a ponadto s\u0105 zale\u017cne od okre\u015blonych rozdzielczo\u015bci ekranu i\/lub czcionek.<\/p>\n<p data-start=\"437\" data-end=\"589\">Ustawienie mened\u017cera uk\u0142adu powinno nast\u0119powa\u0107 zawsze bezpo\u015brednio podczas tworzenia kontenera, w szczeg\u00f3lno\u015bci przed dodaniem do kontenera element\u00f3w.<\/p>\n<p data-start=\"591\" data-end=\"738\">Mened\u017cer uk\u0142adu mo\u017cna zmieni\u0107 r\u00f3wnie\u017c p\u00f3\u017aniej, jednak w takim przypadku nale\u017cy najpierw usun\u0105\u0107 wszystkie elementy, a nast\u0119pnie doda\u0107 je ponownie.<\/p>\n<p data-start=\"740\" data-end=\"820\" data-is-last-node=\"\" data-is-only-node=\"\">Poni\u017cszy fragment kodu pokazuje, jak mo\u017cna ustawi\u0107 <em data-start=\"791\" data-end=\"805\">BorderLayout<\/em> dla kontenera:<\/p>\n<p data-start=\"740\" data-end=\"820\" data-is-last-node=\"\" data-is-only-node=\"\"><em>View view = new View();<\/em><br \/>\n<em>view.setLayout(new BorderLayout());<\/em><\/p>\n<h6 data-start=\"740\" data-end=\"820\" id=\"wskazowki-dla-menedzera-ukladu\" ><span class=\"ez-toc-section\" id=\"Wskazowki_dla_menedzera_ukladu\"><\/span>Wskaz\u00f3wki dla mened\u017cera uk\u0142adu<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"46\" data-end=\"229\">Elementy mog\u0105 przekazywa\u0107 mened\u017cerowi uk\u0142adu wskaz\u00f3wki lub wymagania dotycz\u0105ce ich rozmiaru albo wyr\u00f3wnania. W tym celu wszystkie <em data-start=\"176\" data-end=\"192\">VisualElements<\/em> posiadaj\u0105 nast\u0119puj\u0105ce w\u0142a\u015bciwo\u015bci:<\/p>\n<ul>\n<li data-start=\"233\" data-end=\"267\">preferredWidth, preferredHeight<\/li>\n<li data-start=\"270\" data-end=\"300\">minimumWidth, minimumHeight<\/li>\n<li data-start=\"303\" data-end=\"333\">maximumWidth, maximumHeight<\/li>\n<li data-start=\"336\" data-end=\"365\">alignmentX oraz alignmentY<\/li>\n<\/ul>\n<p data-start=\"367\" data-end=\"484\">R\u00f3\u017cne mened\u017cery uk\u0142adu uwzgl\u0119dniaj\u0105 te w\u0142a\u015bciwo\u015bci w zale\u017cno\u015bci od swojej strategii: w pe\u0142ni, cz\u0119\u015bciowo albo wcale.<\/p>\n<p data-start=\"486\" data-end=\"838\">Warto\u015bci standardowe wymienionych w\u0142a\u015bciwo\u015bci s\u0105 obliczane samodzielnie przez ka\u017cdy element na podstawie jego typu i\/lub zawarto\u015bci. Programista ma mo\u017cliwo\u015b\u0107 nadpisania ka\u017cdej z tych w\u0142a\u015bciwo\u015bci w\u0142asnymi warto\u015bciami, np. za pomoc\u0105 <em data-start=\"717\" data-end=\"736\">setMaximumWidth()<\/em>. Nadpisywanie metod typu <em>getter<\/em> nie jest jednak mo\u017cliwe lub nie prowadzi do oczekiwanego rezultatu.<\/p>\n<h6 data-start=\"486\" data-end=\"838\" id=\"odstepy\" ><span class=\"ez-toc-section\" id=\"Odstepy\"><\/span>Odst\u0119py<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"0\" data-end=\"111\">Istniej\u0105 r\u00f3\u017cne mo\u017cliwo\u015bci rozmieszczania element\u00f3w nie bezpo\u015brednio obok siebie, lecz z zachowaniem odst\u0119p\u00f3w:<\/p>\n<ul>\n<li data-start=\"115\" data-end=\"227\">Niekt\u00f3re mened\u017cery uk\u0142adu wspieraj\u0105 to bezpo\u015brednio, np. poprzez odpowiednie w\u0142a\u015bciwo\u015bci (np. <em data-start=\"209\" data-end=\"215\">hgap<\/em>, <em data-start=\"217\" data-end=\"223\">vgap<\/em>)<\/li>\n<li data-start=\"230\" data-end=\"357\">Wstawianie niewidocznych element\u00f3w. W szczeg\u00f3lno\u015bci do zastosowania z <em data-start=\"302\" data-end=\"313\">BoxLayout<\/em> dost\u0119pne s\u0105 elementy <em data-start=\"335\" data-end=\"341\">Glue<\/em> oraz <em data-start=\"347\" data-end=\"354\">Strut<\/em>.<\/li>\n<li data-start=\"360\" data-end=\"493\">Stosowanie <em data-start=\"371\" data-end=\"380\">Margins<\/em>. Pozwala to okre\u015bli\u0107 dla elementu lub kontenera, jak du\u017cy ma by\u0107 odst\u0119p pomi\u0119dzy jego kraw\u0119dzi\u0105 a zawarto\u015bci\u0105<\/li>\n<li data-start=\"496\" data-end=\"713\">Stosowanie <em data-start=\"507\" data-end=\"520\">EmptyBorder<\/em>. Odst\u0119p od kraw\u0119dzi wynika w tym przypadku z grubo\u015bci niewidocznej ramki. Efekt jest taki sam jak przy u\u017cyciu <em data-start=\"633\" data-end=\"642\">Margins<\/em>, jednak ze wzgl\u0119du na przejrzysto\u015b\u0107 zaleca si\u0119 stosowanie <em data-start=\"701\" data-end=\"710\">Margins<\/em>.<\/li>\n<\/ul>\n<h5 id=\"visualelement\" ><span class=\"ez-toc-section\" id=\"VisualElement\"><\/span>VisualElement<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"741\" data-end=\"924\">Klasa <em data-start=\"747\" data-end=\"780\">com.cisag.pgm.gui.VisualElement<\/em> jest klas\u0105 bazow\u0105 dla wszystkich komponent\u00f3w wizualnych \u015brodowiska GUI. Definiuje podstawowe w\u0142a\u015bciwo\u015bci wszystkich element\u00f3w \u2014 podobnie jak:<\/p>\n<ul>\n<li data-start=\"928\" data-end=\"963\"><em data-start=\"928\" data-end=\"948\">java.awt.Component<\/em> dla AWT<\/li>\n<li data-start=\"966\" data-end=\"1003\"><em data-start=\"966\" data-end=\"990\">javax.swing.JComponent<\/em> dla Swing<\/li>\n<\/ul>\n<p data-start=\"1005\" data-end=\"1059\">Do tych podstawowych w\u0142a\u015bciwo\u015bci nale\u017c\u0105 na przyk\u0142ad:<\/p>\n<ul>\n<li data-start=\"1063\" data-end=\"1079\">identyfikacja<\/li>\n<li data-start=\"1082\" data-end=\"1108\">w\u0142a\u015bciwo\u015bci prezentacji<\/li>\n<li data-start=\"1111\" data-end=\"1154\">stany (<em data-start=\"1118\" data-end=\"1127\">enabled<\/em>, <em data-start=\"1129\" data-end=\"1139\">editable<\/em>, <em data-start=\"1141\" data-end=\"1150\">visible<\/em>)<\/li>\n<li data-start=\"1157\" data-end=\"1202\">wsparcie (wskaz\u00f3wki) dla mened\u017cer\u00f3w uk\u0142adu<\/li>\n<li data-start=\"1205\" data-end=\"1242\">wsparcie dla sterowania klawiatur\u0105<\/li>\n<li data-start=\"1245\" data-end=\"1271\">wsparcie dla metadanych<\/li>\n<li data-start=\"1274\" data-end=\"1292\">obs\u0142uga zdarze\u0144<\/li>\n<li data-start=\"1295\" data-end=\"1350\"><em data-start=\"1295\" data-end=\"1305\">ToolTips<\/em>, pomoc bezpo\u015brednia oraz menu kontekstowe<\/li>\n<\/ul>\n<h6 id=\"identyfikacja\" ><span class=\"ez-toc-section\" id=\"Identyfikacja\"><\/span>Identyfikacja<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"0\" data-end=\"497\">Ka\u017cdemu <em data-start=\"8\" data-end=\"23\">VisualElement<\/em> podczas instancjowania nale\u017cy przypisa\u0107 identyfikator GUID. Za pomoc\u0105 tego identyfikatora mo\u017cna w dowolnym momencie zidentyfikowa\u0107 dany element. Jest to konieczne, je\u015bli p\u00f3\u017aniej dla elementu maj\u0105 zosta\u0107 zdefiniowane specjalne uprawnienia. Istotne jest, aby z jednej strony rozr\u00f3\u017cniane <em data-start=\"309\" data-end=\"325\">VisualElements<\/em> faktycznie mia\u0142y przypisane r\u00f3\u017cne identyfikatory GUID, a z drugiej strony \u2014 aby identyfikator GUID dla element\u00f3w, kt\u00f3re maj\u0105 by\u0107 identyfikowane, zawsze pozostawa\u0142 sta\u0142y.<\/p>\n<p data-start=\"499\" data-end=\"912\">Je\u015bli aplikacja instancjuje pole <em>Numer artyku\u0142u<\/em>, w\u00f3wczas temu polu przypisywany jest identyfikator GUID. Ka\u017cda instancja tej aplikacji posiada w\u0142asn\u0105 instancj\u0119 pola <em>Numer artyku\u0142u<\/em>, ale instancje te maj\u0105 ten sam identyfikator GUID. Je\u015bli w tej samej aplikacji instancjowane jest drugie pole, np. <i>Cena<\/i>, w\u00f3wczas musi ono mie\u0107 inny identyfikator GUID ni\u017c pole <em>Numer artyku\u0142u<\/em>.<\/p>\n<p data-start=\"914\" data-end=\"1086\">Je\u017celi natomiast inna aplikacja r\u00f3wnie\u017c wykorzystuje pole <em>Numer artyku\u0142u<\/em>, to z regu\u0142y nale\u017cy za\u0142o\u017cy\u0107, \u017ce jest to inne pole \u2014 dlatego identyfikatory GUID musz\u0105 by\u0107 r\u00f3\u017cne.<\/p>\n<p data-start=\"1088\" data-end=\"1379\">Okre\u015blenie identyfikatora GUID jest mo\u017cliwe wy\u0142\u0105cznie w konstruktorze danego elementu, tzn. w klasach dziedzicz\u0105cych po <em data-start=\"1208\" data-end=\"1223\">VisualElement<\/em>, i nie mo\u017ce zosta\u0107 p\u00f3\u017aniej zmienione. W aktualnej wersji Comarch ERP Enterprise niekt\u00f3re podklasy (np. <em data-start=\"1314\" data-end=\"1322\">Button<\/em>) nie wspieraj\u0105 jeszcze podawania identyfikator\u00f3w GUID.<\/p>\n<p data-start=\"1381\" data-end=\"1748\" data-is-last-node=\"\" data-is-only-node=\"\">Aby upro\u015bci\u0107 nadawanie identyfikator\u00f3w GUID, \u015brodowisko deweloperskie wspiera warto\u015b\u0107 <em data-start=\"1467\" data-end=\"1505\">com.cisag.pgm.datatype.Guid.AUTOGUID<\/em>. T\u0119 sta\u0142\u0105 mo\u017cna stosowa\u0107 w miejscach, w kt\u00f3rych (jednorazowo) ma zosta\u0107 nadany identyfikator GUID. Podczas weryfikacji automatycznie wyliczany jest nowy identyfikator GUID, a tekst <em data-start=\"1686\" data-end=\"1724\">com.cisag.pgm.datatype.Guid.AUTOGUID<\/em> zostaje nim zast\u0105piony.<\/p>\n<p data-start=\"1381\" data-end=\"1748\" data-is-last-node=\"\" data-is-only-node=\"\"><em>TextField field =<\/em><br \/>\n<em>new TextField(Guid.AUTOGUID, &#8230;);<\/em><\/p>\n<p data-start=\"1381\" data-end=\"1748\" data-is-last-node=\"\" data-is-only-node=\"\">przyk\u0142adowo zostaje zast\u0105pione przez:<\/p>\n<p data-start=\"1381\" data-end=\"1748\" data-is-last-node=\"\" data-is-only-node=\"\"><em>TextField field = new TextField(<\/em><br \/>\n<em>&#8222;01E09C573EC51E10AC1C8464641F0000&#8221;, &#8230;);<\/em><\/p>\n<h6 data-start=\"1381\" data-end=\"1748\" id=\"metadane\" ><span class=\"ez-toc-section\" id=\"Metadane\"><\/span>Metadane<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"24\" data-end=\"444\">Podczas tworzenia aplikacji dla Comarch ERP Enterprise metadane odgrywaj\u0105 wa\u017cn\u0105 rol\u0119. Ma to r\u00f3wnie\u017c silny wp\u0142yw na spos\u00f3b programowania interfejsu GUI aplikacji Comarch ERP Enterprise. Metadane (np. dla atrybut\u00f3w lub logicznych typ\u00f3w danych) s\u0105 utrzymywane w repozytorium, dlatego nale\u017cy unika\u0107 redundancji w kodzie GUI. W przeciwnym razie ka\u017cda zmiana wymaga\u0142aby wielokrotnej aktualizacji, co cz\u0119\u015bciowo niwelowa\u0142oby sens stosowania metadanych.<\/p>\n<p data-start=\"446\" data-end=\"891\">\u015arodowisko UI wspiera tworzenie element\u00f3w GUI na podstawie metadanych. Aby na przyk\u0142ad skonfigurowa\u0107 pole tekstowe tak, aby przedstawia\u0142o okre\u015blony atrybut obiektu biznesowego, wystarczy w konstruktorze poda\u0107 (w pe\u0142ni kwalifikowan\u0105) nazw\u0119 atrybutu. Dzi\u0119ki temu pole tekstowe automatycznie otrzymuje w\u0142a\u015bciw\u0105 etykiet\u0119 (<em data-start=\"764\" data-end=\"771\">Label<\/em>), podpowied\u017a (<em data-start=\"786\" data-end=\"795\">ToolTip<\/em>), pomoc bezpo\u015bredni\u0105, a w razie potrzeby r\u00f3wnie\u017c funkcj\u0119 wyszukiwania i\/lub menu kontekstowe.<\/p>\n<p data-start=\"893\" data-end=\"1198\">Podobne wsparcie dost\u0119pne jest tak\u017ce dla przycisk\u00f3w oraz innych element\u00f3w. W przypadku przycisk\u00f3w lub wpis\u00f3w menu nie s\u0105 jednak referencjonowane metadane atrybutu, lecz metadane <em data-start=\"1071\" data-end=\"1079\">Action<\/em>. Programista nie musi zajmowa\u0107 si\u0119 lokalizacj\u0105 tekst\u00f3w \u2014 zadanie to jest automatycznie realizowane przez \u015brodowisko.<\/p>\n<p data-start=\"1200\" data-end=\"1550\">Zasadniczo podczas instancjowania element\u00f3w GUI w konstruktorze nale\u017cy przekaza\u0107 \u015bcie\u017ck\u0119. \u015acie\u017cka ta okre\u015bla obiekty deweloperskie z repozytorium, kt\u00f3rych dane maj\u0105 zosta\u0107 wykorzystane do inicjalizacji elementu GUI. W zale\u017cno\u015bci od rodzaju elementu GUI mog\u0105 by\u0107 stosowane r\u00f3\u017cne obiekty deweloperskie. Poni\u017cej znajduje si\u0119 (niepe\u0142ny) przegl\u0105d:<\/p>\n<ul>\n<li data-start=\"1200\" data-end=\"1550\"><strong>Fields<\/strong> &#8212;\u00a0atrybut, logiczny typ danych, <em data-start=\"1614\" data-end=\"1631\">DataDescription<\/em><\/li>\n<li data-start=\"1200\" data-end=\"1550\"><strong style=\"font-size: revert; color: initial;\" data-start=\"1637\" data-end=\"1658\">Actions, Buttons <\/strong>&#8212;\u00a0<em data-start=\"1665\" data-end=\"1673\">Action<\/em><\/li>\n<li data-start=\"1200\" data-end=\"1550\"><strong style=\"font-size: revert; color: initial;\" data-start=\"1679\" data-end=\"1688\">Icon <\/strong>&#8212; <em data-start=\"1695\" data-end=\"1701\">Icon<\/em><\/li>\n<li data-start=\"1200\" data-end=\"1550\"><strong style=\"font-size: revert; color: initial;\" data-start=\"1707\" data-end=\"1730\">Label, GroupBox, \u2026 <\/strong>&#8212;\u00a0<em data-start=\"1737\" data-end=\"1750\">StringTable<\/em><\/li>\n<\/ul>\n<p data-start=\"1754\" data-end=\"1975\">W po\u0142\u0105czeniu z kontenerami mo\u017cliwe jest r\u00f3wnie\u017c stosowanie \u015bcie\u017cek wzgl\u0119dnych, tzn. dla kontenera okre\u015blany jest pewien \u015bcie\u017cka bazowa, a dla znajduj\u0105cych si\u0119 w nim p\u00f3l podawana jest jedynie pozosta\u0142a cz\u0119\u015b\u0107 \u015bcie\u017cki.<\/p>\n<p data-start=\"1977\" data-end=\"2174\">W artykule <em data-start=\"1990\" data-end=\"2011\">Podr\u0119cznik programowania<\/em> bardziej szczeg\u00f3\u0142owo om\u00f3wiono logiczne typy danych, natomiast w artykule<em> Opis danych<\/em>\u00a0opisano, jakie w\u0142a\u015bciwo\u015bci UI mog\u0105 by\u0107 definiowane w repozytorium.<\/p>\n<p data-start=\"2176\" data-end=\"2251\">\u015arodowisko UI wykorzystuje do reprezentacji metadanych nast\u0119puj\u0105ce klasy:<\/p>\n<ul>\n<li data-start=\"2255\" data-end=\"2301\"><em data-start=\"2255\" data-end=\"2299\">com.cisag.pgm.dialog.model.DataDescription<\/em><\/li>\n<li data-start=\"2304\" data-end=\"2352\"><em>com.cisag.pgm.dialog.model.ActionDescription<\/em><\/li>\n<\/ul>\n<p data-start=\"2354\" data-end=\"2543\">Odpowiednie instancje s\u0105 tworzone automatycznie na podstawie \u015bcie\u017cki. Istnieje r\u00f3wnie\u017c mo\u017cliwo\u015b\u0107 tworzenia w\u0142asnych instancji <em data-start=\"2480\" data-end=\"2497\">DataDescription<\/em> i wykorzystywania ich do inicjalizacji p\u00f3l.<\/p>\n<h5 data-start=\"2354\" data-end=\"2543\" id=\"obsluga-zdarzen-actions\" ><span class=\"ez-toc-section\" id=\"Obsluga_zdarzen_Actions\"><\/span>Obs\u0142uga zdarze\u0144 (Actions)<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"0\" data-end=\"78\">Obs\u0142uga zdarze\u0144 w <em data-start=\"18\" data-end=\"37\">com.cisag.pgm.gui<\/em> r\u00f3\u017cni si\u0119 nieco od modelu w AWT\/Swing:<\/p>\n<ul>\n<li data-start=\"80\" data-end=\"267\">Zamiast wielu r\u00f3\u017cnych typ\u00f3w zdarze\u0144 i listener\u00f3w istniej\u0105 tylko klasy <em data-start=\"157\" data-end=\"183\">com.cisag.pgm.gui.Action<\/em> jako zdarzenie oraz <em data-start=\"208\" data-end=\"242\">com.cisag.pgm.gui.ActionListener<\/em> jako listener zdarze\u0144<\/li>\n<li data-start=\"80\" data-end=\"267\"><span style=\"font-size: revert; color: initial;\">Podobnie jak w <\/span><em style=\"font-size: revert; color: initial;\" data-start=\"286\" data-end=\"306\">javax.swing.Action<\/em><span style=\"font-size: revert; color: initial;\">, instancje klasy <\/span><em style=\"font-size: revert; color: initial;\" data-start=\"324\" data-end=\"350\">com.cisag.pgm.gui.Action<\/em><span style=\"font-size: revert; color: initial;\"> posiadaj\u0105 stan (np. <\/span><em style=\"font-size: revert; color: initial;\" data-start=\"371\" data-end=\"380\">enabled<\/em><span style=\"font-size: revert; color: initial;\">) oraz informacje do wizualizacji (tekst, ikony, podpowiedzi <\/span><em style=\"font-size: revert; color: initial;\" data-start=\"441\" data-end=\"450\">ToolTip<\/em><span style=\"font-size: revert; color: initial;\">). W przeciwie\u0144stwie do <\/span><em style=\"font-size: revert; color: initial;\" data-start=\"474\" data-end=\"494\">javax.swing.Action<\/em><span style=\"font-size: revert; color: initial;\"> funkcjonalno\u015b\u0107 ta nie jest przypisana do listenera, lecz do samego zdarzenia.<\/span><\/li>\n<li data-start=\"80\" data-end=\"267\"><span style=\"font-size: revert; color: initial;\">Wszystkie zdarzenia posiadaj\u0105 identyfikator (<em>id<\/em>) typu <em>int<\/em>, co u\u0142atwia centraln\u0105 obs\u0142ug\u0119 zdarze\u0144 przy u\u017cyciu instrukcji <em>switch<\/em><\/span><\/li>\n<li data-start=\"80\" data-end=\"267\"><span style=\"font-size: revert; color: initial;\">Niekt\u00f3re elementy (np. przyciski) mog\u0105 by\u0107 tworzone wy\u0142\u0105cznie poprzez <em>Actions<\/em><\/span><\/li>\n<\/ul>\n<h5 id=\"look-feel\" ><span class=\"ez-toc-section\" id=\"Look_Feel\"><\/span><em>Look &amp; Feel<\/em><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"948\" data-end=\"1378\">Podobnie jak Swing, Comarch ERP Enterprise wspiera wymienne <em data-start=\"995\" data-end=\"1008\">Look &amp; Feel<\/em>, tzn. wygl\u0105d i zachowanie interfejsu (GUI) mog\u0105 by\u0107 w pewnych granicach zmieniane lub dostosowywane do w\u0142asnych potrzeb (gustu). Aktualna wersja Comarch ERP Enterprise umo\u017cliwia u\u017cytkownikowi np. wyb\u00f3r pomi\u0119dzy r\u00f3\u017cnymi tematami (<em data-start=\"1227\" data-end=\"1235\">Themes<\/em>), przy czym obecne tematy r\u00f3\u017cni\u0105 si\u0119 jedynie zestawieniem kolor\u00f3w. Ponadto u\u017cytkownik mo\u017ce wp\u0142ywa\u0107 na wielko\u015b\u0107 czcionki (lub rozdzielczo\u015b\u0107).<\/p>\n<p data-start=\"1380\" data-end=\"1611\">Niezale\u017cnie od mo\u017cliwo\u015bci dostosowania interfejsu przez u\u017cytkownika, wszystkie aplikacje w Comarch ERP Enterprise powinny mie\u0107 mo\u017cliwie jednolity wygl\u0105d i zachowanie. Z tego powodu zdefiniowano odpowiednie <em>style guide<\/em> dla aplikacji Comarch ERP Enterprise.<\/p>\n<p data-start=\"1613\" data-end=\"1802\">Obszar UI w Comarch ERP Enterprise wspiera te wymagania, poniewa\u017c w\u0142a\u015bciwo\u015bci element\u00f3w istotne dla <em data-start=\"1700\" data-end=\"1713\">Look &amp; Feel<\/em> s\u0105 w miar\u0119 mo\u017cliwo\u015bci automatycznie (ew. dynamicznie) ustalane lub wst\u0119pnie ustawiane.<\/p>\n<p data-start=\"1804\" data-end=\"2027\">Jawne ustawianie lub zmienianie tych w\u0142a\u015bciwo\u015bci (np. koloru, odst\u0119p\u00f3w, ramek, czcionki itd.) jest zazwyczaj niepotrzebne, a nawet mo\u017ce by\u0107 szkodliwe, je\u015bli stoi w sprzeczno\u015bci ze <em>style guide<\/em> lub ustawieniami u\u017cytkownika.<\/p>\n<p data-start=\"2029\" data-end=\"2285\">W przypadkach, kt\u00f3re nie s\u0105 wyra\u017anie uwzgl\u0119dnione w obszarze UI lub w <em>style guide<\/em>, programista mo\u017ce poprzez klas\u0119 <em data-start=\"2143\" data-end=\"2172\">com.cisag.pgm.gui.UIManager<\/em> uzyska\u0107 po\u015bredni dost\u0119p, tj. za pomoc\u0105 nazw symbolicznych, do puli standardowych kolor\u00f3w, odst\u0119p\u00f3w i czcionek.<\/p>\n<p data-start=\"2287\" data-end=\"2380\">W ten spos\u00f3b pozostaje zagwarantowane, \u017ce dostosowania u\u017cytkownika nadal b\u0119d\u0105 uwzgl\u0119dniane.<\/p>\n<h5 data-start=\"2287\" data-end=\"2380\" id=\"sterowanie-klawiatura\" ><span class=\"ez-toc-section\" id=\"Sterowanie_klawiatura\"><\/span>Sterowanie klawiatur\u0105<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"2287\" data-end=\"2380\">Aby optymalnie wspiera\u0107 u\u017cytkownik\u00f3w Comarch ERP Enterprise w obs\u0142udze, wszystkie funkcje powinny by\u0107 w miar\u0119 mo\u017cliwo\u015bci dost\u0119pne r\u00f3wnie\u017c bez myszy, poprzez sterowanie klawiatur\u0105. Szczeg\u00f3lnie w przypadku powtarzalnych czynno\u015bci (np. wprowadzanie danych) sp\u00f3jne sterowanie klawiatur\u0105 sprzyja efektywnej pracy. Dalsze wskaz\u00f3wki na ten temat znajduj\u0105 si\u0119 w artykule <em>Comarch ERP Enterprise Style Guide<\/em>.<\/p>\n<p data-start=\"2913\" data-end=\"2976\">Obszar UI wspiera sterowanie klawiatur\u0105 na r\u00f3\u017cnych poziomach:<\/p>\n<ul>\n<li data-start=\"2913\" data-end=\"2976\">sterowanie fokusem<\/li>\n<li data-start=\"2913\" data-end=\"2976\">klawisze dost\u0119pu (<em data-start=\"3022\" data-end=\"3035\">Access Keys<\/em>)<\/li>\n<li data-start=\"2913\" data-end=\"2976\">skr\u00f3ty (<em data-start=\"3054\" data-end=\"3065\">Shortcuts<\/em>)<\/li>\n<\/ul>\n<h6 id=\"sterowanie-fokusem\" ><span class=\"ez-toc-section\" id=\"Sterowanie_fokusem\"><\/span>Sterowanie fokusem<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"0\" data-end=\"281\">Fokus klawiatury okre\u015bla aktywny element UI, na kt\u00f3ry wp\u0142ynie nast\u0119pne wprowadzenie z klawiatury przez u\u017cytkownika. Opr\u00f3cz klikni\u0119cia mysz\u0105 u\u017cytkownik mo\u017ce zmienia\u0107 element z fokusem r\u00f3wnie\u017c za pomoc\u0105 klawiatury. Sterowanie fokusem stanowi zatem alternatywn\u0105 mo\u017cliwo\u015b\u0107 nawigacji.<\/p>\n<p data-start=\"283\" data-end=\"588\">Obszar UI wykorzystuje mened\u017cera fokusu, kt\u00f3ry steruje i kontroluje zmian\u0119 fokusu przy u\u017cyciu klawiatury. Jego podstawow\u0105 funkcj\u0105 jest umo\u017cliwienie nawigacji pomi\u0119dzy elementami interfejsu przy u\u017cyciu klawiatury. W tym celu mened\u017cer fokusu \u2013 zgodnie z powszechn\u0105 praktyk\u0105 \u2013 wykorzystuje klawisz [<strong>TAB<\/strong>]:<\/p>\n<ul>\n<li data-start=\"283\" data-end=\"588\">Za pomoc\u0105 [<strong>TAB<\/strong>] przechodzi si\u0119 z jednego elementu do nast\u0119pnego elementu<\/li>\n<li data-start=\"283\" data-end=\"588\">Za pomoc\u0105 [<strong>SHIFT<\/strong>]+[<strong>TAB<\/strong>] przechodzi si\u0119 do poprzedniego elementu<\/li>\n<\/ul>\n<p>Kolejno\u015b\u0107 [<strong>TAB<\/strong>] element\u00f3w jest przy tym zazwyczaj ustalana automatycznie przez mened\u017cera fokusu. Wyprowadza on t\u0119 kolejno\u015b\u0107 zasadniczo na podstawie rozmieszczenia element\u00f3w na ekranie, poruszaj\u0105c si\u0119 wierszami od lewej do prawej oraz z g\u00f3ry na d\u00f3\u0142. Elementy niewidoczne, nieedytowalne lub <em>disabled<\/em> s\u0105 automatycznie wy\u0142\u0105czane (pomijane). Programista ma jednak mo\u017cliwo\u015b\u0107 wp\u0142ywania na to zachowanie:<\/p>\n<ul>\n<li data-start=\"1142\" data-end=\"1409\">Za pomoc\u0105 <em data-start=\"1154\" data-end=\"1186\">setFocusTraversable(boolean b)<\/em> mo\u017cna okre\u015bli\u0107 dla danego elementu, czy ma on by\u0107 w og\u00f3le osi\u0105galny przy u\u017cyciu [<strong>TAB<\/strong>] lub [<strong>SHIFT<\/strong>]+[<strong>TAB<\/strong>]. Przy warto\u015bci <em data-start=\"1304\" data-end=\"1311\">false<\/em> dany element jest pomijany przy u\u017cyciu [<strong>TAB<\/strong>], ale z regu\u0142y nadal mo\u017ce zosta\u0107 wybrany za pomoc\u0105 myszy.<\/li>\n<\/ul>\n<p data-start=\"1411\" data-end=\"1766\">Mened\u017cer fokusu uwzgl\u0119dnia r\u00f3wnie\u017c w\u0142a\u015bciwo\u015b\u0107 elementu <em data-start=\"1466\" data-end=\"1482\">focusCycleRoot<\/em>. W przypadku element\u00f3w posiadaj\u0105cych podelementy (kontenery, tabele) w\u0142a\u015bciwo\u015b\u0107 ta powoduje, \u017ce fokus klawiatury nie opuszcza danego elementu, lecz kr\u0105\u017cy pomi\u0119dzy jego podelementami. Opuszczenie takiego elementu jest w\u00f3wczas mo\u017cliwe tylko za pomoc\u0105 [<strong>CTRL<\/strong>]+[<strong>G<\/strong>] lub [<strong>CTRL<\/strong>]+[<strong>SHIFT<\/strong>]+[<strong>G<\/strong>].<\/p>\n<p data-start=\"1411\" data-end=\"1766\">W aktualnej wersji Comarch ERP Enterprise w\u0142a\u015bciwo\u015b\u0107 t\u0119 mo\u017cna wprawdzie sprawdzi\u0107 przy u\u017cyciu <em data-start=\"1977\" data-end=\"1997\">isFocusCycleRoot()<\/em>, jednak nie mo\u017cna jej zmienia\u0107.<\/p>\n<h6 id=\"access-keys-mnemonics\" ><span class=\"ez-toc-section\" id=\"Access_Keys_Mnemonics\"><\/span>Access Keys (<em>Mnemonics<\/em>)<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"2071\" data-end=\"2374\">Dla wszystkich element\u00f3w posiadaj\u0105cych etykiet\u0119 (pola, przyciski, pozycje menu) mo\u017cna zdefiniowa\u0107 <em>Access Key<\/em> (mnemonik). Jest to klawisz alfanumeryczny, kt\u00f3ry u\u017cyty w po\u0142\u0105czeniu z klawiszem [<strong>ALT<\/strong>] powoduje przej\u015bcie do danego elementu interfejsu oraz jego aktywacj\u0119 lub ustawienie fokusu wej\u015bciowego.<\/p>\n<p data-start=\"2376\" data-end=\"2710\">Definicja <em>Access Key<\/em> nast\u0119puje poprzez wstawienie znaku <em>&amp;<\/em> przed wybranym znakiem w tek\u015bcie etykiety. Aby zasygnalizowa\u0107 u\u017cytkownikowi, czy i za pomoc\u0105 kt\u00f3rego klucz dost\u0119pu element jest dost\u0119pny lub mo\u017cliwy do aktywacji, odpowiedni znak w tek\u015bcie etykiety jest wyr\u00f3\u017cniany podkre\u015bleniem.<\/p>\n<p data-start=\"2712\" data-end=\"2896\">Zazwyczaj etykiety element\u00f3w s\u0105 definiowane w repozytorium (<em data-start=\"2772\" data-end=\"2789\">DataDescription<\/em> lub <em data-start=\"2794\" data-end=\"2802\">Action<\/em>). W odpowiednim obiekcie deweloperskim znak <em>&amp;<\/em> nale\u017cy po prostu wprowadzi\u0107 w polu <em>Label<\/em>.<\/p>\n<h6 data-start=\"2712\" data-end=\"2896\" id=\"shortcuts-accelerators\" ><span class=\"ez-toc-section\" id=\"Shortcuts_Accelerators\"><\/span>Shortcuts (<em>Accelerators<\/em>)<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"2937\" data-end=\"3074\"><em>Shortcuts<\/em> (<em>Accelerators<\/em>) to klawisze lub kombinacje klawiszy, kt\u00f3re umo\u017cliwiaj\u0105 u\u017cytkownikom szybki dost\u0119p do cz\u0119sto u\u017cywanych funkcji.<\/p>\n<p data-start=\"3076\" data-end=\"3377\">[<strong>CTRL<\/strong>] + klawisz oraz klawisze funkcyjne ([<strong>F1<\/strong>] do [<strong>F12<\/strong>]) s\u0105 z regu\u0142y najlepiej przystosowane jako skr\u00f3ty. Wskaz\u00f3wki dotycz\u0105ce prawid\u0142owego stosowania skr\u00f3t\u00f3w znajduj\u0105 si\u0119 w artykule <em>Comarch ERP Enterprise Styleguide<\/em>. Przegl\u0105d ju\u017c u\u017cywanych\/przypisanych skr\u00f3t\u00f3w znajduje si\u0119 w artykule <em>Podr\u0119cznik obs\u0142ugi<\/em>.<\/p>\n<p data-start=\"3379\" data-end=\"3583\">Definicja (rejestracja) skr\u00f3t\u00f3w odbywa si\u0119 przy u\u017cyciu metod <em data-start=\"3442\" data-end=\"3476\">registerKeyStroke(Action action)<\/em> lub <em data-start=\"3483\" data-end=\"3535\">registerKeyStroke(String keyStroke, Action action) <\/em>w klasie <em data-start=\"3547\" data-end=\"3580\">com.cisag.pgm.gui.VisualElement<\/em>.<\/p>\n<p data-start=\"3585\" data-end=\"3842\">W metodzie <em data-start=\"3596\" data-end=\"3630\">registerKeyStroke(Action action)<\/em> kombinacja klawiszy (<em data-start=\"3652\" data-end=\"3663\">KeyStroke<\/em>) jest pobierana z metadanych <em>Action<\/em> (repozytorium). Natomiast w metodzie <em data-start=\"3737\" data-end=\"3789\">registerKeyStroke(String keyStroke, Action action)<\/em> jest ona okre\u015blana bezpo\u015brednio przez programist\u0119.<\/p>\n<p data-start=\"3844\" data-end=\"4087\">Przy specyfikacji <em data-start=\"3862\" data-end=\"3873\">keyStroke<\/em> w przypadku znak\u00f3w drukowalnych (ASCII 33 do 127) nale\u017cy u\u017cy\u0107 bezpo\u015brednio odpowiedniego znaku, a w przypadku znak\u00f3w niedrukowalnych lub klawiszy funkcyjnych \u2013 angielskiej nazwy (wielkimi literami). Przyk\u0142ady:<\/p>\n<ul>\n<li data-start=\"3844\" data-end=\"4087\">[<strong>a<\/strong>]<\/li>\n<li data-start=\"3844\" data-end=\"4087\">[<strong>ENTER<\/strong>]<\/li>\n<li data-start=\"3844\" data-end=\"4087\">[<strong>SPACE<\/strong>]<\/li>\n<li data-start=\"3844\" data-end=\"4087\">[<strong>F2<\/strong>]<\/li>\n<\/ul>\n<p data-start=\"4138\" data-end=\"4246\">Je\u015bli zamiast pojedynczego klawisza ma zosta\u0107 zdefiniowana kombinacja klawiszy, mo\u017cna to wyrazi\u0107 np. jako:<\/p>\n<ul>\n<li data-start=\"4138\" data-end=\"4246\">[<strong>CTRL<\/strong>]+[<strong>F2<\/strong>]<\/li>\n<li data-start=\"4138\" data-end=\"4246\">[<strong>ALT<\/strong>]+[<strong>SHIFT<\/strong>]+[<strong>F10<\/strong>]<\/li>\n<li data-start=\"4138\" data-end=\"4246\">[<strong>ALT<\/strong>]+[<strong>SHIFT<\/strong>]+[<strong>a<\/strong>]<\/li>\n<\/ul>\n<p data-start=\"4307\" data-end=\"4614\">Element, w kt\u00f3rym zarejestrowano skr\u00f3t przy u\u017cyciu <em data-start=\"4361\" data-end=\"4380\">registerKeyStroke<\/em>, stanowi jednocze\u015bnie kontekst, w kt\u00f3rym ten skr\u00f3t dzia\u0142a. Fokus klawiatury musi znajdowa\u0107 si\u0119 w tym elemencie lub (w przypadku kontener\u00f3w) w jednym z jego podelement\u00f3w, aby zarejestrowana <em>Action<\/em> zosta\u0142a wykonana po u\u017cyciu skr\u00f3tu.<\/p>\n<p data-start=\"4616\" data-end=\"4842\">Mo\u017cliwe jest przypisanie dw\u00f3ch r\u00f3\u017cnych <em>Actions<\/em> do tego samego skr\u00f3tu, je\u015bli rejestracja nast\u0119puje w r\u00f3\u017cnych elementach. To, czy i kt\u00f3ra <em>Action<\/em> zostanie wykonana, zale\u017cy od tego, czy i kt\u00f3ry element posiada\u0142 fokus klawiatury.<\/p>\n<p data-start=\"4844\" data-end=\"5221\">R\u0119czna rejestracja skr\u00f3t\u00f3w jest rzadko konieczna, poniewa\u017c wi\u0119kszo\u015b\u0107 odpowiednich funkcji (<em>Actions<\/em>) jest rejestrowana automatycznie. Dotyczy to np. wszystkich <em>Actions<\/em>, kt\u00f3re s\u0105 wstawiane jako przycisk lub SmartButton w <em>MainCoolBar<\/em>. W takich przypadkach <em>MainCoolBar<\/em> przejmuje rejestracj\u0119 skr\u00f3tu zdefiniowanego w repozytorium. Podobnie dzia\u0142aj\u0105 paski narz\u0119dzi list i tabel.<\/p>\n<h5 data-start=\"4844\" data-end=\"5221\" id=\"komunikaty\" ><span class=\"ez-toc-section\" id=\"Komunikaty\"><\/span>Komunikaty<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Dla aplikacji Comarch ERP Enterprise obowi\u0105zuje zasada, \u017ce dialogi (w szczeg\u00f3lno\u015bci modalne) powinny by\u0107 stosowane wy\u0142\u0105cznie wtedy, gdy rzeczywi\u015bcie konieczne jest, aby u\u017cytkownik w danym momencie podj\u0105\u0142 decyzj\u0119. Na przyk\u0142ad wtedy, gdy chce za\u0142adowa\u0107 nowy obiekt, ale zmienione dane poprzedniego obiektu nie zosta\u0142y jeszcze zapisane.<\/p>\n<p>Zasadniczo u\u017cytkownik powinien sam decydowa\u0107, w jakiej kolejno\u015bci wprowadza dane. Dotyczy to r\u00f3wnie\u017c sytuacji, w kt\u00f3rych system stwierdzi, \u017ce niekt\u00f3re wprowadzone dane s\u0105 niepoprawne\/niewa\u017cne. U\u017cytkownik nie powinien w \u017cadnym wypadku by\u0107 uwi\u0119ziony w polu zawieraj\u0105cym b\u0142\u0105d, dop\u00f3ki nie wprowadzi poprawnej warto\u015bci. Nie powinien tak\u017ce by\u0107 ograniczany w p\u0142ynnym wprowadzaniu danych przez natarczywe dialogi, Wa\u017cne wskaz\u00f3wki na ten temat znajduj\u0105 si\u0119 r\u00f3wnie\u017c w artykule <em data-start=\"953\" data-end=\"988\">Comarch ERP Enterprise Styleguide<\/em>).<\/p>\n<p>W Comarch ERP Enterprise komunikaty s\u0105 wy\u015bwietlane na specjalnej stronie komunikat\u00f3w (w nag\u0142\u00f3wku) i\/lub w pasku statusu. W przypadku komunikat\u00f3w odnosz\u0105cych si\u0119 do p\u00f3l dodatkowo oznaczane jest odpowiednie pole (czerwony r\u00f3g).<\/p>\n<p>W przypadku komunikat\u00f3w (powi\u0105zanych z polem) rozr\u00f3\u017cnia si\u0119 dwa rodzaje:<\/p>\n<ul>\n<li>komunikaty generowane przez system w wyniku (generycznych) kontroli<\/li>\n<li>komunikaty tworzone przez programist\u0119 aplikacji w zaimplementowanych przez niego kontrolach<\/li>\n<\/ul>\n<p>System przeprowadza kontrole na podstawie metadanych. S\u0105 to g\u0142\u00f3wnie kontrole typu, sk\u0142adni oraz d\u0142ugo\u015bci. Je\u017celi np. w <em data-start=\"1604\" data-end=\"1621\">DataDescription<\/em> okre\u015blono, \u017ce dopuszczalne jest maksymalnie 10 znak\u00f3w, dane pole zostanie automatycznie oznaczone czerwonym rogiem, je\u015bli jego zawarto\u015b\u0107 przekroczy ten limit. Tego rodzaju kontrole odbywaj\u0105 si\u0119 z regu\u0142y ju\u017c przy opuszczaniu pola, najp\u00f3\u017aniej podczas kolejnej komunikacji z serwerem.<\/p>\n<p data-start=\"1923\" data-end=\"2247\">Komunikaty specyficzne dla aplikacji opieraj\u0105 si\u0119 na odpowiednich kontrolach w logice aplikacji lub w specjalnych klasach walidacyjnych (<em data-start=\"2062\" data-end=\"2075\">Validations<\/em>). W odr\u00f3\u017cnieniu od kontroli generycznych wykonywanych przez system, kontrole te s\u0105 przeprowadzane tylko przy okre\u015blonych akcjach u\u017cytkownika, np. [<strong>Zapisz<\/strong>] lub [<strong>Weryfikuj<\/strong>].<\/p>\n<p data-start=\"2249\" data-end=\"2598\">Kolejna istotna r\u00f3\u017cnica polega na tym, \u017ce kontrole te oraz powi\u0105zane z nimi komunikaty musz\u0105 zosta\u0107 jawnie przypisane do odpowiednich p\u00f3l, poniewa\u017c klasy walidacyjne musz\u0105 by\u0107 zasadniczo niezale\u017cne od UI. Artyku\u0142 <em>Podr\u0119cznik programowania<\/em> zawiera w rozdziale <em>Komunikaty<\/em> szczeg\u00f3\u0142owy opis rejestrowania i wysy\u0142ania komunikat\u00f3w wraz z przyk\u0142adami kodu.<\/p>\n<h4 data-start=\"2249\" data-end=\"2598\" id=\"aplikacje-dialogowe\" ><span class=\"ez-toc-section\" id=\"Aplikacje_dialogowe\"><\/span>Aplikacje dialogowe<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"2249\" data-end=\"2598\">W Comarch ERP Enterprise istniej\u0105 r\u00f3\u017cne rodzaje aplikacji. Aplikacje z graficznym interfejsem u\u017cytkownika (GUI) s\u0105 okre\u015blane jako aplikacje dialogowe. Innym typem aplikacji s\u0105 na przyk\u0142ad aplikacje dzia\u0142aj\u0105ce w tle (aplikacje wsadowe), kt\u00f3re nie posiadaj\u0105 GUI.<\/p>\n<p data-start=\"2249\" data-end=\"2598\">W Comarch ERP Enterprise g\u0142\u00f3wne okno aplikacji jest udost\u0119pniane przez system. System, czyli aplikacja ramowa (<em>JobControl<\/em>), odpowiada r\u00f3wnie\u017c za nawigacj\u0119 mi\u0119dzy aplikacjami. Aby r\u00f3\u017cne aplikacje dialogowe mog\u0142y dzia\u0142a\u0107 r\u00f3wnolegle w Comarch ERP Enterprise, musz\u0105 spe\u0142nia\u0107 okre\u015blone wymagania oraz przestrzega\u0107 standard\u00f3w.<\/p>\n<p data-start=\"2249\" data-end=\"2598\">Dla aplikacji dialogowych w Comarch ERP Enterprise obowi\u0105zuje zatem zasada, \u017ce musz\u0105 one dziedziczy\u0107 po abstrakcyjnej klasie bazowej <em data-start=\"723\" data-end=\"760\">com.cisag.pgm.base.CisUiApplication<\/em>.<\/p>\n<p data-start=\"2249\" data-end=\"2598\">Ta klasa nadrz\u0119dna z jednej strony zwalnia programist\u0119 aplikacji z wykonywania standardowych zada\u0144, z drugiej za\u015b zapewnia dost\u0119p do zdefiniowanych obszar\u00f3w w g\u0142\u00f3wnym oknie aplikacji (<em>Navigator<\/em>\/<em>Locator<\/em>, <em>CoolBar<\/em>, <em>IdentArea<\/em> oraz <em>WorkArea<\/em>).<\/p>\n<p data-start=\"1006\" data-end=\"1098\">Aplikacja dialogowa powinna standardowo implementowa\u0107 co najmniej trzy nast\u0119puj\u0105ce metody:<\/p>\n<ul>\n<li data-start=\"1006\" data-end=\"1098\"><strong>Metoda <em data-start=\"1109\" data-end=\"1117\">init()<\/em><\/strong> \u2013 wywo\u0142ywana przez system w celu inicjalizacji aplikacji<\/li>\n<li data-start=\"1006\" data-end=\"1098\"><strong>Metoda <em data-start=\"1187\" data-end=\"1204\">performAction()<\/em><\/strong> \u2013 s\u0142u\u017cy do obs\u0142ugi wyst\u0119puj\u0105cych zdarze\u0144<\/li>\n<li data-start=\"1006\" data-end=\"1098\"><strong>Metoda <em data-start=\"1258\" data-end=\"1265\">run()<\/em><\/strong> \u2013 umo\u017cliwia przekazanie do aplikacji parametr\u00f3w startowych<\/li>\n<\/ul>\n<p data-start=\"1329\" data-end=\"1656\">Inicjalizacja GUI odbywa si\u0119 zazwyczaj w metodzie <em data-start=\"1379\" data-end=\"1387\">init()<\/em>, tzn. w tej metodzie tworzone s\u0105 niezb\u0119dne elementy oraz budowana jest hierarchia kontener\u00f3w. Klasa nadrz\u0119dna <em data-start=\"1498\" data-end=\"1516\">CisUiApplication<\/em> udost\u0119pnia poprzez metody <em data-start=\"1543\" data-end=\"1559\">getIdentPane()<\/em>, <em data-start=\"1561\" data-end=\"1576\">getWorkPane()<\/em> oraz <em data-start=\"1582\" data-end=\"1600\">getMainCoolBar()<\/em> kontenery, do kt\u00f3rych mo\u017cna wstawia\u0107 w\u0142asne elementy.<\/p>\n<h4 data-start=\"1329\" data-end=\"1656\" id=\"elementy-specjalne\" ><span class=\"ez-toc-section\" id=\"Elementy_specjalne\"><\/span>Elementy specjalne<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"1329\" data-end=\"1656\">Pakiet <em data-start=\"1694\" data-end=\"1713\">com.cisag.pgm.gui<\/em> zawiera szereg specjalnych element\u00f3w, kt\u00f3re maj\u0105 wspiera\u0107 programist\u0119 aplikacji w \u0142atwiejszej realizacji standardowych zada\u0144 zgodnie ze style guide. Nale\u017c\u0105 do nich m.in. listy, tabele oraz <em data-start=\"1903\" data-end=\"1917\">EntityFields<\/em>.<\/p>\n<h5 data-start=\"1329\" data-end=\"1656\" id=\"listy-i-tabele\" ><span class=\"ez-toc-section\" id=\"Listy_i_tabele\"><\/span>Listy i tabele<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"2090\" data-end=\"2382\">W Comarch ERP Enterprise rozr\u00f3\u017cnia si\u0119 listy i tabele. Tabele s\u0105 z regu\u0142y stosowane wtedy, gdy kolumny i wiersze tworz\u0105 jednoznaczn\u0105 struktur\u0119 siatki. Listy natomiast mog\u0105 by\u0107 u\u017cywane r\u00f3wnie\u017c wtedy, gdy ka\u017cdy wiersz zawiera inne dane lub gdy dane musz\u0105 by\u0107 prezentowane w wielu wierszach.<\/p>\n<p data-start=\"2384\" data-end=\"2659\">Zar\u00f3wno listy, jak i tabele uwzgl\u0119dniaj\u0105 fakt, \u017ce w aplikacji ERP nie wszystkie dane mog\u0105 by\u0107 wy\u015bwietlane jednocze\u015bnie. Za pomoc\u0105 tzw. modelu stron (<em data-start=\"2533\" data-end=\"2544\">PageModel<\/em>) u\u017cytkownik mo\u017ce przewija\u0107 dane, a programista mo\u017ce dynamicznie do\u0142adowywa\u0107 dane przeznaczone do wy\u015bwietlenia.<\/p>\n<p data-start=\"2661\" data-end=\"2827\">Model danych list i tabel opiera si\u0119 na li\u015bcie rekord\u00f3w danych. Taki rekord jest reprezentowany przez instancj\u0119 klasy <em data-start=\"2781\" data-end=\"2824\">com.cisag.pgm.base.obj.CisListPartMutable<\/em>.<\/p>\n<p data-start=\"2829\" data-end=\"3146\">Obiekt ten pe\u0142ni funkcj\u0119 generycznego kontenera danych, tzn. mo\u017ce przechowywa\u0107 referencj\u0119 do dowolnego obiektu (biznesowego), jak r\u00f3wnie\u017c dodatkowe informacje (status) dotycz\u0105ce danego rekordu. Przyk\u0142adami takich informacji s\u0105 zaznaczenie, oznaczenie do usuni\u0119cia lub zmiany oraz wskaz\u00f3wki dotycz\u0105ce wizualizacji.<\/p>\n<p data-start=\"3148\" data-end=\"3505\">Podczas gdy model danych zawsze zawiera wszystkie za\u0142adowane rekordy, wy\u015bwietlanie na ekranie jest ograniczone do jednej strony. Wielko\u015b\u0107 strony, czyli liczba rekord\u00f3w na stron\u0119, mo\u017ce by\u0107 okre\u015blona przez programist\u0119 i powinna by\u0107 zawsze dobrana w taki spos\u00f3b, aby lista\/tabela by\u0142a w pe\u0142ni wype\u0142niona i nie by\u0142o potrzeby stosowania pask\u00f3w przewijania.<\/p>\n<p data-start=\"3507\" data-end=\"3846\">Wizualizacja rekord\u00f3w nale\u017c\u0105cych do danej strony odbywa si\u0119 w obu elementach wierszami. W\u0142a\u015bciwa wizualizacja, czyli mapowanie danych (atrybut\u00f3w) na elementy UI, jest delegowane do obiekt\u00f3w zewn\u0119trznych. W przypadku list s\u0105 to <em data-start=\"3734\" data-end=\"3745\">ListViews<\/em>, a w przypadku tabel <em data-start=\"3792\" data-end=\"3810\">TableDataManager<\/em>.<\/p>\n<p data-start=\"3848\" data-end=\"4018\">Obiekty te odpowiadaj\u0105 r\u00f3wnie\u017c za (r\u00f3wnie\u017c wierszowe) odwrotne mapowanie, czyli przenoszenie wprowadzonych przez u\u017cytkownika danych z element\u00f3w UI do rekord\u00f3w danych.<\/p>\n<p data-start=\"4020\" data-end=\"4343\">W artykule <em data-start=\"4033\" data-end=\"4054\">Podr\u0119cznik programowania<\/em> dzia\u0142anie i zastosowanie list oraz tabel zosta\u0142o szczeg\u00f3\u0142owo opisane. Odpowiednie aplikacje przyk\u0142adowe s\u0105 udost\u0119pniane przez klasy <em data-start=\"4251\" data-end=\"4289\">com.cisag.app.edu.ui.BookListInquiry<\/em> oraz <em data-start=\"4297\" data-end=\"4340\">com.cisag.app.edu.ui.BookTableMaintenance<\/em>.<\/p>\n<p data-start=\"4345\" data-end=\"4582\">Artyku\u0142 <em data-start=\"4354\" data-end=\"4389\">Comarch ERP Enterprise Styleguide<\/em> zawiera wytyczne dla okre\u015blonych przypadk\u00f3w u\u017cycia (wyszukiwanie, tylko podgl\u0105d, z mo\u017cliwo\u015bci\u0105\/bez mo\u017cliwo\u015bci wprowadzania danych itd.), kt\u00f3re nale\u017cy uwzgl\u0119dni\u0107 przy stosowaniu list i tabel.<\/p>\n<h5 data-start=\"4345\" data-end=\"4582\" id=\"entityfields\" ><span class=\"ez-toc-section\" id=\"EntityFields\"><\/span>EntityFields<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"4345\" data-end=\"4582\"><em data-start=\"25\" data-end=\"39\">EntityFields<\/em> to pola specjalne s\u0142u\u017c\u0105ce do identyfikacji encji biznesowych (<em data-start=\"102\" data-end=\"121\">Business Entities<\/em>). Umo\u017cliwiaj\u0105 one nie tylko wprowadzanie jednoznacznej identyfikacji encji biznesowej (atrybut\u00f3w kluczowych), lecz tak\u017ce wy\u015bwietlanie opisu danej encji. Ponadto <em data-start=\"283\" data-end=\"297\">EntityFields<\/em> udost\u0119pniaj\u0105 szereg dodatkowych funkcji dla wy\u015bwietlanej encji:<\/p>\n<ul>\n<li data-start=\"4345\" data-end=\"4582\">pomoc przy wprowadzaniu warto\u015bci<\/li>\n<li data-start=\"4345\" data-end=\"4582\">linki do przypisanych aplikacji<\/li>\n<li data-start=\"4345\" data-end=\"4582\">menu kontekstowe<\/li>\n<li data-start=\"4345\" data-end=\"4582\">wsparcie dla <em>Drag &amp; Drop<\/em><\/li>\n<\/ul>\n<p data-start=\"491\" data-end=\"668\">Pakiet <em data-start=\"498\" data-end=\"517\">com.cisag.pgm.gui<\/em> udost\u0119pnia t\u0119 funkcjonalno\u015b\u0107 w postaci abstrakcyjnych klas bazowych: <em data-start=\"589\" data-end=\"620\">com.cisag.pgm.gui.EntityField<\/em> oraz <em data-start=\"628\" data-end=\"665\">com.cisag.pgm.gui.SimpleEntityField<\/em>.<\/p>\n<p data-start=\"670\" data-end=\"936\">Dla ka\u017cdej encji nale\u017cy przygotowa\u0107 w\u0142asn\u0105, dostosowan\u0105 implementacj\u0119, przy czym \u2013 w zale\u017cno\u015bci od z\u0142o\u017cono\u015bci encji \u2013 jako klas\u0119 nadrz\u0119dn\u0105 nale\u017cy zastosowa\u0107 albo <em data-start=\"832\" data-end=\"863\">com.cisag.pgm.gui.EntityField<\/em>\u00a0albo <em data-start=\"896\" data-end=\"933\">com.cisag.pgm.gui.SimpleEntityField<\/em>.<\/p>\n<p data-start=\"938\" data-end=\"1032\">Dalsze informacje znajduj\u0105 si\u0119 w artykule <em data-start=\"982\" data-end=\"1003\">Podr\u0119cznik programowania <\/em>w rozdziale <em>EntityFelder<\/em>.<\/p>\n<h4 data-start=\"938\" data-end=\"1032\" id=\"rozszerzanie-i-dostosowywanie-elementow-gui\" ><span class=\"ez-toc-section\" id=\"Rozszerzanie_i_dostosowywanie_elementow_GUI\"><\/span>Rozszerzanie i dostosowywanie element\u00f3w GUI<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"1088\" data-end=\"1265\">Zasadniczo mo\u017cliwe jest rozszerzanie klas z <em data-start=\"1132\" data-end=\"1151\">com.cisag.pgm.gui<\/em> poprzez dziedziczenie. Je\u015bli to mo\u017cliwe, istniej\u0105ce klasy powinny by\u0107 konfigurowane za pomoc\u0105 dost\u0119pnych metod.<\/p>\n<p data-start=\"1267\" data-end=\"1334\">Przy nadpisywaniu metod nale\u017cy pami\u0119ta\u0107 o nast\u0119puj\u0105cych zasadach:<\/p>\n<ul>\n<li data-start=\"1336\" data-end=\"1584\">Oryginalna implementacja musi zosta\u0107 wywo\u0142ana przy u\u017cyciu <em>super<\/em><\/li>\n<li data-start=\"1336\" data-end=\"1584\">Nadpisywanie niekt\u00f3rych getter\u00f3w (np. <em data-start=\"1447\" data-end=\"1467\">getPreferredSize()<\/em>) dzia\u0142a tylko w ograniczonym zakresie, poniewa\u017c implementacja (<em data-start=\"1531\" data-end=\"1554\">com.cisag.pgm.dialog.<\/em>) nie korzysta z tych metod<\/li>\n<\/ul>\n<h5 data-start=\"1336\" data-end=\"1584\" id=\"powiazanie-z-com-cisag-pgm-dialog\" ><span class=\"ez-toc-section\" id=\"Powiazanie_z_comcisagpgmdialog\"><\/span>Powi\u0105zanie z <em data-start=\"1531\" data-end=\"1554\">com.cisag.pgm.dialog<\/em><span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"1773\" data-end=\"2038\">Praktycznie wszystkie klasy pochodne od <em data-start=\"1813\" data-end=\"1846\">com.cisag.pgm.gui.VisualElement<\/em> deleguj\u0105 w\u0142a\u015bciw\u0105 implementacj\u0119 do odpowiedniej klasy z pakietu <em data-start=\"1911\" data-end=\"1933\">com.cisag.pgm.dialog<\/em>. Wewn\u0119trznie powi\u0105zana instancja jest zazwyczaj reprezentowana przez (<em>protected<\/em>) zmienn\u0105 o nazwie <em>x<\/em>.<\/p>\n<p data-start=\"2040\" data-end=\"2312\">Nale\u017cy zwr\u00f3ci\u0107 uwag\u0119, \u017ce inicjalizacja zmiennej <em>x<\/em> nie nast\u0119puje we wszystkich elementach ju\u017c w konstruktorze, lecz cz\u0119\u015bciowo dopiero przy dodaniu (<em>add<\/em>) do kontenera. Do tego typu element\u00f3w nale\u017c\u0105 na przyk\u0142ad wszystkie klasy dziedzicz\u0105ce po <em data-start=\"2284\" data-end=\"2309\">com.cisag.pgm.gui.Field<\/em>.<\/p>\n<p data-start=\"2314\" data-end=\"2578\">Zachowanie to wynika z faktu, \u017ce metadane niezb\u0119dne do utworzenia element\u00f3w <em>x<\/em> mog\u0105 zosta\u0107 pobrane dopiero wtedy, gdy \u015bcie\u017cka do metadanych jest w pe\u0142ni znana. W przypadku \u015bcie\u017cek wzgl\u0119dnych pe\u0142ne obliczenie \u015bcie\u017cki jest jednak mo\u017cliwe dopiero poprzez kontener.<\/p>\n<p data-start=\"2580\" data-end=\"2692\">Je\u017celi metoda zostanie wywo\u0142ana na elemencie przed zainicjalizowaniem elementu <em>x<\/em>, mo\u017ce doj\u015b\u0107 do wyst\u0105pienia <em data-start=\"2694\" data-end=\"2726\">java.lang.NullPointerException<\/em>.<\/p>\n<p data-start=\"2731\" data-end=\"3063\">Z zewn\u0105trz mo\u017cna uzyska\u0107 dost\u0119p do elementu <em>x<\/em> poprzez klas\u0119 pomocnicz\u0105 <em data-start=\"2806\" data-end=\"2838\">com.cisag.pgm.gui.WebInterface<\/em>. Zasadniczo zdecydowanie odradza si\u0119 jednak korzystanie z tej mo\u017cliwo\u015bci, poniewa\u017c ta w\u0142a\u015bciwo\u015b\u0107 nie nale\u017cy do publicznego interfejsu klas w <em data-start=\"2982\" data-end=\"3001\">com.cisag.pgm.gui<\/em> i mo\u017ce w ka\u017cdej chwili ulec zmianie lub ca\u0142kowicie znikn\u0105\u0107.<\/p>\n<p data-start=\"3065\" data-end=\"3270\">Je\u015bli w og\u00f3le, u\u017cycie <em data-start=\"3087\" data-end=\"3119\">com.cisag.pgm.gui.WebInterface<\/em> powinno by\u0107 traktowane jako ostateczno\u015b\u0107. Wspomniano o niej tutaj jedynie dlatego, \u017ce mo\u017ce by\u0107 jeszcze stosowana w niekt\u00f3rych (starych) aplikacjach.<\/p>\n<h3 data-start=\"3065\" data-end=\"3270\" id=\"referencja\" ><span class=\"ez-toc-section\" id=\"Referencja\"><\/span>Referencja<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<h4 data-start=\"3065\" data-end=\"3270\" id=\"klasy-bazowe\" ><span class=\"ez-toc-section\" id=\"Klasy_bazowe\"><\/span>Klasy bazowe<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<h5 data-start=\"3065\" data-end=\"3270\" id=\"visualelement\" ><span class=\"ez-toc-section\" id=\"VisualElement-2\"><\/span>VisualElement<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"3481\" data-end=\"3738\">W (abstrakcyjnej) klasie bazowej <em data-start=\"3514\" data-end=\"3547\">com.cisag.pgm.gui.VisualElement<\/em> zebrano wsp\u00f3lne metody i w\u0142a\u015bciwo\u015bci wszystkich (wizualnych) element\u00f3w z pakietu <em data-start=\"3629\" data-end=\"3648\">com.cisag.pgm.gui<\/em>. Wszystkie elementy, w\u0142\u0105cznie z r\u00f3\u017cnymi rodzajami kontener\u00f3w, dziedzicz\u0105 po tej klasie.<\/p>\n<p data-start=\"3740\" data-end=\"3839\">Najwa\u017cniejsze w\u0142a\u015bciwo\u015bci i zadania <em data-start=\"3776\" data-end=\"3791\">VisualElement<\/em> zosta\u0142y opisane w rozdziale <em>VisualElement<\/em>.<\/p>\n<h6 data-start=\"3740\" data-end=\"3839\" id=\"implementacja\" ><span class=\"ez-toc-section\" id=\"Implementacja\"><\/span>Implementacja<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"0\" data-end=\"139\">Znaczna cz\u0119\u015b\u0107 w\u0142a\u015bciwej implementacji obszaru UI nie znajduje si\u0119 w pakiecie <em data-start=\"77\" data-end=\"96\">com.cisag.pgm.gui<\/em>, lecz w pakiecie <em data-start=\"114\" data-end=\"136\">com.cisag.pgm.dialog<\/em>.<\/p>\n<p data-start=\"141\" data-end=\"298\">Ka\u017cdej instancji <em data-start=\"158\" data-end=\"191\">com.cisag.pgm.gui.VisualElement<\/em> jest w czasie wykonywania przypisana (co najmniej) jedna instancja <em data-start=\"259\" data-end=\"295\">com.cisag.pgm.dialog.VisualElement<\/em>.<\/p>\n<p data-start=\"300\" data-end=\"520\">Referencj\u0119 do instancji <em data-start=\"324\" data-end=\"360\">com.cisag.pgm.dialog.VisualElement<\/em> element <em data-start=\"369\" data-end=\"402\">com.cisag.pgm.gui.VisualElement<\/em> przechowuje w zmiennej instancyjnej o nazwie <em>x<\/em>. Dlatego w tym kontek\u015bcie cz\u0119sto m\u00f3wi si\u0119 r\u00f3wnie\u017c o elemencie <em>X<\/em>.<\/p>\n<p data-start=\"522\" data-end=\"867\">Tworzenie (instancjonowanie) elementu <em>X<\/em> odbywa si\u0119 poprzez konkretne elementy (<em>Button, TextField<\/em>. itd.), przy czym moment utworzenia zale\u017cy od typu elementu. W przypadku niekt\u00f3rych element\u00f3w powi\u0105zany element <em>X<\/em> jest tworzony ju\u017c w konstruktorze, natomiast w przypadku innych (w szczeg\u00f3lno\u015bci p\u00f3l) dopiero przy dodaniu (<em>add<\/em>) do kontenera.<\/p>\n<p data-start=\"869\" data-end=\"1076\">Z tego powodu elementy powinny by\u0107 zawsze najpierw dodawane do (w\u0142a\u015bciwego) kontenera, zanim zostan\u0105 na nich wywo\u0142ane jakiekolwiek metody. W przeciwnym razie mo\u017ce wyst\u0105pi\u0107 <em data-start=\"1041\" data-end=\"1073\">java.lang.NullPointerException<\/em>.<\/p>\n<p data-start=\"1441\" data-end=\"1645\">Relacja elementu do elementu<em> X<\/em> wyst\u0119puje r\u00f3wnie\u017c we wszystkich klasach pochodnych. Na przyk\u0142ad elementowi <em data-start=\"1549\" data-end=\"1575\">com.cisag.pgm.gui.Button<\/em> jest w czasie wykonywania przypisany <em data-start=\"1613\" data-end=\"1642\">com.cisag.pgm.dialog.Button<\/em>.<\/p>\n<p data-start=\"1647\" data-end=\"1915\">Przy czym <em data-start=\"1657\" data-end=\"1683\">com.cisag.pgm.gui.Button<\/em> (opr\u00f3cz referencji o tej samej nazwie w <em data-start=\"1724\" data-end=\"1757\">com.cisag.pgm.gui.VisualElement<\/em>) posiada r\u00f3wnie\u017c w\u0142asn\u0105 zmienn\u0105 instancyjn\u0105 o nazwie <em>x<\/em>. Obie referencje wskazuj\u0105 w czasie wykonywania na t\u0119 sam\u0105 instancj\u0119 <em data-start=\"1883\" data-end=\"1912\">com.cisag.pgm.dialog.Button<\/em>.<\/p>\n<p data-start=\"1917\" data-end=\"2096\">Konstrukcja ta s\u0142u\u017cy temu, aby w klasach pochodnych mo\u017cna by\u0142o uzyskiwa\u0107 dost\u0119p do metod specyficznych dla danej klasy bez konieczno\u015bci stosowania operacji rzutowania (<em data-start=\"2085\" data-end=\"2091\">cast<\/em>).<\/p>\n<h6 data-start=\"1917\" data-end=\"2096\" id=\"visualelement-api\" ><span class=\"ez-toc-section\" id=\"VisualElement_API\"><\/span>VisualElement API<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"2315\" data-end=\"2499\">Poni\u017csze tabele przedstawiaj\u0105 najwa\u017cniejsze i najcz\u0119\u015bciej u\u017cywane metody <em data-start=\"2388\" data-end=\"2403\">VisualElement<\/em> (pe\u0142na lista oraz szczeg\u00f3\u0142owe opisy znajduj\u0105 si\u0119 w artykule <em>JavaDoc<\/em> dla <em data-start=\"2480\" data-end=\"2495\">VisualElement<\/em>):<\/p>\n<p data-start=\"2501\" data-end=\"2526\" data-is-last-node=\"\" data-is-only-node=\"\"><strong>Tabela 1: Wygl\u0105d wizualny<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>getBorder()<\/em><br \/>\n<em>setBorder(Border)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Odczyt, ustawienie lub zmiana ramki (<em>Border<\/em>). Wi\u0119cej informacji znajduje si\u0119 w rozdziale <em>Border<\/em>.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>getMargin()<\/em><br \/>\n<em>setMargin(Insets)<\/em><br \/>\n<em>setMargin(int, int, int, int)<\/em><br \/>\n<em>getInsets()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Odczyt, ustawienie lub zmiana odst\u0119p\u00f3w (<em>Margins\/Insets<\/em>). Wi\u0119cej informacji znajduje si\u0119 w rozdziale Insets.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>getForeground()<\/em><br \/>\n<em>setForeground(Color)<\/em><br \/>\n<em>getBackgraound()<\/em><br \/>\n<em>getBackgraound(Color)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Odczyt, ustawienie lub zmiana koloru pierwszego planu (czcionki) lub t\u0142a. Wi\u0119cej informacji znajduje si\u0119 w rozdzia\u0142ach <em>Font<\/em> oraz <em>UIManager<\/em>.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>getFont()<\/em><br \/>\n<em>setFont(Font)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Odczyt, ustawienie lub zmiana rodzaju czcionki, jej rozmiaru i stylu. Wi\u0119cej informacji znajduje si\u0119 w rozdzia\u0142ach <em>Font<\/em> oraz <em>UIManager<\/em>.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>setTexture(Icon)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Ustawienie ikony jako wzoru t\u0142a (tekstury).<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"2501\" data-end=\"2526\" data-is-last-node=\"\" data-is-only-node=\"\"><strong>Tabela 2: Stan og\u00f3lny<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 185px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 70px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 70px;\"><em>isEnabled()<\/em><br \/>\n<em>setEnabled(boolean)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 70px;\">Odczyt lub zmiana stanu interaktywno\u015bci (<em>enabled\/disabled<\/em>). Element z <em>enabled = true <\/em>reaguje na akcje u\u017cytkownika, element z <em>enabled = false <\/em>nie.<\/td>\n<\/tr>\n<tr style=\"height: 46px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 46px;\"><em>isVisible()<\/em><br \/>\n<em>setVisible(boolean)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 46px;\">Odczyt lub zmiana widoczno\u015bci. Niewidoczne elementy nie s\u0105 wy\u015bwietlane po stronie klienta. W zale\u017cno\u015bci od mened\u017cera uk\u0142adu (<em data-start=\"443\" data-end=\"459\">Layout-Manager<\/em>) miejsce na ekranie zostaje zwolnione lub zaj\u0119te przez inne elementy.<\/td>\n<\/tr>\n<tr style=\"height: 46px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 46px;\"><em>isEditable()<\/em><br \/>\n<em>setEditable(boolean)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 46px;\">Odczyt lub zmiana mo\u017cliwo\u015bci edycji. W przypadku p\u00f3l wej\u015bciowych w\u0142a\u015bciwo\u015b\u0107 ta okre\u015bla np., czy wy\u015bwietlany tekst mo\u017ce by\u0107 zmieniany (edytowany) przez u\u017cytkownika.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"2096\" data-end=\"2415\"><strong>Tabela 3: Obs\u0142uga metadanych<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 184px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>getAbsolutePath()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Zwraca absolutn\u0105 \u015bcie\u017ck\u0119 powi\u0105zanych metadanych (atrybut, logiczny typ danych, \u2026).<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>getRelativePath()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Zwraca tyln\u0105 cz\u0119\u015b\u0107 \u015bcie\u017cki metadanych (nazwa atrybutu).<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>getReferencePath()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Zwraca przedni\u0105 cz\u0119\u015b\u0107 \u015bcie\u017cki metadanych (<em>namespace<\/em>, obiekt biznesowy).<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>setPath()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Ustawia lub oblicza wzgl\u0119dn\u0105 i absolutn\u0105 \u015bcie\u017ck\u0119 dla elementu. Metoda jest wywo\u0142ywana przez obszar UI \u2013 albo ju\u017c w konstruktorze, albo po dodaniu elementu do kontenera (<em data-start=\"566\" data-end=\"586\">addedToContainer()<\/em>).<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>getToolTipText()<\/em><br \/>\n<em>setToolTipText(String)<\/em><br \/>\n<em>setToolTipTextFrom(String)<\/em><br \/>\n<em>setToolTipTextFrom(String, Object[])<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Odczyt, ustawienie lub zmiana tekstu podpowiedzi (<em data-start=\"766\" data-end=\"775\">ToolTip<\/em>). Okre\u015blony tekst jest wy\u015bwietlany, gdy u\u017cytkownik naje\u017cd\u017ca kursorem myszy na element. W przypadku element\u00f3w tworzonych na podstawie metadanych (<em data-start=\"923\" data-end=\"940\">DataDescription<\/em>, <em data-start=\"942\" data-end=\"961\">ActionDescription<\/em>) warto\u015b\u0107 ta jest ustawiana automatycznie.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>getContextHelpID()<\/em><br \/>\n<em>setContextHelpID(String)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Odczyt, ustawienie lub zmiana identyfikatora pomocy kontekstowej ([<strong>F1<\/strong>]). W przypadku element\u00f3w tworzonych na podstawie metadanych (<em data-start=\"271\" data-end=\"288\">DataDescription<\/em>, <em data-start=\"290\" data-end=\"309\">ActionDescription<\/em>) warto\u015b\u0107 ta jest ustawiana automatycznie.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>isRequired()<\/em><br \/>\n<em>setRequired(boolean)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Sprawdzenie lub okre\u015blenie, czy dany element jest tzw. polem obowi\u0105zkowym. W przypadku element\u00f3w tworzonych na podstawie metadanych (<em data-start=\"532\" data-end=\"549\">DataDescription<\/em>) warto\u015b\u0107 ta jest ustawiana automatycznie.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"2096\" data-end=\"2415\"><strong>Tabela 4: Obs\u0142uga zdarze\u0144<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>getDoubleClickAction()<\/em><br \/>\n<em>setDoubleClickAction(Action)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Odczyt aktualnej akcji podw\u00f3jnego klikni\u0119cia lub rejestracja nowej akcji. Zarejestrowana akcja jest wykonywana, gdy u\u017cytkownik wykona podw\u00f3jne klikni\u0119cie na elemencie.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>getLinkAction()<\/em><br \/>\n<em>setLinkAction(Action)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Odczyt aktualnej akcji linku lub rejestracja nowej akcji. Zarejestrowana akcja jest wykonywana, gdy u\u017cytkownik kliknie element lewym przyciskiem myszy. Zazwyczaj akcja implementuje dzia\u0142anie podobne do hiperlinku.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>getPopupAction()<\/em><br \/>\n<em>setPopupAction(Action)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Odczyt aktualnej akcji podpowiedzi lub rejestracja nowej akcji. Zarejestrowana akcja jest wykonywana, gdy u\u017cytkownik np. kliknie element prawym przyciskiem myszy. Zazwyczaj akcja implementuje otwarcie menu podpowiedzi. Wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em>Menu podpowiedzi<\/em>.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>getObjectType()<\/em><br \/>\n<em>setObjectType(String)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Odczyt aktualnego typu obiektu lub ustawienie nowego typu obiektu. Typ obiektu s\u0142u\u017cy do klasyfikowania element\u00f3w oraz prezentowanych w nich danych. Na podstawie typu obiektu mo\u017cna np. okre\u015bli\u0107 odpowiednie menu kontekstowe lub mo\u017cliwe akcje <em>Drag &amp; Drop<\/em>.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>registerKeyStroke(Action)<\/em><br \/>\n<em>registerKeystroke(Action[])<\/em><br \/>\n<em>registerKeyStroke(String,Action)<\/em><br \/>\n<em>deregisterKeystroke(Action)<\/em><br \/>\n<em>deregisterKeystroke(Action[])<\/em><br \/>\n<em>deregisterKeystroke(String, Action)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Rejestrowanie lub wyrejestrowywanie akcji dla okre\u015blonych klawiszy lub kombinacji klawiszy (<em data-start=\"389\" data-end=\"402\">key strokes<\/em>). Zazwyczaj odbywa si\u0119 to automatycznie, a kombinacje klawiszy s\u0105 zapisane w repozytorium (<em>Obiekty deweloperskie<\/em>, typ <em>Action<\/em>).<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>getActionsAsArray()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Zwraca wszystkie wewn\u0119trznie zdefiniowane (pod)akcje.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"2096\" data-end=\"2415\"><strong>Tabela 5: Sterowanie fokusem<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>hasFocus() <\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Sprawdza, czy bie\u017c\u0105cy element posiada fokus klawiatury.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>requestFocus()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Za pomoc\u0105 tej metody mo\u017cna programowo lub po stronie serwera za\u017c\u0105da\u0107 zmiany fokusu klawiatury.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>isFocusTraversable()<\/em><br \/>\n<em>setFocusTraversable(boolean)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Sprawdza lub okre\u015bla, czy bie\u017c\u0105cy element mo\u017ce otrzyma\u0107 fokus klawiatury za pomoc\u0105 klawisza [<strong>TAB<\/strong>], lub czy mo\u017ce zosta\u0107 pomini\u0119ty.<section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">Mimo ustawienia <em>focusTraversable = false<\/em> u\u017cytkownik nadal mo\u017ce nada\u0107 elementowi fokus klawiatury poprzez klikni\u0119cie mysz\u0105.<\/div><\/section><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>isRequestFocusEnabled()<\/em><br \/>\n<em>setRequestFocusEnabled(boolean)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Sprawdza lub okre\u015bla, czy bie\u017c\u0105cy element mo\u017ce otrzyma\u0107 fokus klawiatury poprzez r<em>equestFocus().<\/em><section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\"><em>requestFocusEnabled = false <\/em>uniemo\u017cliwia r\u00f3wnie\u017c nadanie elementowi fokusu klawiatury poprzez klikni\u0119cie mysz\u0105.<\/div><\/section><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>isFocusCycleRoot()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Sprawdza, czy element jest kontenerem z cyklicznym fokusem klawiatury, tzn. przy u\u017cyciu [<strong>TAB<\/strong>] oraz [<strong>Shift<\/strong>]+[<strong>TAB<\/strong>] fokus klawiatury zmienia si\u0119 wy\u0142\u0105cznie w obr\u0119bie podelement\u00f3w.Aby opu\u015bci\u0107 element, u\u017cytkownik musi nacisn\u0105\u0107 [<strong>CTRL<\/strong>]+[<strong>G<\/strong>] lub [<strong>CTRL<\/strong>]+[<strong>SHIFT<\/strong>]+[<strong>G<\/strong>].Ta w\u0142a\u015bciwo\u015b\u0107 jest zaimplementowana tylko w okre\u015blonych kontenerach i nie mo\u017cna jej zmieni\u0107.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>focusElementWith(VisualElement,String)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Powoduje, \u017ce po naci\u015bni\u0119ciu okre\u015blonej kombinacji klawiszy klient automatycznie przenosi fokus wprowadzania na wskazany element.Za pomoc\u0105 tej metody bufor klawiatury po stronie klienta mo\u017ce by\u0107 lepiej wykorzystany, co poprawia spos\u00f3b wprowadzania danych.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"2096\" data-end=\"2415\"><strong>Tabela 6: Komunikaty<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>registerMessage(int)<\/em><br \/>\n<em>registerMessage(int[])<\/em><br \/>\n<em>registerMessage(String, int[])<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">\u0141\u0105czy element (pole) z jednym lub wieloma komunikatami (ID). Wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"1194\" data-end=\"1206\">Komunikaty<\/em>.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>requiresAttention()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Sprawdza, czy dla elementu wyst\u0119puj\u0105 komunikaty o b\u0142\u0119dach lub niepotwierdzone ostrze\u017cenia.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"2096\" data-end=\"2415\"><strong>Tabela 7: Hierarchia kontener\u00f3w<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 115px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>getParent()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Zwraca nadrz\u0119dny element kontenera, tzn. kontener typu <em data-start=\"373\" data-end=\"397\">VisualElementContainer<\/em>, do kt\u00f3rego ten element zosta\u0142 dodany.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>addedToContainer(VisualElementContainer, Object)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Metoda <em>notify<\/em> lub <em>hook<\/em>. Jest wywo\u0142ywana przez obszar, gdy element zosta\u0142 dodany do kontenera.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>getWindow()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">\u00a0\u015aledzi hierarchi\u0119 kontener\u00f3w bie\u017c\u0105cego elementu a\u017c do kontenera najwy\u017cszego poziomu (<em>Window<\/em>) i zwraca go.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>isAncestor(VisualElement)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Sprawdza, czy okre\u015blony element jest bezpo\u015brednim lub po\u015brednim kontenerem nadrz\u0119dnym (<em>parent<\/em>) bie\u017c\u0105cego elementu.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"2096\" data-end=\"2415\"><strong>Tabela 8: Obs\u0142uga uk\u0142adu<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>getAlignmentX()<\/em><br \/>\n<em>setAlignmentX(float)<\/em><br \/>\n<em>getAlignmentY()<\/em><br \/>\n<em>setAlignmentY(float)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Poziome i pionowe wyr\u00f3wnanie (wzgl\u0119dem innych element\u00f3w w kontenerze) \u2014 odczyt, ustawianie lub zmiana. Wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdzia\u0142ach <em>Wskaz\u00f3wki dotycz\u0105ce mened\u017cera uk\u0142adu<\/em> i <em>BoxLayout<\/em>.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>getPreferredWidth()<\/em><br \/>\n<em>setPreferredWidth(int)<\/em><br \/>\n<em>getPreferredHeight()<\/em><br \/>\n<em>setPreferredHeight(int)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Preferowana (optymalna) szeroko\u015b\u0107 i wysoko\u015b\u0107 \u2014 odczyt, ustawianie lub zmiana. Wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em>Wskaz\u00f3wki dotycz\u0105ce mened\u017cera uk\u0142adu.<\/em>Wi\u0119kszo\u015b\u0107 element\u00f3w automatycznie oblicza preferowany rozmiar (z uwzgl\u0119dnieniem rozmiaru czcionki, rozdzielczo\u015bci ekranu). Dotyczy to zar\u00f3wno etykiety, jak i z\u0142o\u017conego kontenera.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>getMinimumWidth()<\/em><br \/>\n<em>setMinimumWidth(int)<\/em><br \/>\n<em>getMinimumHeight()<\/em><br \/>\n<em>setMinimumHeight(int)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Minimalna szeroko\u015b\u0107 i wysoko\u015b\u0107 \u2014 odczyt, ustawianie lub zmiana.Stanowi wskaz\u00f3wk\u0119 dla mened\u017cera uk\u0142adu i okre\u015bla, do jakiego stopnia element mo\u017ce zosta\u0107 zmniejszony. Wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em>Wskaz\u00f3wki dotycz\u0105ce mened\u017cera uk\u0142adu.<\/em><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>getMaximumWidth()<\/em><br \/>\n<em>setMaximumWidth(int)<\/em><br \/>\n<em>getMaximumHeight()<\/em><br \/>\n<em>setMaximumHeight(int)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Maksymalna szeroko\u015b\u0107 i wysoko\u015b\u0107 \u2014 odczyt, ustawianie lub zmiana.Stanowi wskaz\u00f3wk\u0119 dla mened\u017cera uk\u0142adu i okre\u015bla, do jakiego stopnia element mo\u017ce zosta\u0107 powi\u0119kszony. Wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em>Wskaz\u00f3wki dotycz\u0105ce mened\u017cera uk\u0142adu.<\/em><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"2096\" data-end=\"2415\"><strong>Tabela 9: Obs\u0142uga eksportu danych<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>getDataColumnSupport()<\/em><br \/>\n<em>setDataColumnSupport(DataColumnSupport)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Informacje do eksportu danych\u00a0 \u2014 odczyt, ustawianie lub zmiana. Wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em>Eksport danych<\/em>.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>createDataColumnSupport()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Podklasy mog\u0105 nadpisa\u0107 t\u0119 metod\u0119, aby dostarczy\u0107 dostosowane informacje do eksportu danych.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h5 data-start=\"2096\" data-end=\"2415\" id=\"visualelementcontainer\" ><span class=\"ez-toc-section\" id=\"VisualElementContainer\"><\/span>VisualElementContainer<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"103\" data-end=\"313\">Klasa <em data-start=\"109\" data-end=\"151\">com.cisag.pgm.gui.VisualElementContainer<\/em> rozszerza <em data-start=\"162\" data-end=\"195\">com.cisag.pgm.gui.VisualElement<\/em> o typowe w\u0142a\u015bciwo\u015bci kontenera, tzn. obiekt <em data-start=\"240\" data-end=\"264\">VisualElementContainer<\/em> mo\u017ce zawiera\u0107 inne obiekty typu <em data-start=\"297\" data-end=\"312\">VisualElement<\/em>.<\/p>\n<p data-start=\"315\" data-end=\"547\">Poniewa\u017c <em data-start=\"324\" data-end=\"348\">VisualElementContainer<\/em> sam jest obiektem typu <em data-start=\"372\" data-end=\"387\">VisualElement<\/em>, mo\u017cliwe jest tworzenie dowolnych hierarchii element\u00f3w oraz kontener\u00f3w. Wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"510\" data-end=\"545\">Hierarchia element\u00f3w i kontener\u00f3w.<\/em><\/p>\n<p data-start=\"549\" data-end=\"879\"><em data-start=\"549\" data-end=\"573\">VisualElementContainer<\/em> jest (abstrakcyjn\u0105) klas\u0105 bazow\u0105 dla wszystkich implementacji kontener\u00f3w. Nale\u017c\u0105 do nich zar\u00f3wno kontenery pomocnicze, np. <em data-start=\"697\" data-end=\"721\">com.cisag.pgm.gui.View<\/em>, jak i kontenery najwy\u017cszego poziomu, np. <em data-start=\"764\" data-end=\"790\">com.cisag.pgm.gui.Dialog.<\/em> Wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"842\" data-end=\"877\">Hierarchia element\u00f3w i kontener\u00f3w<\/em>.<\/p>\n<p data-start=\"881\" data-end=\"1132\">Kontenery najwy\u017cszego poziomu nie dziedzicz\u0105 jednak bezpo\u015brednio po <em data-start=\"949\" data-end=\"973\">VisualElementContainer<\/em>, lecz po <em data-start=\"983\" data-end=\"1009\">com.cisag.pgm.gui.Window<\/em> (klasa bazowa dla wszystkich kontener\u00f3w najwy\u017cszego poziomu). Wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"1122\" data-end=\"1130\">Window<\/em>.<\/p>\n<p data-start=\"1134\" data-end=\"1420\">Rozmieszczenie element\u00f3w kontener deleguje do przypisanego mened\u017cera uk\u0142adu. Wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdzia\u0142ach <em data-start=\"1261\" data-end=\"1282\">Zarz\u0105dzanie uk\u0142adem<\/em> oraz <em data-start=\"1292\" data-end=\"1313\">Mened\u017cerowie uk\u0142adu<\/em>. Przypisanie mened\u017cera uk\u0142adu za pomoc\u0105 <em data-start=\"1355\" data-end=\"1368\">setLayout()<\/em> powinno z regu\u0142y nast\u0105pi\u0107 przed dodaniem element\u00f3w.<\/p>\n<h6 data-start=\"1134\" data-end=\"1420\" id=\"visualelementcontainer-api\" ><span class=\"ez-toc-section\" id=\"VisualElementContainer_API\"><\/span>VisualElementContainer API<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"1471\" data-end=\"1682\">Poni\u017csze tabele przedstawiaj\u0105 najwa\u017cniejsze oraz najcz\u0119\u015bciej u\u017cywane metody klasy <em data-start=\"1553\" data-end=\"1577\">VisualElementContainer<\/em> (pe\u0142na lista oraz szczeg\u00f3\u0142owe opisy znajduj\u0105 si\u0119 w dokumentacji JavaDoc klasy <em data-start=\"1656\" data-end=\"1680\">VisualElementContainer<\/em>):<\/p>\n<p data-start=\"1471\" data-end=\"1682\"><strong>Tabela 10: Wygl\u0105d wizualny<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>INSETS_NONE<\/em><br \/>\n<em>INSETS_TOP<\/em><br \/>\n<em>INSETS_BOTTOM<\/em><br \/>\n<em>INSETS_LEFT<\/em><br \/>\n<em>INSETS_RIGHT<\/em><br \/>\n<em>INSETS_ALL<\/em><br \/>\n<em>setDefaultMargin(int)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Ustawianie standardowych odst\u0119p\u00f3w brzegowych. Wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"473\" data-end=\"481\">Insets<\/em>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"1471\" data-end=\"1682\"><strong>Tabela 11: Obs\u0142uga aplikacji<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 139px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 70px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 70px;\"><em>isSelectionView()<\/em><br \/>\n<em>setSelectionView(boolean)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 70px;\">Sprawdzenie lub okre\u015blenie, czy wszystkie pola dodane (od momentu ustawienia) s\u0105 automatycznie prze\u0142\u0105czane w tryb wyboru.<\/td>\n<\/tr>\n<tr style=\"height: 46px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 46px;\"><em>getObjectReference()<\/em><br \/>\n<em>setObjectReference(byte[])<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 46px;\">Umo\u017cliwia powi\u0105zanie mi\u0119dzy kontenerem a referencj\u0105 obiektu.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"1471\" data-end=\"1682\"><strong>Tabela 12: Sterowanie fokusem<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>setDefaultFocus(VisualElement)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Okre\u015bla, do kt\u00f3rego elementu podrz\u0119dnego ma zosta\u0107 przekazany fokus klawiatury, je\u015bli kontener otrzyma fokus klawiatury.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"2096\" data-end=\"2415\"><strong>Tabela 13: Hierarchia kontener\u00f3w<\/strong><\/p>\n<table style=\"height: 185px; width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 93px;\">\n<td style=\"width: 50%; height: 93px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>add(VisualElement)<\/em><br \/>\n<em>add(VisualElement,int)<\/em><br \/>\n<em>add(VisualElement,Object)<\/em><br \/>\n<em>add(VisualElement,Object, int)<\/em><\/td>\n<td style=\"width: 50%; height: 93px; border-style: outset; border-color: #000000; background-color: #ffffff;\">Dodaje do kontenera okre\u015blony element.Opcjonalnie mo\u017cna poda\u0107 pozycj\u0119 (indeks). W takim przypadku nowy element jest wstawiany na wskazane miejsce. Mened\u017cer uk\u0142adu mo\u017ce wymaga\u0107 dodatkowych informacji dotycz\u0105cych rozmieszczenia nowego elementu. W tym przypadku jako dodatkowy parametr nale\u017cy przekaza\u0107 obiekt typu <em data-start=\"713\" data-end=\"725\">Constraint. <\/em>Wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdzia\u0142ach <em data-start=\"777\" data-end=\"798\">Zarz\u0105dzanie uk\u0142adem<\/em><span data-start=\"777\" data-end=\"798\"> i <\/span><em data-start=\"804\" data-end=\"825\">Mened\u017cerowie uk\u0142adu<\/em>.<\/td>\n<\/tr>\n<tr style=\"height: 46px;\">\n<td style=\"width: 50%; height: 46px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>remove(VisualElement)<\/em><br \/>\n<em>removeAll()<\/em><\/td>\n<td style=\"width: 50%; height: 46px; border-style: outset; border-color: #000000; background-color: #ffffff;\">Usuwa pojedynczy element lub wszystkie elementy podrz\u0119dne.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>contains(VisualElement)<\/em><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\">Sprawdza, czy okre\u015blony element znajduje si\u0119 w kontenerze lub w jednym z jego element\u00f3w podrz\u0119dnych (rekurencyjnie).<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"2096\" data-end=\"2415\"><strong>Tabela 14: Obs\u0142uga uk\u0142adu<\/strong><\/p>\n<table style=\"height: 139px; width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>setLayout(LayoutManager)<\/em><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\">Przypisuje kontenerowi okre\u015blonego mened\u017cera uk\u0142adu. Wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdzia\u0142ach <em data-start=\"1328\" data-end=\"1349\">Zarz\u0105dzanie uk\u0142adem<\/em><span data-start=\"1328\" data-end=\"1349\"> oraz <\/span><em data-start=\"1355\" data-end=\"1376\">Mened\u017cerowie uk\u0142adu<\/em>.<\/td>\n<\/tr>\n<tr style=\"height: 70px;\">\n<td style=\"width: 50%; height: 70px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>setGuides(int)<\/em><br \/>\n<em>setGuides(int, boolean)<\/em><br \/>\n<em>setGuides(double[],double[], double[],double[])<\/em><\/td>\n<td style=\"width: 50%; height: 70px; border-style: outset; border-color: #000000; background-color: #ffffff;\">Definiuje linie prowadz\u0105ce dla tego oraz wszystkich podrz\u0119dnych kontener\u00f3w. Linie prowadz\u0105ce s\u0105 wykorzystywane przez mened\u017cer uk\u0142adu <em data-start=\"1615\" data-end=\"1631\">StandardLayout<\/em>, aby wyr\u00f3wnywa\u0107 do nich elementy.W najprostszym przypadku podawana jest jedynie liczba kolumn (wszystkie kolumny otrzymuj\u0105 t\u0119 sam\u0105 szeroko\u015b\u0107).Mo\u017cliwo\u015b\u0107 definiowania linii prowadz\u0105cych poprzez konstruktory klasy <em data-start=\"1859\" data-end=\"1875\">StandardLayout<\/em> jest oznaczona jako <em data-start=\"1896\" data-end=\"1908\">deprecated<\/em>. Opisane tutaj metody maj\u0105 t\u0119 zalet\u0119, \u017ce definicja linii prowadz\u0105cych mo\u017ce by\u0107 niezale\u017cna od u\u017cycia konkretnego <em data-start=\"2021\" data-end=\"2037\">StandardLayout<\/em>. Dzi\u0119ki temu linie prowadz\u0105ce mo\u017cna \u0142atwo zdefiniowa\u0107 tylko raz, ju\u017c od najwy\u017cszego poziomu kontenera.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>removeAllGuides()<\/em><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<div class=\"TyagGW_tableContainer\">Usuwa wszystkie (bezpo\u015brednio) zdefiniowane dla tego kontenera linie prowadz\u0105ce.<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h5 data-start=\"2096\" data-end=\"2415\" id=\"window\" ><span class=\"ez-toc-section\" id=\"Window\"><\/span>Window<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"214\" data-end=\"468\">Klasa <em data-start=\"220\" data-end=\"246\">com.cisag.pgm.gui.Window<\/em> rozszerza <em data-start=\"257\" data-end=\"299\">com.cisag.pgm.gui.VisualElementContainer<\/em> o dodatkowe w\u0142a\u015bciwo\u015bci dla kontener\u00f3w najwy\u017cszego poziomu. Podobnie jak w przypadku <em data-start=\"397\" data-end=\"412\">VisualElement<\/em> i <em data-start=\"415\" data-end=\"439\">VisualElementContainer<\/em>, jest to klasa abstrakcyjna.<\/p>\n<p data-start=\"470\" data-end=\"1146\">W przeciwie\u0144stwie do wi\u0119kszo\u015bci kontener\u00f3w klasy dziedzicz\u0105ce po <em data-start=\"535\" data-end=\"543\">Window<\/em> podczas tworzenia instancji wymagaj\u0105 co najmniej jednego <em data-start=\"601\" data-end=\"613\">Subelement<\/em>. Kontenery najwy\u017cszego poziomu wykorzystuj\u0105 ten element do w\u0142asnej implementacji, dlatego elementy nie s\u0105 bezpo\u015brednio dodawane do kontener\u00f3w najwy\u017cszego poziomu za pomoc\u0105 metod <em data-start=\"792\" data-end=\"804\">add\/remove<\/em>. Do og\u00f3lnego dost\u0119pu <em data-start=\"826\" data-end=\"834\">Window<\/em> udost\u0119pnia tzw. <em data-start=\"851\" data-end=\"865\">Content-Pane<\/em>, kt\u00f3ry mo\u017cna traktowa\u0107 jak zwyk\u0142y kontener, tzn. mo\u017cna do niego dodawa\u0107 i z niego usuwa\u0107 elementy. <em data-start=\"965\" data-end=\"979\">Content-Pane<\/em> mo\u017ce zosta\u0107 wymieniony za pomoc\u0105 <em data-start=\"1013\" data-end=\"1031\">setContentPane()<\/em>, jednak mo\u017ce to prowadzi\u0107 do utraty okre\u015blonych ustawie\u0144 domy\u015blnych (<em>Look &amp; Feel<\/em>, klawiatura, sterowanie fokusem).<\/p>\n<h6 data-start=\"470\" data-end=\"1146\" id=\"window-api\" ><span class=\"ez-toc-section\" id=\"Window_API\"><\/span>Window API<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"470\" data-end=\"1146\">Poni\u017csze tabele przedstawiaj\u0105 najwa\u017cniejsze oraz najcz\u0119\u015bciej u\u017cywane metody klasy <em data-start=\"1263\" data-end=\"1271\">Window<\/em> (pe\u0142na lista oraz szczeg\u00f3\u0142owe opisy znajduj\u0105 si\u0119 w dokumentacji JavaDoc klasy <em data-start=\"1350\" data-end=\"1358\">Window<\/em>):<\/p>\n<p data-start=\"470\" data-end=\"1146\"><strong>Tabela 15: Obs\u0142uga zdarze\u0144<\/strong><\/p>\n<table style=\"height: 115px; width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>setClosedAction(Action)<\/em><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\">Rejestruje akcj\u0119 dla zdarzenia <em>window closed<\/em>. Zarejestrowana akcja zostaje wywo\u0142ana w momencie zamkni\u0119cia okna.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>addRefreshListener(RefreshListener)<\/em><br \/>\n<em>removeRefreshListener(RefreshListener)<\/em><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\">Rejestruje lub wyrejestrowuje <em data-start=\"1733\" data-end=\"1750\">RefreshListener<\/em> do aktualizacji po stronie klienta. Aktualizacja klienta odbywa si\u0119 w regularnych odst\u0119pach czasu (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale dotycz\u0105cym <em data-start=\"1905\" data-end=\"1927\">getRefreshInterval()<\/em>).<section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Zastosowanie tych metod mo\u017ce znacz\u0105co wp\u0142yn\u0105\u0107 na dzia\u0142anie komunikacji klient\/serwer.<\/div><\/section><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>getRefreshInterval()<\/em><br \/>\n<em>setRefreshInterval(int)<\/em><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\">Odczyt lub zmiana interwa\u0142u aktualizacji.<section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Domy\u015blna warto\u015b\u0107 stanowi dobry kompromis pomi\u0119dzy cz\u0119stotliwo\u015bci\u0105 aktualizacji a obci\u0105\u017ceniem systemu i nie powinna by\u0107 zmieniana. Zmiana tej warto\u015bci mo\u017ce negatywnie wp\u0142yn\u0105\u0107 na dzia\u0142anie komunikacji klient\/serwer.<\/div><\/section><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>isKeyStrokeSupported(String)<\/em><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\">Sprawdza, czy okre\u015blony klawisz lub kombinacja klawiszy (<em data-start=\"748\" data-end=\"760\">key stroke<\/em>) jest obs\u0142ugiwana przez klienta lub przez aktualny tryb klienta.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"2096\" data-end=\"2415\"><strong>Tabela 16: Sterowanie fokusem<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>getFocusOwner()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Zwraca element podrz\u0119dny, kt\u00f3ry aktualnie posiada fokus klawiatury.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"2096\" data-end=\"2415\"><strong>Tabela 17: Hierarchia kontener\u00f3w<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em data-start=\"1151\" data-end=\"1169\">getContentPane()<\/em><br \/>\n<em data-start=\"1173\" data-end=\"1195\">setContentPane(View)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Zwraca lub ustawia <em data-start=\"1217\" data-end=\"1231\">Content-Pane<\/em> okna.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>getOwnedWindows()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Zwraca wszystkie okna zale\u017cne od bie\u017c\u0105cego okna.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h5 data-start=\"2096\" data-end=\"2415\" id=\"field\" ><span class=\"ez-toc-section\" id=\"Field\"><\/span>Field<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"1341\" data-end=\"1563\">Klasa <em data-start=\"1347\" data-end=\"1372\">com.cisag.pgm.gui.Field<\/em> jest (abstrakcyjn\u0105) klas\u0105 bazow\u0105 dla wszystkich element\u00f3w s\u0142u\u017c\u0105cych do wprowadzania i wyprowadzania danych. Nale\u017c\u0105 do nich proste pola tekstowe, jak r\u00f3wnie\u017c pola wyboru oraz listy rozwijane.<\/p>\n<p data-start=\"1565\" data-end=\"1665\">Klasa <em data-start=\"1571\" data-end=\"1578\">Field<\/em> rozszerza klas\u0119 nadrz\u0119dn\u0105 <em data-start=\"1605\" data-end=\"1638\">com.cisag.pgm.gui.VisualElement<\/em> o nast\u0119puj\u0105ce w\u0142a\u015bciwo\u015bci:<\/p>\n<ul>\n<li><strong><em data-start=\"1669\" data-end=\"1676\">Label<\/em><\/strong> \u2014 etykieta<\/li>\n<li><strong><em data-start=\"1692\" data-end=\"1699\">Value<\/em> <\/strong>\u2014 warto\u015b\u0107<\/li>\n<li><strong><em data-start=\"1746\" data-end=\"1763\">DataDescription <\/em><\/strong>&#8212; inicjalizacja poprzez metadane<\/li>\n<li data-start=\"121\" data-end=\"176\">r\u00f3\u017cne wska\u017aniki oraz opcjonalne elementy interakcyjne<\/li>\n<li data-start=\"179\" data-end=\"240\">specjalne wsparcie dla tabel<\/li>\n<\/ul>\n<h6 id=\"wlasciwosci-ogolne\" ><span class=\"ez-toc-section\" id=\"Wlasciwosci_ogolne\"><\/span>W\u0142a\u015bciwo\u015bci og\u00f3lne<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p><strong>Label<\/strong><\/p>\n<p>Pole sk\u0142ada si\u0119 zasadniczo z dw\u00f3ch cz\u0119\u015bci. W cz\u0119\u015bci g\u0142\u00f3wnej wy\u015bwietlana jest aktualna warto\u015b\u0107 (dane) lub mo\u017ce ona zosta\u0107 wprowadzona b\u0105d\u017a zmieniona przez u\u017cytkownika. Druga cz\u0119\u015b\u0107 (<em data-start=\"479\" data-end=\"486\">Label<\/em>) pe\u0142ni funkcj\u0119 opisu (podpisu) i s\u0142u\u017cy u\u017cytkownikowi do rozpoznania znaczenia poszczeg\u00f3lnych p\u00f3l. Cz\u0119\u015b\u0107 ta jest jednak opcjonalna, tzn. w okre\u015blonych przypadkach zastosowania (np. w tabelach i listach) etykieta mo\u017ce zosta\u0107 pomini\u0119ta.<\/p>\n<p><strong>Dane i typy danych<\/strong><\/p>\n<p data-start=\"879\" data-end=\"1102\">Pola s\u0142u\u017c\u0105 do wprowadzania i wyprowadzania danych. Na ekranie dane s\u0105 cz\u0119sto przedstawiane jako tekst. W zale\u017cno\u015bci od typu danych (np. tekst, data, kwota itd.) nale\u017cy jednak programowo zapewni\u0107 odpowiednie przetwarzanie.<\/p>\n<p data-start=\"1104\" data-end=\"1400\">W zwi\u0105zku z tym pola pe\u0142ni\u0105 rol\u0119 przetwarzania wewn\u0119trznych typ\u00f3w danych w spos\u00f3b przyjazny dla u\u017cytkownika oraz ich konwersji do wewn\u0119trznie wykorzystywanych typ\u00f3w danych. Z tego powodu dla ka\u017cdego typu danych dost\u0119pna jest wyprowadzona klasa typu <em data-start=\"1353\" data-end=\"1360\">Field<\/em>, kt\u00f3ra realizuje to zadanie. Przyk\u0142ady:<\/p>\n<ul>\n<li data-start=\"1404\" data-end=\"1438\"><em>TextField<\/em> (<em data-start=\"1417\" data-end=\"1435\">java.lang.String<\/em>)<\/li>\n<li><em data-start=\"1441\" data-end=\"1455\">CisDateField<\/em> (<em data-start=\"1457\" data-end=\"1489\">com.cisag.pgm.datatype.CisDate<\/em>)<\/li>\n<li data-start=\"116\" data-end=\"170\"><em data-start=\"116\" data-end=\"130\">DecimalField<\/em> (<em data-start=\"132\" data-end=\"167\">com.cisag.pgm.datatype.CisDecimal<\/em>)<\/li>\n<li data-start=\"173\" data-end=\"201\"><em data-start=\"173\" data-end=\"187\">BooleanField<\/em> (<em data-start=\"189\" data-end=\"198\">boolean<\/em>)<\/li>\n<\/ul>\n<p>Ka\u017cda konkretna podklasa (zgodnie z konwencj\u0105) udost\u0119pnia metody <em data-start=\"268\" data-end=\"280\">getValue()<\/em> oraz <em data-start=\"286\" data-end=\"298\">setValue()<\/em>, kt\u00f3rych sygnatury (typ zwracany oraz typ parametru) s\u0105 oparte na typie danych danego pola. Przyk\u0142adowo <em data-start=\"403\" data-end=\"414\">TextField<\/em> wykorzystuje nast\u0119puj\u0105ce sygnatury:<\/p>\n<p><em>public String getValue()<\/em><br \/>\n<em>public void setValue(String)<\/em><\/p>\n<p>Pole <em data-start=\"524\" data-end=\"538\">CisDateField<\/em> wykorzystuje natomiast sygnatury:<\/p>\n<p><em>public CisDate getValue()<\/em><br \/>\n<em>public void setValue(CisDate)<\/em><\/p>\n<p data-start=\"643\" data-end=\"743\">Na poziomie konkretnych podklas zapewniony jest tym samym bezpieczny typowo dost\u0119p do warto\u015bci pola.<\/p>\n<p data-start=\"745\" data-end=\"895\">Dodatkowo klasa bazowa <em data-start=\"768\" data-end=\"775\">Field<\/em> udost\u0119pnia r\u00f3wnie\u017c dynamiczny dost\u0119p (z wykorzystaniem <em data-start=\"831\" data-end=\"849\">java.lang.Object<\/em> jako typu danych) poprzez nast\u0119puj\u0105ce metody:<\/p>\n<div><em>public Object getValueAsObject()<\/em><\/div>\n<div><em>public void setValueFromObject(Object)<\/em><\/div>\n<div><\/div>\n<div><strong>Data description<\/strong><\/div>\n<p data-start=\"1012\" data-end=\"1199\">Zazwyczaj podczas tworzenia instancji p\u00f3l wykorzystywane s\u0105 metadane pochodz\u0105ce z repozytorium Comarch ERP Enterprise. W tym celu przy wywo\u0142aniu odpowiedniego konstruktora przekazywana jest \u015bcie\u017cka.<\/p>\n<p data-start=\"1201\" data-end=\"1454\">\u015acie\u017cka ta mo\u017ce by\u0107 podana zar\u00f3wno w postaci absolutnej (\u0142\u0105cznie z nazw\u0105 kontenera), jak i w postaci wzgl\u0119dnej (w\u00f3wczas nazwa kontenera jest wyszukiwana automatycznie). \u015acie\u017cka identyfikuje atrybut obiektu biznesowego lub wewn\u0119trzny typ logiczny danych.<\/p>\n<p data-start=\"1456\" data-end=\"1769\">Je\u017celi pole zostanie dodane do kontenera, nast\u0119puje automatyczne okre\u015blenie powi\u0105zanego obiektu <em data-start=\"1552\" data-end=\"1569\">DataDescription<\/em>. Obiekt <em data-start=\"1578\" data-end=\"1595\">DataDescription<\/em> jest reprezentowany przez instancj\u0119 <em data-start=\"1632\" data-end=\"1676\">com.cisag.pgm.dialog.model.DataDescription<\/em> i udost\u0119pnia praktycznie wszystkie metadane istotne dla p\u00f3l. Nale\u017c\u0105 do nich w szczeg\u00f3lno\u015bci:<\/p>\n<ul>\n<li data-start=\"1773\" data-end=\"1785\">typ danych<\/li>\n<li data-start=\"1788\" data-end=\"1823\">etykieta (\u0142\u0105cznie z <em data-start=\"1808\" data-end=\"1820\">Access-Key<\/em>)<\/li>\n<li data-start=\"1826\" data-end=\"1837\"><em data-start=\"1826\" data-end=\"1835\">ToolTip<\/em><\/li>\n<li data-start=\"1840\" data-end=\"1860\">pomoc bezpo\u015brednia<\/li>\n<li data-start=\"1863\" data-end=\"1925\">ograniczenia dotycz\u0105ce zawarto\u015bci (d\u0142ugo\u015b\u0107, zakres warto\u015bci)<\/li>\n<li data-start=\"1928\" data-end=\"1986\">informacje o mo\u017cliwo\u015bci edycji oraz polach obowi\u0105zkowych<\/li>\n<li data-start=\"1928\" data-end=\"1986\">formatowanie<\/li>\n<li data-start=\"1928\" data-end=\"1986\">wyszukiwanie<\/li>\n<\/ul>\n<p>Odpowiednie w\u0142a\u015bciwo\u015bci pola s\u0105 dziedziczone wraz z elementem i przejmowane z warto\u015bci obiektu <em data-start=\"387\" data-end=\"404\">DataDescription<\/em>. Niekt\u00f3re z tych w\u0142a\u015bciwo\u015bci mo\u017cna p\u00f3\u017aniej zmieni\u0107.<\/p>\n<p><strong>Statusy pola i gotowo\u015b\u0107 do wprowadzania danych<\/strong><\/p>\n<p data-start=\"517\" data-end=\"734\">W\u0142a\u015bciwo\u015bci interakcyjne pola (<em data-start=\"548\" data-end=\"557\">enabled<\/em>, <em data-start=\"559\" data-end=\"569\">editable<\/em> oraz <em data-start=\"575\" data-end=\"585\">required<\/em> \u2014 pola obowi\u0105zkowe) s\u0105 inicjalizowane na podstawie obiektu <em data-start=\"645\" data-end=\"662\">DataDescription<\/em> i mog\u0105 by\u0107 w razie potrzeby zmieniane poprzez odpowiednie metody <em data-start=\"728\" data-end=\"733\">set<\/em>.<\/p>\n<p data-start=\"736\" data-end=\"867\">Wizualizacja tych w\u0142a\u015bciwo\u015bci odbywa si\u0119 poprzez kolory t\u0142a i\/lub czcionki albo poprzez ma\u0142y szary naro\u017cnik po prawej stronie pola.<\/p>\n<p><strong>Pomoc uzupe\u0142niania warto\u015bci<\/strong><\/p>\n<p data-start=\"1052\" data-end=\"1189\">Pola mog\u0105 udost\u0119pnia\u0107 u\u017cytkownikowi funkcj\u0119 pomocy uzupe\u0142niania warto\u015bci. Funkcja ta u\u0142atwia wyb\u00f3r (wyszukiwanie) lub wprowadzanie okre\u015blonych warto\u015bci.<\/p>\n<p data-start=\"1191\" data-end=\"1458\">Pomoc uzupe\u0142niania warto\u015bci mo\u017ce by\u0107 realizowana jako okno dialogowe, wyskakuj\u0105ce menu lub inny obiekt. W zale\u017cno\u015bci od rodzaju pomocy uzupe\u0142niania warto\u015bci jej dost\u0119pno\u015b\u0107 jest wizualizowana poprzez ma\u0142y przycisk dialogowy (w prawym dolnym rogu) lub przycisk listy rozwijanej (<em data-start=\"1439\" data-end=\"1456\">ComboBox-Button<\/em>).<\/p>\n<p data-start=\"258\" data-end=\"512\">W niekt\u00f3rych przypadkach funkcja pomocy uzupe\u0142niania warto\u015bci jest udost\u0119pniana bezpo\u015brednio przez obszar interfejsu u\u017cytkownika. Przyk\u0142adowo dla wszystkich p\u00f3l daty dost\u0119pny jest kalendarz, a dla wszystkich p\u00f3l <em data-start=\"455\" data-end=\"468\">EntityField<\/em> oferowane jest wyszukiwanie w bazie danych.<\/p>\n<p data-start=\"514\" data-end=\"761\">Istnieje r\u00f3wnie\u017c mo\u017cliwo\u015b\u0107 implementacji w\u0142asnych funkcji pomocy uzupe\u0142niania warto\u015bci. W takim przypadku obiekt pomocy uzupe\u0142niania warto\u015bci\u00a0musi dziedziczy\u0107 po klasie <em data-start=\"653\" data-end=\"693\">com.cisag.pgm.job.search.SearchManager,<\/em> Wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w artykule <em>Podr\u0119cznik programowania<\/em>.<b><\/b><\/p>\n<p data-start=\"514\" data-end=\"761\"><strong>Tryb wyboru<\/strong><\/p>\n<p data-start=\"789\" data-end=\"1127\">W niekt\u00f3rych przypadkach zastosowania, w szczeg\u00f3lno\u015bci podczas wyszukiwania oraz odczytu danych, mo\u017cliwe jest wprowadzanie listy warto\u015bci, kt\u00f3re nie s\u0105 po\u0142\u0105czone znakiem [<strong>Enter<\/strong>], lecz separatorem (np. przecinek, spacja lub <em>*<\/em>, <em>?<\/em>). W dokumentacji p\u00f3l u\u017cywanych w tym celu stosowane jest okre\u015blenie wielowarto\u015bciowe pola wej\u015bciowe.<\/p>\n<p data-start=\"1129\" data-end=\"1535\">Na poziomie implementacji niekt\u00f3re specjalne typy p\u00f3l udost\u0119pniaj\u0105 t\u0119 funkcjonalno\u015b\u0107 (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"1267\" data-end=\"1280\">Tryb wyboru<\/em>). Cz\u0119\u015bciowo pola te musz\u0105 zosta\u0107 ustawione w tryb wyboru, cz\u0119\u015bciowo tryb ten jest automatycznie dost\u0119pny. Wymagana w\u0142a\u015bciwo\u015b\u0107 (<em data-start=\"1408\" data-end=\"1423\">selectionMode<\/em>) jest r\u00f3wnie\u017c dost\u0119pna na poziomie klasy bazowej i jest implementowana w r\u00f3\u017cny spos\u00f3b w zale\u017cno\u015bci od podklasy.<\/p>\n<p data-start=\"1537\" data-end=\"1676\">W szczeg\u00f3lno\u015bci pola <em data-start=\"1558\" data-end=\"1572\">EntityFields<\/em> oraz <em data-start=\"1578\" data-end=\"1594\">ValueSetFields<\/em> obs\u0142uguj\u0105 t\u0119 w\u0142a\u015bciwo\u015b\u0107. Istniej\u0105 jednak tak\u017ce typy p\u00f3l, kt\u00f3re jej nie obs\u0142uguj\u0105.<\/p>\n<p data-start=\"1678\" data-end=\"1927\">Niekt\u00f3re pola udost\u0119pniaj\u0105 dodatkowo tzw. tryb wyboru w etykiecie. W tym celu w etykiecie wprowadzany jest podw\u00f3jny przycisk. Po klikni\u0119ciu tego przycisku otwierane jest menu kontekstowe, z kt\u00f3rego mo\u017cna przej\u0105\u0107 zdefiniowane wcze\u015bniej wzorce wyboru.<\/p>\n<p data-start=\"514\" data-end=\"761\"><strong>Przycisk dialogowy<\/strong><\/p>\n<p data-start=\"229\" data-end=\"487\">W obszarze etykiety mo\u017ce zosta\u0107 wstawiony dodatkowy przycisk. Przycisk ten jest z regu\u0142y wykorzystywany wtedy, gdy bezpo\u015brednia lub pe\u0142na edycja danych w samym polu nie jest mo\u017cliwa i do (dodatkowej) edycji ma zosta\u0107 u\u017cyte okno dialogowe lub okno podpowiedzi warto\u015bci.<\/p>\n<p data-start=\"489\" data-end=\"734\">W artykule <em data-start=\"500\" data-end=\"520\">Instrukcja obs\u0142ugi<\/em> przycisk ten, ze wzgl\u0119du na sw\u00f3j wygl\u0105d, jest okre\u015blany jako przycisk rombu. W API jest on natomiast nazywany przyciskiem dialogowym, poniewa\u017c odpowiada to jego typowej funkcji.<\/p>\n<p data-start=\"489\" data-end=\"734\">Klasa bazowa <em data-start=\"749\" data-end=\"756\">Field<\/em> udost\u0119pnia jako wsparcie jedynie mo\u017cliwo\u015b\u0107 rejestrowania tzw. <em>Dialog-Action<\/em>. Po zarejestrowaniu takiej akcji przycisk rombu pojawia si\u0119 automatycznie w obszarze etykiety pola. Po klikni\u0119ciu przycisku akcja zostaje wywo\u0142ana.<\/p>\n<p data-start=\"489\" data-end=\"734\">Do obowi\u0105zk\u00f3w programisty nale\u017cy zarejestrowanie dla tej akcji <em data-start=\"1051\" data-end=\"1067\">ActionListener<\/em> oraz wykonanie odpowiedniego dzia\u0142ania w metodzie <em data-start=\"1118\" data-end=\"1135\">actionPerform()<\/em>. Ze wzgl\u0119d\u00f3w sp\u00f3jno\u015bci (zgodno\u015bci z oczekiwaniami) powinno to zawsze oznacza\u0107 otwarcie okna dialogowego lub okna typu podpowied\u017a warto\u015bci, mimo \u017ce nie jest to technicznie wymuszone.<\/p>\n<p data-start=\"489\" data-end=\"734\">Przyk\u0142ad zastosowania przycisk\u00f3w dialogowych mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"1424\" data-end=\"1448\">Korzystanie z dialog\u00f3w.<\/em><\/p>\n<p data-start=\"489\" data-end=\"734\"><section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">W przypadku wieloj\u0119zycznego pola tekstowego (tzn. z obs\u0142ug\u0105 <em data-start=\"1561\" data-end=\"1574\">NLS-Support<\/em>) pozycja oraz funkcjonalno\u015b\u0107 przycisku dialogowego s\u0105 wykorzystywane do wprowadzania t\u0142umacze\u0144.<\/div><\/section><\/p>\n<p data-start=\"489\" data-end=\"734\"><strong>Nieprawid\u0142owe warto\u015bci<\/strong><\/p>\n<p data-start=\"1709\" data-end=\"1938\">Konkretne podklasy klasy <em data-start=\"1734\" data-end=\"1741\">Field<\/em> s\u0105 przeznaczone dla okre\u015blonych typ\u00f3w danych. Przyk\u0142adowo pole <em data-start=\"1805\" data-end=\"1819\">CisDateField<\/em> s\u0142u\u017cy do wy\u015bwietlania obiekt\u00f3w typu <em data-start=\"1856\" data-end=\"1888\">com.cisag.pgm.datatype.CisDate<\/em> oraz do umo\u017cliwienia ich wprowadzania lub edycji.<\/p>\n<p data-start=\"1940\" data-end=\"2145\">Je\u017celi dane wprowadzone przez u\u017cytkownika nie mog\u0105 zosta\u0107 przekszta\u0142cone do tego typu danych (b\u0142\u0119dy sk\u0142adni, niedozwolone znaki itd.), metoda <em data-start=\"2082\" data-end=\"2094\">getValue()<\/em> nie mo\u017ce zwr\u00f3ci\u0107 prawid\u0142owego obiektu danego typu.<\/p>\n<p data-start=\"2147\" data-end=\"2480\">Dost\u0119pna jest metoda <em data-start=\"2168\" data-end=\"2184\">isValueValid()<\/em>, kt\u00f3ra wskazuje, \u017ce wprowadzona warto\u015b\u0107 nie mog\u0142a zosta\u0107 przekszta\u0142cona do odpowiedniego obiektu. Metoda ta nie jest jednak pomocna w typowym modelu programowania, w szczeg\u00f3lno\u015bci dlatego, \u017ce klasy walidacji i logiki musz\u0105 by\u0107 niezale\u017cne od klas UI i nie mog\u0105 bezpo\u015brednio korzysta\u0107 z ich metod.<\/p>\n<p data-start=\"2482\" data-end=\"2838\">W zwi\u0105zku z tym wszystkie pola o nieprymitywnych typach danych zwracaj\u0105 w metodach <em data-start=\"2565\" data-end=\"2577\">getValue()<\/em> (oraz <em data-start=\"2584\" data-end=\"2604\">getValueAsObject()<\/em>) specjalne warto\u015bci. Warto\u015bci te mog\u0105 zosta\u0107 bezpo\u015brednio przeniesione do powi\u0105zanego obiektu biznesowego w metodzie <em data-start=\"2722\" data-end=\"2736\">dataFromUI()<\/em> i s\u0105 zazwyczaj traktowane przez klasy walidacji i logiki tak, jakby u\u017cytkownik pozostawi\u0142 pole puste.<\/p>\n<p data-start=\"2840\" data-end=\"3236\">Dodatkowo pola rejestruj\u0105 instancj\u0119 obiektu zwr\u00f3con\u0105 przez <em data-start=\"2899\" data-end=\"2911\">getValue()<\/em> wraz z nieprawid\u0142owym wpisem u\u017cytkownika. Je\u017celi w p\u00f3\u017aniejszym momencie zostanie wywo\u0142ana metoda <em data-start=\"3009\" data-end=\"3021\">setValue()<\/em> (lub <em data-start=\"3027\" data-end=\"3047\">setValueAsObject()<\/em>), nast\u0119puje sprawdzenie, czy przekazany obiekt zosta\u0142 wcze\u015bniej zarejestrowany jako nieprawid\u0142owy. Je\u015bli tak, w polu ponownie wy\u015bwietlany jest pierwotny (nieprawid\u0142owy) wpis u\u017cytkownika.<\/p>\n<h6 data-start=\"2840\" data-end=\"3236\" id=\"field-api\" ><span class=\"ez-toc-section\" id=\"Field_API\"><\/span>Field API<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"2840\" data-end=\"3236\">Poni\u017csze tabele przedstawiaj\u0105 najwa\u017cniejsze oraz najcz\u0119\u015bciej u\u017cywane metody klasy <em data-start=\"212\" data-end=\"219\">Field<\/em> (pe\u0142na lista oraz szczeg\u00f3\u0142owe opisy znajduj\u0105 si\u0119 w dokumentacji JavaDoc klasy <em data-start=\"298\" data-end=\"305\">Field<\/em>):<\/p>\n<p data-start=\"2840\" data-end=\"3236\"><strong>Tabela 18: Wygl\u0105d wizualny<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em data-start=\"420\" data-end=\"446\">getHorizontalAlignment()<\/em><br \/>\n<em data-start=\"450\" data-end=\"479\">setHorizontalAlignment(int)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Odczyt, ustawianie lub zmiana wyr\u00f3wnania tekstu w obr\u0119bie pola (<em data-start=\"546\" data-end=\"558\">Field.LEFT<\/em>, <em data-start=\"560\" data-end=\"574\">Field.CENTER<\/em> oraz <em data-start=\"580\" data-end=\"593\">Field.RIGHT<\/em>).<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em data-start=\"600\" data-end=\"620\">getLabelPosition()<\/em><br \/>\n<em data-start=\"624\" data-end=\"647\">setLabelPosition(int)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Odczyt, ustawianie lub zmiana wzgl\u0119dnej pozycji etykiety wzgl\u0119dem warto\u015bci. Obs\u0142ugiwane s\u0105 ustawienia: etykieta po lewej stronie warto\u015bci (<em data-start=\"791\" data-end=\"809\">Field.LABEL_LEFT<\/em>) oraz etykieta nad warto\u015bci\u0105 (<em data-start=\"842\" data-end=\"859\">Field.LABEL_TOP<\/em>).<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"2840\" data-end=\"3236\"><strong>Tabela 19: Dost\u0119p do danych<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 138px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 46px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 46px;\"><em data-start=\"244\" data-end=\"264\">getValueAsObject()<\/em><br \/>\n<em data-start=\"268\" data-end=\"296\">setValueFromObject(Object)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 46px;\">Odczyt lub zmiana aktualnej warto\u015bci pola.<br \/>\nMetody te, oparte na <em data-start=\"370\" data-end=\"388\">java.lang.Object<\/em>, umo\u017cliwiaj\u0105 og\u00f3lny dost\u0119p do danych dla wszystkich typ\u00f3w p\u00f3l. Podklasy klasy <em data-start=\"467\" data-end=\"474\">Field<\/em> udost\u0119pniaj\u0105 dodatkowo metody <em data-start=\"505\" data-end=\"517\">getValue()<\/em> oraz <em data-start=\"523\" data-end=\"535\">setValue()<\/em>, kt\u00f3rych typ zwracany oraz typ parametru s\u0105 zale\u017cne od typu danych danego pola.<\/td>\n<\/tr>\n<tr style=\"height: 46px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 46px;\"><em data-start=\"620\" data-end=\"638\">getStringValue()<\/em><br \/>\n<em data-start=\"642\" data-end=\"666\">setStringValue(String)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 46px;\">Odczyt lub zmiana aktualnej warto\u015bci pola.<br \/>\nMetody te, oparte na <em data-start=\"740\" data-end=\"758\">java.lang.String<\/em>, umo\u017cliwiaj\u0105 og\u00f3lny dost\u0119p do danych dla wszystkich typ\u00f3w p\u00f3l. W przeciwie\u0144stwie do <em data-start=\"843\" data-end=\"863\">getValueAsObject()<\/em> oraz <em data-start=\"869\" data-end=\"891\">setValueFromObject()<\/em> zwracana jest jednak wy\u0142\u0105cznie tekstowa reprezentacja warto\u015bci.<section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">Podklasy stosuj\u0105 cz\u0119\u015bciowo r\u00f3\u017cne procedury formatowania warto\u015bci jako tekstu lub tworzenia obiektu odpowiedniego typu danych na podstawie tekstu.<\/div><\/section><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>isValueValid()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Sprawdza, czy aktualna warto\u015b\u0107 jest prawid\u0142owa. Wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"1241\" data-end=\"1265\">Nieprawid\u0142owe warto\u015bci<\/em>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"2840\" data-end=\"3236\"><strong>Tabela 20: Obs\u0142uga aplikacji<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 321px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 183px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 183px;\"><em>getDialogAction()<\/em><br \/>\n<em>setDialogAction(Action)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 183px;\">Odczyt aktualnej <em>Dialog-Action<\/em> lub rejestracja nowej akcji.Zarejestrowana akcja zostaje wywo\u0142ana po klikni\u0119ciu przez u\u017cytkownika przycisku dialogowego (rombu).<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>setDialogActionEnabled(boolean)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Ustawianie lub zmiana stanu <em data-start=\"1671\" data-end=\"1680\">enabled<\/em> przycisku dialogowego.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>setDialogButton(boolean)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Ustawianie lub zmiana widoczno\u015bci przycisku dialogowego.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>setSearchManager(SearchManager)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Zastosowanie w\u0142asnej (alternatywnej) funkcji pomocy wyszukiwania warto\u015bci.<br \/>\nWiele podklas posiada ju\u017c standardow\u0105 funkcj\u0119 pomocy uzupe\u0142niania warto\u015bci\u00a0(np. kalendarz w polach daty lub wyszukiwanie na podstawie metadanych). Dzi\u0119ki udost\u0119pnieniu w\u0142asnej implementacji <em data-start=\"524\" data-end=\"539\">SearchManager<\/em> mo\u017cliwe jest w\u0142\u0105czenie specjalnych funkcji pomocy uzupe\u0142niania warto\u015bci.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>setIndicator(Icon, String, int, int)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Wstawia dodatkow\u0105 ikon\u0119 w polu (lub etykiecie).Taka ikona mo\u017ce s\u0142u\u017cy\u0107 jako wska\u017anik okre\u015blonych stan\u00f3w lub tryb\u00f3w.<section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">Funkcja ta jest cz\u0119\u015bciowo wykorzystywana ju\u017c przez standardowe zadania, np. w polach wielowarto\u015bciowych (ikona: podw\u00f3jna strza\u0142ka).<\/div><\/section><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>getObjectReference()<\/em><br \/>\n<em>setObjectReference(byte[])<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Umo\u017cliwia powi\u0105zanie pola z referencj\u0105 obiektu.<br \/>\nJe\u017celi do pola nie jest przypisana referencja obiektu, metoda <em data-start=\"1101\" data-end=\"1123\">getObjectReference()<\/em> zwraca referencj\u0119 obiektu zdefiniowan\u0105 w (bezpo\u015brednim) kontenerze nadrz\u0119dnym.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"2840\" data-end=\"3236\"><strong>Tabela 21: Obs\u0142uga trybu wyboru<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em data-start=\"1322\" data-end=\"1341\">isSelectionMode()<\/em><br \/>\n<em data-start=\"1345\" data-end=\"1372\">setSelectionMode(boolean)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Sprawdza lub ustawia, czy pole dzia\u0142a w trybie wyboru.Wi\u0119kszo\u015b\u0107 p\u00f3l w trybie wyboru zachowuje si\u0119 jak pola tekstowe i umo\u017cliwia wprowadzanie wielu (wielowarto\u015bciowych) wyra\u017ce\u0144 lub zakres\u00f3w. Tryb wyboru nie jest jednak obs\u0142ugiwany przez wszystkie podklasy.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>getSelectionString()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Zwraca wprowadzony przez u\u017cytkownika wyra\u017cenie wyboru.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"2840\" data-end=\"3236\"><strong>Tabela 22: Obs\u0142uga metadanych<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 208px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 93px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 93px;\"><em data-start=\"247\" data-end=\"259\">getLabel()<\/em><br \/>\n<em data-start=\"263\" data-end=\"281\">setLabel(String)<\/em><br \/>\n<em data-start=\"285\" data-end=\"307\">setLabelFrom(String)<\/em><br \/>\n<em data-start=\"311\" data-end=\"343\">setLabelFrom(String, String[])<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 93px;\">Odczyt, ustawianie lub zmiana tekstu etykiety.<br \/>\nW przypadku p\u00f3l tworzonych na podstawie metadanych (<em data-start=\"452\" data-end=\"469\">DataDescription<\/em>) warto\u015b\u0107 ta jest automatycznie ustawiana. Je\u017celi etykieta ma by\u0107 wy\u015bwietlana w inny spos\u00f3b (np. w tabelach), mo\u017cna j\u0105 pomin\u0105\u0107 za pomoc\u0105 <em data-start=\"606\" data-end=\"622\">setLabel(null)<\/em>.<\/td>\n<\/tr>\n<tr style=\"height: 46px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 46px;\"><em data-start=\"628\" data-end=\"642\">getColumns()<\/em><br \/>\n<em data-start=\"646\" data-end=\"663\">setColumns(int)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 46px;\">Odczyt lub zmiana szeroko\u015bci pola w znakach.<br \/>\nNa podstawie okre\u015blonej liczby znak\u00f3w pole automatycznie wyznacza (zale\u017cn\u0105 od rozdzielczo\u015bci) warto\u015b\u0107 <em data-start=\"820\" data-end=\"836\">preferredWidth<\/em>. Warto\u015b\u0107 -1 powoduje, \u017ce <em data-start=\"862\" data-end=\"878\">preferredWidth<\/em> (dynamicznie) dostosowuje si\u0119 do aktualnej zawarto\u015bci pola. W przypadku p\u00f3l tworzonych na podstawie metadanych (<em data-start=\"991\" data-end=\"1008\">DataDescription<\/em>) warto\u015b\u0107 ta jest ustawiana automatycznie. Niekt\u00f3re podklasy klasy <em data-start=\"1075\" data-end=\"1082\">Field<\/em> obliczaj\u0105 jednak <em data-start=\"1100\" data-end=\"1116\">preferredWidth<\/em> niezale\u017cnie od warto\u015bci <em data-start=\"1141\" data-end=\"1150\">columns<\/em>.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>getOriginalPath()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Zwraca \u015bcie\u017ck\u0119 w postaci przekazanej w konstruktorze. W przeciwie\u0144stwie do metody <em data-start=\"1260\" data-end=\"1271\">getPath()<\/em> po wywo\u0142aniu <em data-start=\"1285\" data-end=\"1292\">add()<\/em> zwracana jest pe\u0142na \u015bcie\u017cka.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>setPath()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Niedozwolone \u2014 \u015bcie\u017cka metadanych musi zosta\u0107 przekazana w konstruktorze.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"2840\" data-end=\"3236\"><strong>Tabela 23: Obs\u0142uga uk\u0142adu<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em data-start=\"1527\" data-end=\"1553\">getPreferredLabelWidth()<\/em><br \/>\n<em data-start=\"1557\" data-end=\"1586\">setPreferredLabelWidth(int)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Odczyt, ustawianie lub zmiana preferowanej (optymalnej) szeroko\u015bci etykiety pola.Metoda ta jest wykorzystywana przez niekt\u00f3re mened\u017cery uk\u0142adu i nie powinna by\u0107 wywo\u0142ywana bezpo\u015brednio.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em data-start=\"1787\" data-end=\"1804\">getLabelWidth()<\/em><br \/>\n<em data-start=\"1808\" data-end=\"1828\">setLabelWidth(int)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Odczyt, ustawianie lub zmiana szeroko\u015bci etykiety pola.Metoda ta jest wymagana przez niekt\u00f3re mened\u017cery uk\u0142adu i nie powinna by\u0107 wywo\u0142ywana bezpo\u015brednio.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"2840\" data-end=\"3236\"><strong>Tabela 24: Implementacja<\/strong><\/p>\n<table style=\"height: 253px; width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>createUIField()<\/em><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\">Tworzy element typu <em>X-Element<\/em>.<br \/>\nPodklasy klasy <em data-start=\"331\" data-end=\"356\">com.cisag.pgm.gui.Field<\/em> mog\u0105 nadpisa\u0107 t\u0119 metod\u0119, aby utworzy\u0107 oraz zainicjalizowa\u0107 w\u0142asny <em>X-Element<\/em>. Metoda ta jest wywo\u0142ywana przez obszar interfejsu u\u017cytkownika, gdy pole zosta\u0142o dodane do kontenera (poprzez <em data-start=\"545\" data-end=\"563\">addToContainer()<\/em>).<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>setUIElement(com..pgm.dialog.Field)<\/em><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\">Rejestruje oraz inicjalizuje przekazany <em>X-Element<\/em> (wywo\u0142uje r\u00f3wnie\u017c <em data-start=\"680\" data-end=\"702\">super.setUIElement()<\/em>).<br \/>\nPodklasy musz\u0105 wywo\u0142ywa\u0107 t\u0119 metod\u0119 w swojej implementacji <em data-start=\"770\" data-end=\"787\">createUIField()<\/em>. Je\u017celi metoda ta zostanie nadpisana, nale\u017cy r\u00f3wnie\u017c wywo\u0142a\u0107 <em data-start=\"849\" data-end=\"871\">super.setUIElement()<\/em>. Nadpisanie tej metody jest wymagane, je\u015bli podklasa implementuje w\u0142asn\u0105 referencj\u0119 (zmienn\u0105 instancyjn\u0105) do <em>X-Element<\/em>.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>createTableEditor()<\/em><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\">Tworzy now\u0105 instancj\u0119 <em data-start=\"1044\" data-end=\"1072\">com.cisag.pgm.dialog.Field<\/em> i konfiguruje j\u0105 do u\u017cycia jako edytor kom\u00f3rki w tabeli.<br \/>\nMetoda ta jest wywo\u0142ywana przez implementacj\u0119 tabeli. Podklasy klasy <em data-start=\"1206\" data-end=\"1213\">Field<\/em> powinny j\u0105 z regu\u0142y nadpisywa\u0107, je\u015bli wykorzystywana jest specjalna implementacja <em>X-Element<\/em>.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em data-start=\"1313\" data-end=\"1353\">copyFromUIField(com..pgm.dialog.Field)<\/em><br \/>\n<em data-start=\"1357\" data-end=\"1395\">copyToUIField(com..pgm.dialog.Field)<\/em><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\">Dane z edytora kom\u00f3rki s\u0105 kopiowane do pola poprzez <em data-start=\"1450\" data-end=\"1467\">copyFromUIField<\/em>, a z pola do edytora kom\u00f3rki poprzez <em data-start=\"1505\" data-end=\"1520\">copyToUIField<\/em>.<br \/>\nMetody te s\u0105 wywo\u0142ywane przez implementacj\u0119 tabeli. Podklasy klasy <em data-start=\"1596\" data-end=\"1603\">Field<\/em> musz\u0105 je zazwyczaj nadpisywa\u0107, je\u015bli wykorzystywana jest specjalna implementacja <em>X-Element<\/em>.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>createInvalidValue()<\/em><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\">Tworzy specjaln\u0105 warto\u015b\u0107 nieprawid\u0142ow\u0105. Wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"1810\" data-end=\"1834\">Nieprawid\u0142owe warto\u015bci<\/em>.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>getInvalidKeyFor()<\/em><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\">Zwraca klucz s\u0142u\u017c\u0105cy do rejestracji nieprawid\u0142owych warto\u015bci w centralnym komponencie rejestruj\u0105cym (<em data-start=\"394\" data-end=\"415\">InvalidValueSupport<\/em>).<br \/>\nMetoda ta jest wykorzystywana wewn\u0119trznie i nie powinna by\u0107 wywo\u0142ywana bezpo\u015brednio.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>getInvalidStringFor(Object)<\/em><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\">Zwraca pierwotne (b\u0142\u0119dne) dane wprowadzone przez u\u017cytkownika dla przekazanego obiektu.Metoda ta jest wykorzystywana wewn\u0119trznie i nie powinna by\u0107 wywo\u0142ywana bezpo\u015brednio.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>putInvalidStringFor(Object, String)<\/em><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\">Rejestruje okre\u015blon\u0105 warto\u015b\u0107 wraz z odpowiadaj\u0105cym jej b\u0142\u0119dnym tekstem (wpisem u\u017cytkownika) w centralnym komponencie rejestruj\u0105cym (<em data-start=\"901\" data-end=\"922\">InvalidValueSupport<\/em>).<br \/>\nMetoda ta jest wykorzystywana wewn\u0119trznie i nie powinna by\u0107 wywo\u0142ywana bezpo\u015brednio.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em data-start=\"1021\" data-end=\"1046\">registerFieldMessages()<\/em><br \/>\n<em data-start=\"1050\" data-end=\"1091\">registerFieldMessages(VisualElementve)<\/em><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\">Faktyczna rejestracja wszystkich wiadomo\u015bci przy u\u017cyciu <em data-start=\"1150\" data-end=\"1167\">registerMessage<\/em> lub wielu identyfikator\u00f3w (<em data-start=\"1195\" data-end=\"1200\">IDs<\/em>).<br \/>\nMetoda ta jest wywo\u0142ywana przez obszar interfejsu u\u017cytkownika, gdy pole zostanie dodane do kontenera poprzez <em data-start=\"1319\" data-end=\"1337\">addToContainer()<\/em>. Bezpo\u015brednie wywo\u0142anie nie jest dopuszczalne.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>createDataColumnSupport()<\/em><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\">Udost\u0119pnia og\u00f3ln\u0105 implementacj\u0119 eksportu danych, kt\u00f3ra zwraca zawarto\u015b\u0107 pola jako tekst.Podklasy powinny nadpisywa\u0107 t\u0119 metod\u0119, je\u015bli wymagana jest bardziej specjalizowana implementacja.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4 data-start=\"514\" data-end=\"761\" id=\"kontenery-najwyzszego-poziomu\" ><span class=\"ez-toc-section\" id=\"Kontenery_najwyzszego_poziomu\"><\/span>Kontenery najwy\u017cszego poziomu<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"253\" data-end=\"363\">Kontenery najwy\u017cszego poziomu stanowi\u0105 korze\u0144 hierarchii kontener\u00f3w. Do kontener\u00f3w najwy\u017cszego poziomu nale\u017c\u0105:<\/p>\n<ul>\n<li data-start=\"367\" data-end=\"405\">okno g\u0142\u00f3wne (<em data-start=\"385\" data-end=\"404\">ApplicationWindow<\/em>)<\/li>\n<li data-start=\"408\" data-end=\"452\">dialogi modalne i niemodalne (<em data-start=\"443\" data-end=\"451\">Dialog<\/em>)<\/li>\n<li data-start=\"455\" data-end=\"491\">okna podpowiedzi warto\u015bci (<em data-start=\"477\" data-end=\"490\">PopupWindow<\/em>)<\/li>\n<\/ul>\n<p data-start=\"493\" data-end=\"592\">Wsp\u00f3ln\u0105 klas\u0105 bazow\u0105 dla wszystkich kontener\u00f3w najwy\u017cszego poziomu jest <em data-start=\"565\" data-end=\"591\">com.cisag.pgm.gui.Window<\/em>.<\/p>\n<p data-start=\"0\" data-end=\"259\">Kontenery najwy\u017cszego poziomu, czyli okna, stanowi\u0105 korze\u0144 hierarchii kontener\u00f3w, ale jednocze\u015bnie tworz\u0105 mi\u0119dzy sob\u0105 w\u0142asn\u0105 hierarchi\u0119. Ta hierarchia okien nie wynika z relacji <em>zawiera<\/em>, jak w przypadku kontener\u00f3w, lecz z relacji <em>nale\u017cy do<\/em> (<em data-start=\"247\" data-end=\"257\">owned-by<\/em>).<\/p>\n<p data-start=\"261\" data-end=\"405\">Okno uznaje si\u0119 za nale\u017c\u0105ce do innego okna, je\u017celi zosta\u0142o przez nie utworzone. W tym sensie okno g\u0142\u00f3wne stanowi jedyny korze\u0144 hierarchii okien.<\/p>\n<p data-start=\"407\" data-end=\"505\">Podczas tworzenia dialog\u00f3w i okien typu podpowied\u017a warto\u015bci nale\u017cy ka\u017cdorazowo wskaza\u0107 okno, kt\u00f3re je utworzy\u0142o.<\/p>\n<p data-start=\"507\" data-end=\"563\">Hierarchia okien ma znaczenie w nast\u0119puj\u0105cych aspektach:<\/p>\n<ul>\n<li data-start=\"567\" data-end=\"627\"><strong>pozycjonowanie <em>x\/y<\/em> na ekranie<\/strong> \u2013 wzgl\u0119dem okna nadrz\u0119dnego,<\/li>\n<li data-start=\"630\" data-end=\"720\"><strong>pozycjonowanie <em>z<\/em> na ekranie<\/strong> \u2013 okno zale\u017cne powinno znajdowa\u0107 si\u0119 przed oknem nadrz\u0119dnym,<\/li>\n<li data-start=\"723\" data-end=\"825\"><strong>zamykanie okien<\/strong> \u2013 przy zamkni\u0119ciu okna nadrz\u0119dnego wszystkie okna zale\u017cne s\u0105 automatycznie zamykane,<\/li>\n<li data-start=\"828\" data-end=\"926\"><strong>zmiana fokusu<\/strong> \u2013 po zamkni\u0119ciu okna zale\u017cnego fokus automatycznie przechodzi do okna nadrz\u0119dnego,<\/li>\n<li data-start=\"929\" data-end=\"1090\"><strong>dialogi modalne<\/strong> \u2013 kilka dialog\u00f3w modalnych mo\u017ce by\u0107 widocznych jednocze\u015bnie wy\u0142\u0105cznie wtedy, gdy s\u0105 zagnie\u017cd\u017cone, tzn. gdy w hierarchii okien tworz\u0105 jedn\u0105 lini\u0119.<\/li>\n<\/ul>\n<p data-start=\"1092\" data-end=\"1307\">Wszystkie kontenery najwy\u017cszego poziomu, czyli okna, po utworzeniu (instancjonowaniu) s\u0105 pocz\u0105tkowo niewidoczne, tzn. nie s\u0105 wy\u015bwietlane na ekranie. Dopiero jawne wywo\u0142anie <em data-start=\"1265\" data-end=\"1283\">setVisible(true)<\/em> powoduje otwarcie okna.<\/p>\n<p data-start=\"1309\" data-end=\"1405\">Za pomoc\u0105 <em data-start=\"1319\" data-end=\"1338\">setVisible(false)<\/em> okno mo\u017ce zosta\u0107 ponownie zamkni\u0119te i tym samym usuni\u0119te z ekranu.<\/p>\n<p data-start=\"1407\" data-end=\"1609\">Mo\u017cliwe jest wielokrotne otwieranie i zamykanie, czyli ponowne wykorzystanie okien, przy u\u017cyciu <em>*setVisible(true\/false)*<\/em>. Ostateczne zniszczenie nast\u0119puje dopiero przez mechanizm <em data-start=\"1589\" data-end=\"1608\">Garbage Collector<\/em>.<\/p>\n<p data-start=\"1407\" data-end=\"1609\"><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Dop\u00f3ki okno jest u\u017cywane, program musi przechowywa\u0107 do niego referencj\u0119. W przeciwnym razie istnieje ryzyko przedwczesnego usuni\u0119cia przez <em data-start=\"1763\" data-end=\"1782\">Garbage Collector<\/em>.<\/div><\/section><\/p>\n<h5 data-start=\"1407\" data-end=\"1609\" id=\"applicationwindow\" ><span class=\"ez-toc-section\" id=\"ApplicationWindow\"><\/span>ApplicationWindow<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"31\" data-end=\"193\">Klasa <em data-start=\"37\" data-end=\"74\">com.cisag.pgm.gui.ApplicationWindow<\/em> reprezentuje okno g\u0142\u00f3wne Comarch ERP Enterprise. W przypadku klienta przegl\u0105darkowego odpowiada ono oknu przegl\u0105darki.<\/p>\n<p data-start=\"195\" data-end=\"393\">Dla ka\u017cdej sesji istnieje dok\u0142adnie jedna instancja klasy <em data-start=\"253\" data-end=\"290\">com.cisag.pgm.gui.ApplicationWindow<\/em>. Instancja ta jest tworzona przez silnik systemowy Comarch ERP Enterprise oraz obszar UI wraz z sesj\u0105.<\/p>\n<p data-start=\"395\" data-end=\"559\">Opr\u00f3cz r\u00f3\u017cnych obszar\u00f3w informacyjnych i nawigacyjnych okno g\u0142\u00f3wne udost\u0119pnia r\u00f3wnie\u017c obszar aplikacji. W tym obszarze aplikacje UI s\u0105 wy\u015bwietlane oraz uruchamiane.<\/p>\n<p data-start=\"395\" data-end=\"559\">Komunikacja mi\u0119dzy aplikacj\u0105 UI a oknem g\u0142\u00f3wnym odbywa si\u0119 wy\u0142\u0105cznie za po\u015brednictwem metod klasy bazowej <em data-start=\"699\" data-end=\"736\">com.cisag.pgm.base.CisUiApplication<\/em> lub automatycznie przez obszar UI b\u0105d\u017a silnik systemowy. Bezpo\u015bredni dost\u0119p aplikacji UI do okna g\u0142\u00f3wnego lub jednego z jego podkomponent\u00f3w jest niedozwolony i mo\u017ce negatywnie wp\u0142ywa\u0107 na dzia\u0142anie wszystkich aplikacji.<\/p>\n<p data-start=\"0\" data-end=\"125\">Istnieje szczeg\u00f3lny przypadek, w kt\u00f3rym okno g\u0142\u00f3wne, czyli klasa <em data-start=\"65\" data-end=\"84\">ApplicationWindow<\/em>, mo\u017ce by\u0107 u\u017cywane wewn\u0105trz aplikacji UI.<\/p>\n<p data-start=\"127\" data-end=\"435\">Dialogi oraz okna typu popup podczas tworzenia zawsze wymagaj\u0105 wskazania okna nadrz\u0119dnego (<em data-start=\"218\" data-end=\"232\">owner window<\/em>). Je\u017celi w danym przypadku jest to jednoznacznie okno g\u0142\u00f3wne (wi\u0119cej informacji znajduje si\u0119 w rozdziale <em data-start=\"321\" data-end=\"329\">Dialog<\/em>), wymagan\u0105 referencj\u0119 mo\u017cna zazwyczaj uzyska\u0107 za pomoc\u0105 metody <em data-start=\"393\" data-end=\"406\">getWindow()<\/em> w klasie <em data-start=\"416\" data-end=\"434\">CisUiApplication<\/em>.<\/p>\n<p data-start=\"437\" data-end=\"687\">Aby unikn\u0105\u0107 sytuacji, w kt\u00f3rej wszystkie powi\u0105zane obiekty lub metody musz\u0105 posiada\u0107 referencj\u0119 do <em data-start=\"536\" data-end=\"554\">CisUiApplication<\/em>, mo\u017cliwe jest r\u00f3wnie\u017c uzyskanie referencji do okna g\u0142\u00f3wnego poprzez statyczn\u0105 metod\u0119 <em data-start=\"640\" data-end=\"657\">currentWindow()<\/em> w klasie <em data-start=\"667\" data-end=\"686\">ApplicationWindow<\/em>.<\/p>\n<h5 data-start=\"437\" data-end=\"687\" id=\"dialog\" ><span class=\"ez-toc-section\" id=\"Dialog\"><\/span>Dialog<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"714\" data-end=\"900\">Mimo \u017ce dialogi, w szczeg\u00f3lno\u015bci modalne, powinny by\u0107 stosowane mo\u017cliwie jak najrzadziej (wi\u0119cej informacji na ten temat mo\u017cna znale\u017a\u0107 w artykule <em data-start=\"818\" data-end=\"830\">Styleguide<\/em>), czasami istniej\u0105 przypadki, w kt\u00f3rych ich u\u017cycie jest nieuniknione.<\/p>\n<p data-start=\"902\" data-end=\"969\">W takich sytuacjach dost\u0119pna jest klasa <em data-start=\"942\" data-end=\"968\">com.cisag.pgm.gui.Dialog<\/em>.<\/p>\n<p data-start=\"902\" data-end=\"969\"><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Do wy\u015bwietlania komunikat\u00f3w oraz dialog\u00f3w potwierdzenia nale\u017cy stosowa\u0107 klas\u0119 <em data-start=\"1062\" data-end=\"1100\">com.cisag.pgm.gui.ConfirmationDialog<\/em>.<\/div><\/section><\/p>\n<p data-start=\"1103\" data-end=\"1200\">Za pomoc\u0105 parametru w konstruktorze mo\u017cna okre\u015bli\u0107, czy ma to by\u0107 dialog modalny, czy niemodalny.<\/p>\n<p data-start=\"1103\" data-end=\"1200\">Podczas tworzenia dialog\u00f3w nale\u017cy u\u017cywa\u0107 konstruktora <em data-start=\"1283\" data-end=\"1319\">Dialog(int, VisualElement, String)<\/em>, poniewa\u017c oferuje on nast\u0119puj\u0105ce zalety:<\/p>\n<div class=\"flex flex-col text-sm pb-25\">\n<article class=\"text-token-text-primary w-full focus:outline-none [--shadow-height:45px] has-data-writing-block:pointer-events-none has-data-writing-block:-mt-(--shadow-height) has-data-writing-block:pt-(--shadow-height) [&amp;:has([data-writing-block])&gt;*]:pointer-events-auto scroll-mt-[calc(var(--header-height)+min(200px,max(70px,20svh)))]\" dir=\"auto\" tabindex=\"-1\" data-turn-id=\"request-WEB:51a4d857-4d5f-406f-bd30-b64b1398dd67-4\" data-testid=\"conversation-turn-10\" data-scroll-anchor=\"true\" data-turn=\"assistant\">\n<div class=\"text-base my-auto mx-auto pb-10 [--thread-content-margin:--spacing(4)] @w-sm\/main:[--thread-content-margin:--spacing(6)] @w-lg\/main:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)\">\n<div class=\"[--thread-content-max-width:40rem] @w-lg\/main:[--thread-content-max-width:48rem] mx-auto max-w-(--thread-content-max-width) flex-1 group\/turn-messages focus-visible:outline-hidden relative flex w-full min-w-0 flex-col agent-turn\" tabindex=\"-1\">\n<div class=\"flex max-w-full flex-col grow\">\n<div class=\"min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&amp;]:mt-1\" dir=\"auto\" data-message-author-role=\"assistant\" data-message-id=\"192b5bca-3dee-455a-a3ba-31cd2456bdb2\" data-message-model-slug=\"gpt-5-2\">\n<div class=\"flex w-full flex-col gap-1 empty:hidden first:pt-[1px]\">\n<div class=\"markdown prose dark:prose-invert w-full wrap-break-word dark markdown-new-styling\">\n<ul>\n<li data-start=\"103\" data-end=\"203\">element otwieraj\u0105cy s\u0142u\u017cy obszarowi jako punkt odniesienia do rozmieszczenia dialogu na ekranie,<\/li>\n<li data-start=\"206\" data-end=\"296\">wymagany tytu\u0142 dialogu jest ju\u017c ustalany podczas jego tworzenia na podstawie repozytorium.<\/li>\n<\/ul>\n<p data-start=\"298\" data-end=\"609\"><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Podanie w\u0142a\u015bciwego okna nadrz\u0119dnego jest istotne (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em>Kontenery najwy\u017cszego poziomu<\/em>). Z tego wzgl\u0119du u\u017cycie <em data-start=\"424\" data-end=\"454\">CisUiApplication#getWindow()<\/em> lub <em data-start=\"459\" data-end=\"494\">ApplicationWindow.currentWindow()<\/em> jest dopuszczalne wy\u0142\u0105cznie wtedy, gdy mo\u017cna zagwarantowa\u0107, \u017ce wywo\u0142anie zawsze nast\u0119puje z poziomu okna g\u0142\u00f3wnego.<\/div><\/section><\/p>\n<p data-start=\"611\" data-end=\"965\">Jak opisano w rozdziale <em>Kontenery najwy\u017cszego poziomu<\/em>, dialog staje si\u0119 widoczny dopiero po wywo\u0142aniu <em data-start=\"714\" data-end=\"732\">setVisible(true)<\/em>. Przed wywo\u0142aniem <em data-start=\"751\" data-end=\"769\">setVisible(true)<\/em> musi jednak zosta\u0107 zako\u0144czona konstrukcja oraz inicjalizacja dialogu i jego element\u00f3w podrz\u0119dnych. Wywo\u0142anie <em data-start=\"879\" data-end=\"897\">setVisible(true)<\/em> stanowi zatem zawsze ostatni\u0105 instrukcj\u0119 podczas tworzenia dialogu.<\/p>\n<p data-start=\"967\" data-end=\"1172\">W przypadku dialog\u00f3w modalnych nale\u017cy uwzgl\u0119dni\u0107, \u017ce inaczej ni\u017c np. w AWT, wywo\u0142anie <em data-start=\"1053\" data-end=\"1071\">setVisible(true)<\/em> nie blokuje dzia\u0142ania (nie czeka) do momentu zamkni\u0119cia dialogu, lecz natychmiast zwraca sterowanie.<\/p>\n<p data-start=\"1174\" data-end=\"1365\">Dla wszystkich klas pochodnych od <em data-start=\"1208\" data-end=\"1234\">com.cisag.pgm.gui.Window<\/em> dost\u0119p do hierarchii kontener\u00f3w jest dozwolony wy\u0142\u0105cznie poprzez <em data-start=\"1300\" data-end=\"1318\">getContentPane()<\/em> oraz <em>setContentPane()<\/em> (wi\u0119cej informacji znajduje si\u0119 w rozdziale <em data-start=\"1355\" data-end=\"1363\">Window<\/em>).<\/p>\n<p data-start=\"1367\" data-end=\"1634\">Rozmiar dialogu (szeroko\u015b\u0107 i wysoko\u015b\u0107) jest automatycznie obliczany na podstawie warto\u015bci <em data-start=\"1457\" data-end=\"1473\">preferredWidth<\/em> oraz <em data-start=\"1479\" data-end=\"1496\">preferredHeight<\/em> panelu zawarto\u015bci (<em data-start=\"1516\" data-end=\"1530\">content pane<\/em>). W niekt\u00f3rych przypadkach mo\u017ce by\u0107 konieczne jawne okre\u015blenie przynajmniej \u017c\u0105danej szeroko\u015bci dialogu.<\/p>\n<p data-start=\"1636\" data-end=\"1810\">Ma to miejsce np. wtedy, gdy u\u017cyte elementy lub mened\u017cery uk\u0142adu nie dostarczaj\u0105 sensownych warto\u015bci dla <em data-start=\"1741\" data-end=\"1757\">preferredWidth<\/em> lub <em data-start=\"1762\" data-end=\"1779\">preferredHeight<\/em> (wi\u0119cej informacji znajduje si\u0119 w rozdziale <em data-start=\"1792\" data-end=\"1808\">StandardLayout<\/em>).<\/p>\n<p data-start=\"1812\" data-end=\"2025\">Szeroko\u015b\u0107 i wysoko\u015b\u0107 mog\u0105 zosta\u0107 okre\u015blone za pomoc\u0105 metod <em data-start=\"1871\" data-end=\"1883\">setWidth()<\/em> oraz <em data-start=\"1889\" data-end=\"1902\">setHeight()<\/em>. W takim przypadku definiowany jest nie rozmiar panelu zawarto\u015bci, lecz ca\u0142ego dialogu (\u0142\u0105cznie z ramk\u0105 i paskiem tytu\u0142u).<\/p>\n<p data-start=\"2027\" data-end=\"2183\" data-is-last-node=\"\" data-is-only-node=\"\">W obu metodach warto\u015bci podawane s\u0105 w postaci szeroko\u015bci znak\u00f3w, dzi\u0119ki czemu ustawienia te s\u0105 niezale\u017cne od rozmiaru czcionki oraz rozdzielczo\u015bci ekranu.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"z-0 flex min-h-[46px] justify-start\">\n<p data-start=\"0\" data-end=\"103\">W rozdziale<em data-start=\"12\" data-end=\"35\">\u00a0U\u017cywanie dialog\u00f3w<\/em> przedstawiono spos\u00f3b pracy z dialogami na podstawie przyk\u0142adu kodu.<\/p>\n<h6 data-start=\"0\" data-end=\"103\" id=\"dialog-api\" ><span class=\"ez-toc-section\" id=\"Dialog_API\"><\/span>Dialog API<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"0\" data-end=\"103\">Poni\u017csze tabele przedstawiaj\u0105 najwa\u017cniejsze oraz najcz\u0119\u015bciej u\u017cywane metody klasy <em data-start=\"218\" data-end=\"226\">Dialog<\/em> (pe\u0142ne oraz szczeg\u00f3\u0142owe opisy znajduj\u0105 si\u0119 w dokumentacji JavaDoc klasy <em data-start=\"299\" data-end=\"307\">Dialog<\/em>).<\/p>\n<p data-start=\"0\" data-end=\"103\"><strong>Tabela 25: Konstruktory<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em data-start=\"400\" data-end=\"421\">Dialog(int, Window)<\/em><br \/>\n<em data-start=\"425\" data-end=\"454\">Dialog(int, Window, String)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Tworzy dialog modalny lub niemodalny (pierwszy parametr: <em data-start=\"514\" data-end=\"528\">Dialog.MODAL<\/em> lub <em data-start=\"533\" data-end=\"550\">Dialog.NONMODAL<\/em>).<br \/>\nJako drugi parametr (<em data-start=\"581\" data-end=\"589\">Window<\/em>) nale\u017cy poda\u0107 okno, do kt\u00f3rego nowy dialog ma by\u0107 przypisany. Opcjonalnie jako trzeci parametr mo\u017cna przekaza\u0107 referencj\u0119 do obiektu deweloperskiego (<em data-start=\"740\" data-end=\"757\">DataDescription<\/em> lub <em data-start=\"762\" data-end=\"769\" data-is-only-node=\"\">Table<\/em>) w postaci (bezwzgl\u0119dnej) \u015bcie\u017cki. Na tej podstawie ustalany jest tytu\u0142 dialogu. Je\u015bli nie zostanie podana \u015bcie\u017cka, dialog nie otrzymuje tytu\u0142u. Tytu\u0142 mo\u017ce jednak zosta\u0107 ustawiony p\u00f3\u017aniej za pomoc\u0105 metod <em data-start=\"974\" data-end=\"986\">setTitle()<\/em> (r\u00f3wnie\u017c po wywo\u0142aniu <em data-start=\"1009\" data-end=\"1027\">setVisible(true)<\/em>).<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em data-start=\"1034\" data-end=\"1062\">Dialog(int, VisualElement)<\/em><br \/>\n<em data-start=\"1066\" data-end=\"1102\">Dialog(int, VisualElement, String)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Ta grupa konstruktor\u00f3w zachowuje si\u0119 analogicznie do powy\u017cszych wariant\u00f3w z parametrem <em data-start=\"1192\" data-end=\"1200\">Window<\/em> jako drugim argumentem.<br \/>\nPrzypisane okno jest jednak ustalane automatycznie (za pomoc\u0105 <em data-start=\"1294\" data-end=\"1307\">getWindow()<\/em>) na podstawie przekazanego elementu <em data-start=\"1344\" data-end=\"1359\">VisualElement<\/em>. Element ten, okre\u015blany jako \u201eowner\u201d, jest elementem, z kt\u00f3rego poziomu dialog ma zosta\u0107 otwarty. Obszar mo\u017ce wykorzysta\u0107 t\u0119 informacj\u0119 do umieszczenia dialogu na ekranie wzgl\u0119dnie wzgl\u0119dem tego elementu.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<\/div>\n<\/article>\n<\/div>\n<p data-start=\"514\" data-end=\"761\"><strong>Tabela 26: Stan og\u00f3lny<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em data-start=\"196\" data-end=\"209\">isVisible()<\/em><br \/>\n<em data-start=\"213\" data-end=\"234\">setVisible(boolean)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">S\u0142u\u017cy do sprawdzania lub zmiany widoczno\u015bci.<br \/>\nDialog staje si\u0119 widoczny na ekranie dopiero po jawnym wywo\u0142aniu <em data-start=\"354\" data-end=\"372\">setVisible(true)<\/em>. Za pomoc\u0105 <em data-start=\"384\" data-end=\"403\">setVisible(false)<\/em> dialog mo\u017ce zosta\u0107 zamkni\u0119ty.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>isModal()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">S\u0142u\u017cy do sprawdzania modalno\u015bci.<br \/>\nZwraca warto\u015b\u0107 <em data-start=\"507\" data-end=\"513\">true<\/em>, je\u017celi dialog zosta\u0142 utworzony z parametrem <em data-start=\"559\" data-end=\"573\">Dialog.MODAL<\/em>. Modalno\u015b\u0107, czyli zachowanie modalne lub niemodalne, jest okre\u015blana wy\u0142\u0105cznie w konstruktorze dialogu.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em data-start=\"681\" data-end=\"696\">isResizable()<\/em><br \/>\n<em data-start=\"700\" data-end=\"723\">setResizable(boolean)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Okre\u015bla, czy u\u017cytkownik mo\u017ce zmienia\u0107 rozmiar dialogu.<br \/>\nDomy\u015blnie ustawione jest <em data-start=\"813\" data-end=\"819\">true<\/em>. Ustawienie <em data-start=\"832\" data-end=\"853\">setResizable(false)<\/em> dzia\u0142a tylko wtedy, gdy wywo\u0142anie nast\u0105pi przed <em data-start=\"902\" data-end=\"920\">setVisible(true)<\/em>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"514\" data-end=\"761\"><strong>Tabela 27: Obs\u0142uga metadanych<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em data-start=\"1019\" data-end=\"1031\">getTitle()<\/em><br \/>\n<em data-start=\"1035\" data-end=\"1053\">setTitle(String)<\/em><br \/>\n<em data-start=\"1057\" data-end=\"1079\">setTitleFrom(String)<\/em><br \/>\n<em data-start=\"1083\" data-end=\"1115\">setTitleFrom(String, String[])<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">S\u0142u\u017cy do odczytu, ustawiania lub zmiany tytu\u0142u dialogu.<br \/>\nOkre\u015blony tekst jest wy\u015bwietlany na pasku tytu\u0142u dialogu. Mo\u017cliwe jest r\u00f3wnie\u017c ustawienie tytu\u0142u na podstawie tekstu konstrukcyjnego. Je\u015bli nie jest to mo\u017cliwe, nale\u017cy u\u017cy\u0107 jednej z metod <em data-start=\"1369\" data-end=\"1385\">setTitleFrom()<\/em>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"514\" data-end=\"761\"><strong>Tabela 28: Obs\u0142uga uk\u0142adu<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em data-start=\"1480\" data-end=\"1492\">getWidth()<\/em><br \/>\n<em data-start=\"1496\" data-end=\"1511\">setWidth(int)<\/em><br \/>\n<em data-start=\"1515\" data-end=\"1528\">getHeight()<\/em><br \/>\n<em data-start=\"1532\" data-end=\"1548\">setHeight(int)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">S\u0142u\u017cy do odczytu, ustawiania lub zmiany szeroko\u015bci oraz wysoko\u015bci dialogu.<br \/>\nJawne ustawienie szeroko\u015bci lub wysoko\u015bci pozwala nadpisa\u0107 automatyczne obliczenia (na podstawie warto\u015bci <em data-start=\"1739\" data-end=\"1755\">preferredWidth<\/em> oraz <em data-start=\"1761\" data-end=\"1778\">preferredHeight<\/em> panelu zawarto\u015bci).<br \/>\nWarto\u015bci podawane s\u0105 w szeroko\u015bciach znak\u00f3w i odnosz\u0105 si\u0119 do zewn\u0119trznych wymiar\u00f3w dialogu.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"514\" data-end=\"761\"><strong>Tabela 29: Implementacja<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>closed()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Pe\u0142ni funkcj\u0119 <em>callback<\/em> i mo\u017ce zosta\u0107 nadpisana przez podklasy, kt\u00f3re wymagaj\u0105 powiadomienia o zamkni\u0119ciu dialogu.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h5 data-start=\"514\" data-end=\"761\" id=\"popupwindow\" ><span class=\"ez-toc-section\" id=\"PopupWindow\"><\/span>PopupWindow<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"294\" data-end=\"445\">Okna typu popup mo\u017cna traktowa\u0107 jako specjaln\u0105 form\u0119 okien dialogowych. W por\u00f3wnaniu do standardowych dialog\u00f3w wykazuj\u0105 one jednak nast\u0119puj\u0105ce r\u00f3\u017cnice:<\/p>\n<ul>\n<li data-start=\"449\" data-end=\"529\">nie mog\u0105 by\u0107 przesuwane przez u\u017cytkownika ani nie mo\u017cna zmienia\u0107 ich rozmiaru,<\/li>\n<li data-start=\"532\" data-end=\"618\">s\u0105 zawsze przypisane do innego elementu i otwierane w jego bezpo\u015brednim s\u0105siedztwie,<\/li>\n<li data-start=\"621\" data-end=\"650\">nie posiadaj\u0105 paska tytu\u0142u,<\/li>\n<li data-start=\"653\" data-end=\"816\">nie wyst\u0119puje rozr\u00f3\u017cnienie na tryb modalny i niemodalny; zawsze jest to okno typu popup (automatyczne zamkni\u0119cie nast\u0119puje po klikni\u0119ciu mysz\u0105 poza obszarem okna).<\/li>\n<\/ul>\n<p data-start=\"818\" data-end=\"991\">Okna popup s\u0105 wykorzystywane przede wszystkim przez obszar UI, np. jako podstawa dla p\u00f3l kombi, menu rozwijanych (<em data-start=\"932\" data-end=\"942\">dropdown<\/em>) lub podobnych element\u00f3w interfejsu u\u017cytkownika.<\/p>\n<p data-start=\"993\" data-end=\"1184\" data-is-last-node=\"\" data-is-only-node=\"\">W aplikacjach u\u017cytkownika ich zastosowanie jest wskazane szczeg\u00f3lnie wtedy, gdy istotne jest wizualne powi\u0105zanie z elementem otwieraj\u0105cym. Dobrym przyk\u0142adem s\u0105 przyciski wyboru rozwijanego.<\/p>\n<div class=\"flex flex-col text-sm pb-25\">\n<article class=\"text-token-text-primary w-full focus:outline-none [--shadow-height:45px] has-data-writing-block:pointer-events-none has-data-writing-block:-mt-(--shadow-height) has-data-writing-block:pt-(--shadow-height) [&amp;:has([data-writing-block])&gt;*]:pointer-events-auto scroll-mt-[calc(var(--header-height)+min(200px,max(70px,20svh)))]\" dir=\"auto\" tabindex=\"-1\" data-turn-id=\"request-WEB:51a4d857-4d5f-406f-bd30-b64b1398dd67-8\" data-testid=\"conversation-turn-18\" data-scroll-anchor=\"true\" data-turn=\"assistant\">\n<div class=\"text-base my-auto mx-auto pb-10 [--thread-content-margin:--spacing(4)] @w-sm\/main:[--thread-content-margin:--spacing(6)] @w-lg\/main:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)\">\n<div class=\"[--thread-content-max-width:40rem] @w-lg\/main:[--thread-content-max-width:48rem] mx-auto max-w-(--thread-content-max-width) flex-1 group\/turn-messages focus-visible:outline-hidden relative flex w-full min-w-0 flex-col agent-turn\" tabindex=\"-1\">\n<div class=\"flex max-w-full flex-col grow\">\n<div class=\"min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&amp;]:mt-1\" dir=\"auto\" data-message-author-role=\"assistant\" data-message-id=\"48953c6b-0572-46b5-a672-f95a5a08fc48\" data-message-model-slug=\"gpt-5-2\">\n<div class=\"flex w-full flex-col gap-1 empty:hidden first:pt-[1px]\">\n<div class=\"markdown prose dark:prose-invert w-full wrap-break-word dark markdown-new-styling\">\n<p data-start=\"0\" data-end=\"146\">Jak opisano ju\u017c w rozdziale <em>Kontenery najwy\u017cszego poziomu<\/em>, okno typu popup (<em data-start=\"77\" data-end=\"85\">Window<\/em>) staje si\u0119 widoczne dopiero po wywo\u0142aniu <em data-start=\"127\" data-end=\"145\">setVisible(true)<\/em>.<\/p>\n<p data-start=\"148\" data-end=\"372\">Przed wywo\u0142aniem <em data-start=\"165\" data-end=\"183\">setVisible(true)<\/em> musi zosta\u0107 zako\u0144czona konstrukcja oraz inicjalizacja okna popup i jego element\u00f3w podrz\u0119dnych. Wywo\u0142anie <em data-start=\"289\" data-end=\"307\">setVisible(true)<\/em> stanowi zawsze ostatni\u0105 instrukcj\u0119 podczas tworzenia okna popup.<\/p>\n<p data-start=\"374\" data-end=\"587\">Podobnie jak w przypadku wszystkich klas pochodnych od <em data-start=\"429\" data-end=\"455\">com.cisag.pgm.gui.Window<\/em>, dost\u0119p do hierarchii kontener\u00f3w jest dozwolony wy\u0142\u0105cznie poprzez <em data-start=\"522\" data-end=\"540\">getContentPane()<\/em> oraz <em data-start=\"546\" data-end=\"564\">setContentPane()<\/em> (wi\u0119cej informacji na ten temat mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"577\" data-end=\"585\">Window<\/em>).<\/p>\n<p data-start=\"589\" data-end=\"757\">Rozmiar okna popup (szeroko\u015b\u0107 i wysoko\u015b\u0107) jest automatycznie obliczany na podstawie warto\u015bci <em data-start=\"682\" data-end=\"698\">preferredWidth<\/em> oraz <em data-start=\"704\" data-end=\"721\">preferredHeight<\/em> panelu zawarto\u015bci (<em data-start=\"741\" data-end=\"755\">content pane<\/em>).<\/p>\n<p data-start=\"759\" data-end=\"940\">Dost\u0119pne s\u0105 wprawdzie, podobnie jak w dialogach, metody <em data-start=\"815\" data-end=\"827\">setWidth()<\/em> oraz <em data-start=\"833\" data-end=\"846\">setHeight()<\/em>, jednak ich implementacje wywo\u0142uj\u0105 jedynie <em data-start=\"890\" data-end=\"911\">setPreferredWidth()<\/em> oraz <em data-start=\"917\" data-end=\"939\">setPreferredHeight()<\/em>.<\/p>\n<p data-start=\"942\" data-end=\"1111\">Poniewa\u017c takie rozwi\u0105zanie nie jest niezale\u017cne od rozmiaru czcionki ani rozdzielczo\u015bci ekranu, metody te zosta\u0142y oznaczone jako <em data-start=\"1070\" data-end=\"1082\">deprecated<\/em> i nie powinny by\u0107 stosowane.<\/p>\n<p data-start=\"1113\" data-end=\"1275\" data-is-last-node=\"\" data-is-only-node=\"\">Je\u017celi okre\u015blenie sta\u0142ego rozmiaru jest bezwzgl\u0119dnie konieczne, nale\u017cy wywo\u0142a\u0107 <em data-start=\"1192\" data-end=\"1213\">setPreferredWidth()<\/em> lub <em data-start=\"1218\" data-end=\"1240\">setPreferredHeight()<\/em> bezpo\u015brednio na panelu zawarto\u015bci.<\/p>\n<h6 data-start=\"1113\" data-end=\"1275\" id=\"popupwindow-api\" ><span class=\"ez-toc-section\" id=\"PopupWindow_API\"><\/span><span style=\"color: initial;\">PopupWindow API<\/span><span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"1113\" data-end=\"1275\" data-is-last-node=\"\" data-is-only-node=\"\">Poni\u017csze tabele przedstawiaj\u0105 najwa\u017cniejsze oraz najcz\u0119\u015bciej u\u017cywane metody klasy <em data-start=\"269\" data-end=\"282\">PopupWindow<\/em> (pe\u0142ne oraz szczeg\u00f3\u0142owe opisy znajduj\u0105 si\u0119 w dokumentacji JavaDoc klasy <em data-start=\"355\" data-end=\"368\">PopupWindow<\/em>).<\/p>\n<p data-start=\"1113\" data-end=\"1275\" data-is-last-node=\"\" data-is-only-node=\"\"><strong><span style=\"color: initial;\">Tabela 30: Konstruktory<\/span><\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>PopupWindow(VisualElement)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Tworzy okno typu popup.<br \/>\nJako parametr (<em data-start=\"547\" data-end=\"562\">VisualElement<\/em>) nale\u017cy poda\u0107 element, z kt\u00f3rego poziomu okno popup ma zosta\u0107 otwarte. Element ten s\u0142u\u017cy obszarowi UI z jednej strony do ustalenia okna nadrz\u0119dnego, a z drugiej do pozycjonowania okna popup.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"1113\" data-end=\"1275\" data-is-last-node=\"\" data-is-only-node=\"\"><strong>Tabela 31: Wygl\u0105d wizualny<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>setShadowVisible(int)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\" data-col-size=\"xl\" data-start=\"872\" data-end=\"1066\">Okre\u015bla, czy okno popup ma by\u0107 wy\u015bwietlane z cieniem oraz jak szeroki ma by\u0107 cie\u0144 (w pikselach).<br \/>\nWarto\u015b\u0107 domy\u015blna jest ustalana przez obszar UI i zasadniczo nie powinna by\u0107 zmieniana.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"1113\" data-end=\"1275\" data-is-last-node=\"\" data-is-only-node=\"\"><strong>Tabela 32: Stan og\u00f3lny<\/strong><\/p>\n<table style=\"height: 69px; width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em data-start=\"1155\" data-end=\"1168\">isVisible()<\/em><br \/>\n<em data-start=\"1172\" data-end=\"1193\">setVisible(boolean)<\/em><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\">S\u0142u\u017cy do sprawdzania i zmiany widoczno\u015bci.<br \/>\nOkno popup staje si\u0119 widoczne dopiero po jawnym wywo\u0142aniu <em data-start=\"1304\" data-end=\"1322\">setVisible(true)<\/em>. Za pomoc\u0105 <em data-start=\"1334\" data-end=\"1353\">setVisible(false)<\/em> mo\u017ce zosta\u0107 zamkni\u0119te.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>setAutoHide(boolean)<\/em><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\">Okre\u015bla, czy okno popup ma by\u0107 automatycznie zamykane, gdy u\u017cytkownik kliknie poza jego obszarem.<br \/>\nDomy\u015blnie ustawione jest <em data-start=\"1536\" data-end=\"1542\">true<\/em>. Zmiana poprzez <em data-start=\"1559\" data-end=\"1574\">setAutoHide()<\/em> dzia\u0142a tylko wtedy, gdy wywo\u0142anie nast\u0105pi przed <em data-start=\"1623\" data-end=\"1641\">setVisible(true)<\/em>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/article>\n<\/div>\n<p data-start=\"514\" data-end=\"761\"><strong>Tabela 33: Pozycjonowanie<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>dockTo(VisualElement)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Pozycjonuje okno popup w pobli\u017cu podanego elementu.Zwykle wywo\u0142anie tej metody nie jest konieczne, poniewa\u017c element jest ju\u017c przekazywany w konstruktorze.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4 data-start=\"514\" data-end=\"761\" id=\"kontenery-standardowe\" ><span class=\"ez-toc-section\" id=\"Kontenery_standardowe\"><\/span>Kontenery standardowe<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"514\" data-end=\"761\">Obszar UI udost\u0119pnia szereg kontener\u00f3w standardowych. W odr\u00f3\u017cnieniu od konkretnych podklas <em data-start=\"559\" data-end=\"601\">com.cisag.pgm.gui.VisualElementContainer<\/em> ka\u017cda z tych podklas posiada specjalne w\u0142a\u015bciwo\u015bci dotycz\u0105ce wygl\u0105du, strukturyzacji oraz interaktywno\u015bci.<\/p>\n<h5 data-start=\"514\" data-end=\"761\" id=\"view\" ><span class=\"ez-toc-section\" id=\"View\"><\/span>View<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"733\" data-end=\"1030\">Klasa <em data-start=\"739\" data-end=\"745\">View<\/em> spe\u0142nia ten sam cel co <em data-start=\"769\" data-end=\"785\">java.awt.Panel<\/em> w AWT lub <em data-start=\"796\" data-end=\"816\">javax.swing.JPanel<\/em> w Swing. <em data-start=\"826\" data-end=\"832\">View<\/em> jest kontenerem, kt\u00f3ry nie posiada \u017cadnych specjalnych w\u0142a\u015bciwo\u015bci (kolor, ramka, tytu\u0142 itp.). W praktyce s\u0142u\u017cy do grupowania innych element\u00f3w oraz ich rozmieszczania (za pomoc\u0105 mened\u017cer\u00f3w uk\u0142adu).<\/p>\n<p data-start=\"1032\" data-end=\"1187\">W por\u00f3wnaniu do innych kontener\u00f3w (<em data-start=\"1067\" data-end=\"1091\">VisualElementContainer<\/em>) klasa <em data-start=\"1099\" data-end=\"1105\">View<\/em> nie udost\u0119pnia dodatkowej funkcjonalno\u015bci, z wyj\u0105tkiem publicznych konstruktor\u00f3w.<\/p>\n<p data-start=\"1189\" data-end=\"1457\">W interfejsach API Comarch ERP Enterprise cz\u0119sto zamiast <em data-start=\"1246\" data-end=\"1288\">com.cisag.pgm.gui.VisualElementContainer<\/em> stosowana jest klasa <em data-start=\"1310\" data-end=\"1334\">com.cisag.pgm.gui.View<\/em>. Z tego wzgl\u0119du <em data-start=\"1351\" data-end=\"1375\">com.cisag.pgm.gui.View<\/em> stanowi r\u00f3wnie\u017c klas\u0119 bazow\u0105 dla wi\u0119kszo\u015bci pozosta\u0142ych kontener\u00f3w standardowych.<\/p>\n<h6 data-start=\"1189\" data-end=\"1457\" id=\"view-api\" ><span class=\"ez-toc-section\" id=\"View_API\"><\/span>View API<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"1189\" data-end=\"1457\">Poni\u017csze tabele przedstawiaj\u0105 najwa\u017cniejsze oraz najcz\u0119\u015bciej u\u017cywane metody klasy <em data-start=\"1570\" data-end=\"1576\">View<\/em> (pe\u0142ne oraz szczeg\u00f3\u0142owe opisy znajduj\u0105 si\u0119 w dokumentacji JavaDoc klasy <em data-start=\"1649\" data-end=\"1655\">View<\/em>).<\/p>\n<p data-start=\"1189\" data-end=\"1457\"><strong>Tabela 34: Konstruktory<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 220px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Konstruktor<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 151px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 151px;\"><em data-start=\"187\" data-end=\"195\">View()<\/em><br \/>\n<em data-start=\"199\" data-end=\"220\">View(LayoutManager)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 151px;\">Tworzy prosty kontener.Opcjonalnie ju\u017c w konstruktorze mo\u017cna przekaza\u0107 mened\u017cer uk\u0142adu.<\/td>\n<\/tr>\n<tr style=\"height: 46px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 46px;\"><em data-start=\"323\" data-end=\"337\">View(String)<\/em><br \/>\n<em data-start=\"341\" data-end=\"370\">View(String, LayoutManager)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 46px;\">Ta grupa konstruktor\u00f3w umo\u017cliwia dodatkowo okre\u015blenie \u015bcie\u017cki.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h5 data-start=\"1189\" data-end=\"1457\" id=\"groupbox\" ><span class=\"ez-toc-section\" id=\"GroupBox\"><\/span>GroupBox<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"1189\" data-end=\"1457\">Podobnie jak np. <em data-start=\"483\" data-end=\"489\">View<\/em>, klasa <em data-start=\"497\" data-end=\"507\">GroupBox<\/em> posiada w\u0142asne w\u0142a\u015bciwo\u015bci wizualne. <em data-start=\"545\" data-end=\"555\">GroupBox<\/em> wy\u015bwietla tytu\u0142, odst\u0119py zewn\u0119trzne (<em data-start=\"593\" data-end=\"602\">margins<\/em>) oraz kolor t\u0142a, aby zawarte w niej elementy by\u0142y grupowane nie tylko logicznie, lecz r\u00f3wnie\u017c wizualnie.<\/p>\n<p data-start=\"1189\" data-end=\"1457\">Zachowanie oraz wygl\u0105d klasy <em data-start=\"95\" data-end=\"105\">GroupBox<\/em> mo\u017cna modyfikowa\u0107 za pomoc\u0105 w\u0142a\u015bciwo\u015bci <em data-start=\"146\" data-end=\"153\">style<\/em>:<\/p>\n<p data-start=\"1189\" data-end=\"1457\"><strong>Tabela 35: W\u0142a\u015bciwo\u015b\u0107<em> style<\/em> klasy <em>GroupBox<\/em> i <em>Shelf<\/em><\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 184px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Style<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Zachowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 45px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 45px;\"><em>STYLE_GROUPBOX<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 45px;\">Standardowy <em data-start=\"297\" data-end=\"307\">GroupBox<\/em> z tytu\u0142em oraz nieukrywalnym obszarem wy\u015bwietlania.<\/td>\n<\/tr>\n<tr style=\"height: 70px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 70px;\"><em>STYLE_SEPARATOR<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 70px;\">Podobny do <em data-start=\"395\" data-end=\"411\">STYLE_GROUPBOX<\/em>, jednak zamiast paska tytu\u0142u stosowana jest jedynie linia oddzielaj\u0105ca.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>STYLE_SHELF<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Obszar wy\u015bwietlania mo\u017ce by\u0107 rozwijany lub zwijany przez u\u017cytkownika za pomoc\u0105 dodatkowego przycisku w pasku tytu\u0142u (rozwi\u0144\/zwi\u0144). Pasek tytu\u0142u mo\u017ce r\u00f3wnie\u017c zawiera\u0107 inne elementy UI.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>STYLE_SUBSHELF<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Wariant <em data-start=\"725\" data-end=\"732\">Shelf<\/em> z przezroczystym t\u0142em (bez tytu\u0142u i bez paska tytu\u0142u). Brak wizualnego oddzielenia poprzez ramk\u0119 lub kolor t\u0142a.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"848\" data-end=\"1074\">Zazwyczaj w\u0142a\u015bciwo\u015b\u0107 <em data-start=\"869\" data-end=\"876\">style<\/em> jest jednak ustawiana automatycznie, np. poprzez wyb\u00f3r klasy lub obecno\u015b\u0107 okre\u015blonych w\u0142a\u015bciwo\u015bci (np. tytu\u0142u). Bezpo\u015brednie ustawianie <em data-start=\"1013\" data-end=\"1020\">style<\/em> najcz\u0119\u015bciej nie jest konieczne i powinno by\u0107 unikane.<\/p>\n<p data-start=\"1076\" data-end=\"1296\">Klasa <em data-start=\"1082\" data-end=\"1110\">com.cisag.pgm.gui.GroupBox<\/em> jest jednocze\u015bnie klas\u0105 bazow\u0105 dla <em data-start=\"1146\" data-end=\"1171\">com.cisag.pgm.gui.Shelf<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"1184\" data-end=\"1191\">Shelf<\/em>). Implementacja <em data-start=\"1208\" data-end=\"1215\">Shelf<\/em> stanowi (w uproszczonym uj\u0119ciu) jedynie specjaln\u0105 konfiguracj\u0119 klasy <em data-start=\"1285\" data-end=\"1295\">GroupBox<\/em>.<\/p>\n<p data-start=\"1298\" data-end=\"1511\">W konstruktorze klasy <em data-start=\"1320\" data-end=\"1330\">GroupBox<\/em> (oraz <em data-start=\"1337\" data-end=\"1344\">Shelf<\/em>) domy\u015blnie przypisywany jest mened\u017cer uk\u0142adu <em data-start=\"1390\" data-end=\"1406\">StandardLayout<\/em>. Mened\u017cer ten nie jest jednak obowi\u0105zkowy i mo\u017ce zosta\u0107 zast\u0105piony innym za pomoc\u0105 metody <em data-start=\"1497\" data-end=\"1510\">setLayout()<\/em>.<\/p>\n<h6 data-start=\"1298\" data-end=\"1511\" id=\"groupbox-api\" ><span class=\"ez-toc-section\" id=\"GroupBox_API\"><\/span>GroupBox API<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"1298\" data-end=\"1511\">Poni\u017csze tabele przedstawiaj\u0105 najwa\u017cniejsze oraz najcz\u0119\u015bciej u\u017cywane metody klasy <em data-start=\"1628\" data-end=\"1638\">GroupBox<\/em> (pe\u0142na lista znajduje si\u0119 w dokumentacji JavaDoc klasy <em data-start=\"1694\" data-end=\"1704\">GroupBox<\/em>).<\/p>\n<p data-start=\"1298\" data-end=\"1511\"><strong>Tabela 36: Konstruktory<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 69px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Konstruktor<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 46px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 46px;\"><em data-start=\"173\" data-end=\"191\">GroupBox(String)<\/em><br \/>\n<em data-start=\"195\" data-end=\"221\">GroupBox(String, String)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 46px;\">Tworzy klas\u0119 <em data-start=\"237\" data-end=\"247\">GroupBox<\/em> (<em data-start=\"249\" data-end=\"265\">STYLE_GROUPBOX<\/em>).<br \/>\nJako parametr mo\u017cna przekaza\u0107 identyfikator GUID oraz opcjonalnie dodatkow\u0105 \u015bcie\u017ck\u0119.<br \/>\nGUID s\u0142u\u017cy do identyfikacji <em data-start=\"395\" data-end=\"405\">GroupBox<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em>Og\u00f3lne w\u0142a\u015bciwo\u015bci<\/em>).<br \/>\nNa podstawie \u015bcie\u017cki (<em data-start=\"470\" data-end=\"487\" data-is-only-node=\"\">DataDescription<\/em> lub <em data-start=\"492\" data-end=\"505\">StringTable<\/em>) tytu\u0142 <em data-start=\"513\" data-end=\"523\">GroupBox<\/em> jest \u0142adowany z repozytorium.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"1298\" data-end=\"1511\"><strong>Tabela 37: Wygl\u0105d wizualny<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 209px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 140px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 140px;\"><em data-start=\"648\" data-end=\"664\">STYLE_GROUPBOX<\/em><br \/>\n<em data-start=\"668\" data-end=\"685\">STYLE_SEPARATOR<\/em><br \/>\n<em data-start=\"689\" data-end=\"702\">STYLE_SHELF<\/em><br \/>\n<em data-start=\"706\" data-end=\"722\">STYLE_SUBSHELF<\/em><br \/>\n<em data-start=\"726\" data-end=\"738\">getStyle()<\/em><br \/>\n<em data-start=\"742\" data-end=\"757\">setStyle(int)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 140px;\">S\u0142u\u017cy do odczytu, ustawiania lub zmiany wygl\u0105du oraz zachowania (<em>style<\/em>).Zazwyczaj styl jest okre\u015blany automatycznie.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>isCollapsible()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Zwraca warto\u015b\u0107 <em data-start=\"924\" data-end=\"930\">true<\/em>, je\u017celi u\u017cytkownik ma do dyspozycji przycisk do rozwijania\/zwijania obszaru wy\u015bwietlania.<br \/>\nW\u0142a\u015bciwo\u015b\u0107 ta ma znaczenie wy\u0142\u0105cznie dla klasy <em data-start=\"1075\" data-end=\"1082\">Shelf<\/em> (<em data-start=\"1084\" data-end=\"1106\">style == STYLE_SHELF<\/em> lub <em data-start=\"1111\" data-end=\"1136\">style == STYLE_SUBSHELF<\/em>). Metoda ustawiaj\u0105ca t\u0119 w\u0142a\u015bciwo\u015b\u0107 (<em>setter<\/em>) jest dost\u0119pna jedynie w podklasie <em data-start=\"1217\" data-end=\"1224\">Shelf<\/em>.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>setMargins(boolean)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Okre\u015bla, czy <em data-start=\"1267\" data-end=\"1277\">GroupBox<\/em> ma u\u017cywa\u0107 standardowych odst\u0119p\u00f3w zewn\u0119trznych (<em data-start=\"1325\" data-end=\"1334\">margins<\/em>), czy nie.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"1298\" data-end=\"1511\"><strong>Tabela 38: Stan og\u00f3lny<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em data-start=\"182\" data-end=\"197\">isCollapsed()<\/em><br \/>\n<em data-start=\"201\" data-end=\"224\">setCollapsed(boolean)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">S\u0142u\u017cy do sprawdzania oraz zmiany widoczno\u015bci obszaru wy\u015bwietlania.<br \/>\nJe\u017celi ustawiono <em data-start=\"318\" data-end=\"337\">collapsed == true<\/em>, obszar wy\u015bwietlania jest ukrywany (zwini\u0119ty).<br \/>\nW\u0142a\u015bciwo\u015b\u0107 ta jest istotna wy\u0142\u0105cznie dla klasy <em data-start=\"439\" data-end=\"446\">Shelf<\/em> (<em data-start=\"448\" data-end=\"470\">style == STYLE_SHELF<\/em> lub <em data-start=\"475\" data-end=\"500\">style == STYLE_SUBSHELF<\/em>).<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"1298\" data-end=\"1511\"><strong>Tabela 39: Obs\u0142uga metadanych<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em data-start=\"600\" data-end=\"612\">getTitle()<\/em><br \/>\n<em data-start=\"616\" data-end=\"634\">setTitle(String)<\/em><br \/>\n<em data-start=\"638\" data-end=\"660\">setTitleFrom(String)<\/em><br \/>\n<em data-start=\"664\" data-end=\"696\">setTitleFrom(String, String[])<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">S\u0142u\u017cy do odczytu, ustawiania lub zmiany tytu\u0142u.\\<br \/>\nOkre\u015blony tekst jest wy\u015bwietlany w pasku tytu\u0142u <em data-start=\"802\" data-end=\"812\">GroupBox<\/em>.<br \/>\nTytu\u0142 powinien by\u0107 ustawiany ju\u017c w konstruktorze poprzez przekazanie \u015bcie\u017cki lub za pomoc\u0105 jednej z metod <em data-start=\"927\" data-end=\"943\">setTitleFrom()<\/em>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h5 data-start=\"1298\" data-end=\"1511\" id=\"shelf\" ><span class=\"ez-toc-section\" id=\"Shelf\"><\/span>Shelf<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"971\" data-end=\"1087\">Klasa <em data-start=\"977\" data-end=\"984\">Shelf<\/em> jest specjaln\u0105 odmian\u0105 <em data-start=\"1008\" data-end=\"1018\">GroupBox<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"1031\" data-end=\"1041\">GroupBox<\/em>) z mo\u017cliwo\u015bci\u0105 zwijania obszaru wy\u015bwietlania.<\/p>\n<p data-start=\"1089\" data-end=\"1195\">Poprzez zwini\u0119cie <em data-start=\"1107\" data-end=\"1114\">Shelf<\/em> lub <em data-start=\"1119\" data-end=\"1129\">GroupBox<\/em> obszar zawarto\u015bci mo\u017ce zosta\u0107 zredukowany do samego paska tytu\u0142u.<\/p>\n<p data-start=\"1089\" data-end=\"1195\">Klasa <em data-start=\"1241\" data-end=\"1248\">Shelf<\/em> jest dost\u0119pna w dw\u00f3ch wariantach:<\/p>\n<ul>\n<li data-start=\"68\" data-end=\"232\">Typowy <em data-start=\"75\" data-end=\"82\">Shelf<\/em> posiada, podobnie jak <em data-start=\"105\" data-end=\"115\">GroupBox<\/em>, pasek tytu\u0142u oraz \u2013 tak jak <em data-start=\"145\" data-end=\"155\">GroupBox<\/em> \u2013 specjalne kolory t\u0142a s\u0142u\u017c\u0105ce wizualnemu odgraniczeniu od innych element\u00f3w.<\/li>\n<li data-start=\"236\" data-end=\"507\">Natomiast <em data-start=\"246\" data-end=\"256\">SubShelf<\/em> nie wykorzystuje \u017cadnego szczeg\u00f3lnego obramowania ani koloru t\u0142a i nie posiada przycisku do rozwijania lub zwijania. Z tego wzgl\u0119du jest szczeg\u00f3lnie przydatny w przypadkach, gdy wewn\u0105trz <em data-start=\"444\" data-end=\"454\">GroupBox<\/em> lub <em data-start=\"459\" data-end=\"466\">Shelf<\/em> potrzebna jest kolejna (zwijalna) grupa.<\/li>\n<\/ul>\n<p data-start=\"572\" data-end=\"869\">Wyb\u00f3r pomi\u0119dzy <em data-start=\"587\" data-end=\"594\">Shelf<\/em> a <em data-start=\"597\" data-end=\"607\">SubShelf<\/em> odbywa si\u0119 automatycznie poprzez tytu\u0142. Oznacza to, \u017ce je\u017celi w obiekcie klasy <em data-start=\"687\" data-end=\"694\">Shelf<\/em> zostanie ustawiony tytu\u0142, jest on wy\u015bwietlany jako zwyk\u0142y <em data-start=\"755\" data-end=\"762\">Shelf<\/em> z paskiem tytu\u0142u. Je\u017celi natomiast tytu\u0142 nie zostanie ustawiony, obiekt jest prezentowany jako <em data-start=\"858\" data-end=\"868\">SubShelf<\/em>.<\/p>\n<p data-start=\"871\" data-end=\"970\">To zachowanie mo\u017ce by\u0107 r\u00f3wnie\u017c sterowane jawnie poprzez w\u0142a\u015bciwo\u015b\u0107 <em data-start=\"938\" data-end=\"945\">style<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"958\" data-end=\"968\">GroupBox<\/em>).<\/p>\n<p data-start=\"972\" data-end=\"1082\">W przeciwie\u0144stwie do <em data-start=\"993\" data-end=\"1003\">GroupBox<\/em>, klasa <em data-start=\"1011\" data-end=\"1018\">Shelf<\/em> obs\u0142uguje tak\u017ce rozszerzenie paska tytu\u0142u o dodatkowe elementy.<\/p>\n<p data-start=\"66\" data-end=\"186\">Za pomoc\u0105 <em data-start=\"76\" data-end=\"89\">setHeader()<\/em> mo\u017cna doda\u0107 tylko jeden element. Mo\u017cliwe jest jednak przekazanie kontenera z wieloma elementami.<\/p>\n<p data-start=\"188\" data-end=\"373\">W przypadku dodawanego elementu nale\u017cy jawnie ustawi\u0107 w\u0142a\u015bciwo\u015b\u0107 <em data-start=\"253\" data-end=\"265\">alignmentX<\/em>, np. na <em data-start=\"274\" data-end=\"305\">VisualElement.RIGHT_ALIGNMENT<\/em>, je\u015bli element ma by\u0107 wy\u015bwietlany po prawej stronie w pasku tytu\u0142u.<\/p>\n<h6 data-start=\"188\" data-end=\"373\" id=\"shelf-api\" ><span class=\"ez-toc-section\" id=\"Shelf_API\"><\/span>Shelf API<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"188\" data-end=\"373\">Poni\u017csze tabele przedstawiaj\u0105 najwa\u017cniejsze oraz najcz\u0119\u015bciej u\u017cywane metody klasy <em data-start=\"487\" data-end=\"494\">Shelf<\/em> (pe\u0142na lista znajduje si\u0119 w dokumentacji JavaDoc klasy <em data-start=\"550\" data-end=\"557\">Shelf<\/em>).<\/p>\n<p data-start=\"188\" data-end=\"373\"><strong>Tabela 40: Konstruktory<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 350px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Konstruktor<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 327px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 327px;\"><em data-start=\"659\" data-end=\"674\">Shelf(String)<\/em><br \/>\n<em data-start=\"678\" data-end=\"701\">Shelf(String, String)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 327px;\">Tworzy klas\u0119 <em data-start=\"717\" data-end=\"724\">Shelf<\/em> (<em data-start=\"726\" data-end=\"739\">STYLE_SHELF<\/em>) lub <em data-start=\"745\" data-end=\"755\">SubShelf<\/em> (<em data-start=\"757\" data-end=\"773\">STYLE_SUBSHELF<\/em>).<br \/>\nDecyzja, czy tworzony jest <em data-start=\"810\" data-end=\"817\">Shelf<\/em>, czy <em data-start=\"823\" data-end=\"833\">SubShelf<\/em>, podejmowana jest automatycznie na podstawie obecno\u015bci tytu\u0142u (kt\u00f3ry mo\u017ce zosta\u0107 ustawiony r\u00f3wnie\u017c p\u00f3\u017aniej).<br \/>\nPodobnie jak w klasie bazowej (<em data-start=\"981\" data-end=\"991\">GroupBox<\/em>), jako parametr mo\u017cna przekaza\u0107 GUID lub GUID wraz ze \u015bcie\u017ck\u0105.<br \/>\nGUID s\u0142u\u017cy do identyfikacji <em data-start=\"1090\" data-end=\"1097\">Shelf<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em>Og\u00f3lne w\u0142a\u015bciwo\u015bci<\/em>).<br \/>\nNa podstawie \u015bcie\u017cki (<em data-start=\"1162\" data-end=\"1179\">DataDescription<\/em> lub <em data-start=\"1184\" data-end=\"1197\">StringTable<\/em>) tytu\u0142 <em data-start=\"1205\" data-end=\"1212\">Shelf<\/em> jest \u0142adowany z repozytorium.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"188\" data-end=\"373\"><strong>Tabela 41: Wygl\u0105d wizualny<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 69px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>setCollapsible(boolean)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Okre\u015bla, czy przycisk rozwijania\/zwijania ma by\u0107 widoczny.<br \/>\nDomy\u015blnie ustawione jest <em data-start=\"1456\" data-end=\"1462\">true<\/em>.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em data-start=\"1468\" data-end=\"1481\">getHeader()<\/em><br \/>\n<em data-start=\"1485\" data-end=\"1511\">setHeader(VisualElement)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">S\u0142u\u017cy do odczytu lub ustawiania dodatkowego elementu w obszarze paska tytu\u0142u.<br \/>\nMo\u017cna doda\u0107 tylko jeden element. Ponowne wywo\u0142anie <em data-start=\"1650\" data-end=\"1663\">setHeader()<\/em> powoduje zast\u0105pienie wcze\u015bniej ustawionego elementu.<br \/>\nMo\u017cliwe jest przekazanie kontenera zawieraj\u0105cego elementy podrz\u0119dne.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"188\" data-end=\"373\"><strong>Tabela 42: Obs\u0142uga zdarze\u0144<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 46px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>setMaximizeAction(Action)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Rejestruje now\u0105 akcj\u0119 <em>Maximize-Action<\/em>.<br \/>\nAkcja ta mo\u017ce by\u0107 wykorzystywana do synchronizacji widoczno\u015bci kilku klas <em data-start=\"304\" data-end=\"311\">Shelf<\/em>.<br \/>\nPrzyk\u0142adem jest obszar nawigacyjny Comarch ERP Enterprise. Klasy <em data-start=\"385\" data-end=\"392\">Shelf<\/em> <em>Ulubione <\/em>oraz <em>Ulubione aplikacje<\/em> s\u0105 sterowane za pomoc\u0105 tej akcji.<br \/>\nJe\u017celi jeden z wymienionych element\u00f3w zostanie otwarty, pozosta\u0142e zostan\u0105 jednocze\u015bnie zamkni\u0119te. W ten spos\u00f3b aktywny <em data-start=\"602\" data-end=\"609\">Shelf<\/em> otrzymuje maksymaln\u0105 dost\u0119pn\u0105 przestrze\u0144.<br \/>\nWyzwalaczem akcji jest zazwyczaj klikni\u0119cie w tytu\u0142 <em data-start=\"713\" data-end=\"720\">Shelf<\/em>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h5 data-start=\"514\" data-end=\"761\" id=\"scrollpane\" ><span class=\"ez-toc-section\" id=\"ScrollPane\"><\/span>ScrollPane<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"753\" data-end=\"899\">Klasa <em data-start=\"759\" data-end=\"789\">com.cisag.pgm.gui.ScrollPane<\/em> rozszerza klas\u0119 <em data-start=\"806\" data-end=\"812\">View<\/em> (wi\u0119cej informacji znajduje si\u0119 w rozdziale <em data-start=\"825\" data-end=\"831\">View<\/em>) o mo\u017cliwo\u015b\u0107 wy\u015bwietlania wy\u0142\u0105cznie fragmentu zawarto\u015bci kontenera.<\/p>\n<p data-start=\"901\" data-end=\"1040\">Funkcjonalno\u015b\u0107 ta ma znaczenie zawsze wtedy, gdy dost\u0119pna powierzchnia nie jest wystarczaj\u0105ca do pe\u0142nego wy\u015bwietlenia zawarto\u015bci kontenera.<\/p>\n<p data-start=\"1042\" data-end=\"1274\">Klasa <em data-start=\"1048\" data-end=\"1060\">ScrollPane<\/em> wy\u015bwietla z zawarto\u015bci ca\u0142ego kontenera zawsze tyle, ile pozwala dost\u0119pna przestrze\u0144. Jednocze\u015bnie umo\u017cliwia u\u017cytkownikowi przesuwanie widocznego fragmentu. W ten spos\u00f3b zapewniony jest dost\u0119p do ca\u0142ej zawarto\u015bci.<\/p>\n<p data-start=\"1276\" data-end=\"1418\">Przesuwanie zawarto\u015bci odbywa si\u0119 za pomoc\u0105 pask\u00f3w przewijania. Dla kierunku poziomego i pionowego przewidziany jest osobny pasek przewijania.<\/p>\n<p data-start=\"1420\" data-end=\"1523\">Podczas stosowania klas <em data-start=\"1444\" data-end=\"1456\">ScrollPane<\/em> z punktu widzenia ergonomii nale\u017cy uwzgl\u0119dni\u0107 nast\u0119puj\u0105ce aspekty:<\/p>\n<ul>\n<li>Nale\u017cy bezwzgl\u0119dnie unika\u0107 zagnie\u017cd\u017cania obszar\u00f3w przewijanych (nie dotyczy to klas <em data-start=\"1611\" data-end=\"1623\">ScrollPane<\/em>).<\/li>\n<li data-start=\"2\" data-end=\"163\">Nale\u017cy zrezygnowa\u0107 z poziomego przewijania, poniewa\u017c z ergonomicznego punktu widzenia jest ono problematyczne podobnie jak zagnie\u017cd\u017canie obszar\u00f3w przewijanych.<\/li>\n<li data-start=\"167\" data-end=\"274\">W przypadku list oraz tabel nale\u017cy unika\u0107 pask\u00f3w przewijania, je\u017celi elementy te umo\u017cliwiaj\u0105 kartkowanie.<\/li>\n<\/ul>\n<p data-start=\"276\" data-end=\"404\">W klasie <em data-start=\"285\" data-end=\"297\">ScrollPane<\/em> paski przewijania poziomy i pionowy mog\u0105 by\u0107 konfigurowane niezale\u017cnie. Dost\u0119pne s\u0105 trzy tryby (polityki):<\/p>\n<ul>\n<li data-start=\"408\" data-end=\"509\">nigdy nie u\u017cywa\u0107 pask\u00f3w przewijania (<em data-start=\"445\" data-end=\"463\">_SCROLLBAR_NEVER<\/em>) \u2013 zawarto\u015b\u0107 mo\u017ce zosta\u0107 w\u00f3wczas przyci\u0119ta,<\/li>\n<li data-start=\"512\" data-end=\"644\">zawsze u\u017cywa\u0107\/wy\u015bwietla\u0107 paski przewijania (<em data-start=\"556\" data-end=\"575\">_SCROLLBAR_ALWAYS<\/em>) \u2013 paski s\u0105 widoczne nawet wtedy, gdy nie s\u0105 faktycznie potrzebne,<\/li>\n<li data-start=\"647\" data-end=\"780\">u\u017cywa\u0107 pask\u00f3w przewijania w razie potrzeby (<em data-start=\"691\" data-end=\"713\">_SCROLLBAR_AS_NEEDED<\/em>) \u2013 paski s\u0105 wy\u015bwietlane tylko wtedy, gdy s\u0105 rzeczywi\u015bcie wymagane.<\/li>\n<\/ul>\n<p data-start=\"782\" data-end=\"1100\">Dla poziomych pask\u00f3w przewijania w praktyce niemal zawsze stosowana jest warto\u015b\u0107 <em data-start=\"863\" data-end=\"891\">HORIZONTAL_SCROLLBAR_NEVER<\/em>. Ryzyko przyci\u0119cia zawarto\u015bci zwykle nie wyst\u0119puje, poniewa\u017c dost\u0119pne elementy oraz mened\u017cery uk\u0142adu s\u0105 specjalnie zaprojektowane w taki spos\u00f3b, aby zapewni\u0107 automatyczne dopasowanie zawarto\u015bci do szeroko\u015bci.<\/p>\n<p data-start=\"1102\" data-end=\"1614\">W przypadku przewijania pionowego obowi\u0105zuje nast\u0119puj\u0105ca zasada: w ca\u0142ej hierarchii kontener\u00f3w danego elementu mo\u017ce znajdowa\u0107 si\u0119 maksymalnie jeden kontener z ustawieniem <em data-start=\"1273\" data-end=\"1303\">VERTICAL_SCROLLBAR_AS_NEEDED<\/em>. Dozwolone jest stosowanie wielu element\u00f3w\/kontener\u00f3w z ustawieniem <em data-start=\"1372\" data-end=\"1398\">VERTICAL_SCROLLBAR_NEVER<\/em>. Niekt\u00f3re elementy (np. <em data-start=\"1423\" data-end=\"1435\">TabbedPane<\/em>) cz\u0119\u015bciowo wymuszaj\u0105 to zachowanie, sprawdzaj\u0105c przy dodawaniu do kontenera, czy jest on kontenerem przewijanym, i w razie potrzeby ustawiaj\u0105c warto\u015b\u0107 <em data-start=\"1587\" data-end=\"1613\">VERTICAL_SCROLLBAR_NEVER<\/em>.<\/p>\n<h6 data-start=\"1102\" data-end=\"1614\" id=\"scrollpane-api\" ><span class=\"ez-toc-section\" id=\"ScrollPane_API\"><\/span>ScrollPane API<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"1102\" data-end=\"1614\">Poni\u017csze tabele przedstawiaj\u0105 najwa\u017cniejsze oraz najcz\u0119\u015bciej u\u017cywane metody klasy <em data-start=\"112\" data-end=\"124\">ScrollPane<\/em> (pe\u0142na lista oraz szczeg\u00f3\u0142owe opisy znajduj\u0105 si\u0119 w dokumentacji JavaDoc klasy <em data-start=\"203\" data-end=\"215\">ScrollPane<\/em>).<\/p>\n<p data-start=\"1102\" data-end=\"1614\"><strong>Tabela 43: Konstruktory<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Konstruktor<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em data-start=\"317\" data-end=\"331\">ScrollPane()<\/em><br \/>\n<em data-start=\"335\" data-end=\"355\">ScrollPane(Layout)<\/em><br \/>\n<em data-start=\"359\" data-end=\"379\">ScrollPane(String)<\/em><br \/>\n<em data-start=\"383\" data-end=\"418\">ScrollPane(String, LayoutManager)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Tworzy klas\u0119 <em data-start=\"434\" data-end=\"446\">ScrollPane<\/em> z ustawieniami <em data-start=\"462\" data-end=\"490\">HORIZONTAL_SCROLLBAR_NEVER<\/em> oraz <em data-start=\"496\" data-end=\"526\">VERTICAL_SCROLLBAR_AS_NEEDED<\/em>.<br \/>\nOpcjonalnie mo\u017cna przekaza\u0107 mened\u017cer uk\u0142adu i\/lub \u015bcie\u017ck\u0119<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em data-start=\"598\" data-end=\"620\">ScrollPane(int, int)<\/em><br \/>\n<em data-start=\"624\" data-end=\"661\">ScrollPane(LayoutManager, int, int)<\/em><br \/>\n<em data-start=\"665\" data-end=\"695\">ScrollPane(String, int, int)<\/em><br \/>\n<em data-start=\"699\" data-end=\"744\">ScrollPane(String, LayoutManager, int, int)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Tworzy klas\u0119 <em data-start=\"760\" data-end=\"772\">ScrollPane<\/em> z okre\u015blonymi zasadami (politykami) dla poziomego i pionowego paska przewijania.<br \/>\nOpcjonalnie mo\u017cna przekaza\u0107 mened\u017cer uk\u0142adu lub \u015bcie\u017ck\u0119.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"514\" data-end=\"761\"><strong>Tabela 44: Stan og\u00f3lny<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 162px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 116px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 116px;\"><em>HORIZONTAL_SCROLLBAR_AS_NEEDED<\/em><br \/>\n<em>HORIZONTAL_SCROLLBAR_NEVER<\/em><br \/>\n<em>HORIZONTAL_SCROLLBAR_ALWAYS<\/em><br \/>\n<em>getHorizontalScrollBarPolicy()<\/em><br \/>\n<em>setHorizontalScrollBarPolicy(int)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 116px;\">Definiuje lub odczytuje zasady u\u017cycia poziomego paska przewijania.<br \/>\nW praktyce ustawienie powinno by\u0107 niemal zawsze ustawione na <em data-start=\"413\" data-end=\"441\">HORIZONTAL_SCROLLBAR_NEVER<\/em>.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>VERTICAL_SCROLLBAR_AS_NEEDED<\/em><br \/>\n<em>VERTICAL_SCROLLBAR_NEVER<\/em><br \/>\n<em>VERTICAL_SCROLLBAR_ALWAYS<\/em><br \/>\n<em>getVerticalScrollBarPolicy()<\/em><br \/>\n<em>setVerticalScrollBarPolicy(int)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Definiuje lub odczytuje zasady u\u017cycia pionowego paska przewijania.<br \/>\nDok\u0142adnie jeden <em data-start=\"707\" data-end=\"719\">ScrollPane<\/em> lub inny element przewijania powinien u\u017cywa\u0107 ustawienia <em data-start=\"776\" data-end=\"806\">VERTICAL_SCROLLBAR_AS_NEEDED<\/em>. Wszystkie pozosta\u0142e powinny by\u0107 ustawione na <em data-start=\"853\" data-end=\"879\">VERTICAL_SCROLLBAR_NEVER<\/em>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h5 data-start=\"514\" data-end=\"761\" id=\"splitpane\" ><span class=\"ez-toc-section\" id=\"SplitPane\"><\/span>SplitPane<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"23\" data-end=\"244\">Klasa <em data-start=\"29\" data-end=\"58\">com.cisag.pgm.gui.SplitPane<\/em> jest kontenerem wywodz\u0105cym si\u0119 z <em data-start=\"92\" data-end=\"98\">View<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"112\" data-end=\"118\">View<\/em>), kt\u00f3rego obszar wy\u015bwietlania podzielony jest na dwa regiony. Regiony te mog\u0105 by\u0107 u\u0142o\u017cone obok siebie lub jeden nad drugim.<\/p>\n<p data-start=\"246\" data-end=\"389\">Ka\u017cdemu z tych region\u00f3w mo\u017cna przypisa\u0107 dok\u0142adnie jeden <em data-start=\"302\" data-end=\"317\">VisualElement<\/em>, przy czym jako <em data-start=\"334\" data-end=\"349\">VisualElement<\/em> mog\u0105 by\u0107 stosowane r\u00f3wnie\u017c kontenery.<\/p>\n<p data-start=\"391\" data-end=\"618\">Pomi\u0119dzy obydwoma regionami znajduje si\u0119 linia podzia\u0142u (<em data-start=\"448\" data-end=\"457\">Divider<\/em>). Linia ta pe\u0142ni jednocze\u015bnie funkcj\u0119 uchwytu dla u\u017cytkownika. Poprzez jej przesuwanie jeden z region\u00f3w mo\u017ce by\u0107 powi\u0119kszany kosztem drugiego lub odwrotnie.<\/p>\n<p data-start=\"620\" data-end=\"828\">Dodawanie element\u00f3w do <em data-start=\"643\" data-end=\"654\">SplitPane<\/em> musi odbywa\u0107 si\u0119 za pomoc\u0105 specjalnych metod (np. <em data-start=\"705\" data-end=\"738\">setLeftComponent(VisualElement)<\/em>). U\u017cycie metod <em data-start=\"754\" data-end=\"764\">add(&#8230;)<\/em> jest niedozwolone i prowadzi do niezdefiniowanego zachowania.<\/p>\n<p data-start=\"830\" data-end=\"1092\">W przeciwie\u0144stwie do standardowych kontener\u00f3w rozmiar zawartych element\u00f3w nie jest okre\u015blany przez mened\u017cera uk\u0142adu (<em data-start=\"947\" data-end=\"962\">LayoutManager<\/em>), lecz mo\u017ce by\u0107 bezpo\u015brednio zmieniany przez u\u017cytkownika. Ustawienie mened\u017cera uk\u0142adu nie jest wymagane i nie jest obs\u0142ugiwane.<\/p>\n<h6 data-start=\"830\" data-end=\"1092\" id=\"splitpane-api\" ><span class=\"ez-toc-section\" id=\"SplitPane_API\"><\/span>SplitPane API<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"830\" data-end=\"1092\">Poni\u017csze tabele przedstawiaj\u0105 najwa\u017cniejsze oraz najcz\u0119\u015bciej u\u017cywane metody klasy <em data-start=\"1210\" data-end=\"1221\">SplitPane<\/em> (pe\u0142na lista oraz szczeg\u00f3\u0142owe opisy znajduj\u0105 si\u0119 w dokumentacji JavaDoc klasy <em data-start=\"1300\" data-end=\"1311\">SplitPane<\/em>).<\/p>\n<p data-start=\"830\" data-end=\"1092\"><strong>Tabela 45: Konstruktory<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 162px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Konstruktor<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 116px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 116px;\"><em>SplitPane(String)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 116px;\">Tworzy <em data-start=\"136\" data-end=\"147\">SplitPane<\/em> z poziomym podzia\u0142em (<em data-start=\"170\" data-end=\"188\">HORIZONTAL_SPLIT<\/em>).<br \/>\nParametr (GUID) s\u0142u\u017cy do identyfikacji <em data-start=\"239\" data-end=\"250\" data-is-only-node=\"\">SplitPane<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em>W\u0142a\u015bciwo\u015bci og\u00f3lne<\/em>).<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>SplitPane(String, int)<\/em><br \/>\n<em>SplitPane(String, int, double)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Umo\u017cliwia okre\u015blenie kierunku podzia\u0142u (<em data-start=\"390\" data-end=\"408\">HORIZONTAL_SPLIT<\/em>, <em data-start=\"410\" data-end=\"426\">VERTICAL_SPLIT<\/em>) ju\u017c podczas tworzenia.<br \/>\nDodatkowy parametr pozwala ustawi\u0107 proporcj\u0119 rozmiaru obu region\u00f3w (patrz <em data-start=\"534\" data-end=\"563\" data-is-only-node=\"\">setInitialDividerLocation()<\/em>).<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"514\" data-end=\"761\"><strong>Tabela 46: Wygl\u0105d wizualny<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>getDividerSize()<\/em><br \/>\n<em>setDividerSize(int)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Okre\u015bla szeroko\u015b\u0107 linii podzia\u0142u mi\u0119dzy obydwoma regionami. Szeroko\u015b\u0107 ta jest predefiniowana przez obszar UI i nie powinna by\u0107 zmieniana.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"514\" data-end=\"761\"><strong>Tabela 47: Stan og\u00f3lny<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>setInitialDividerLocation(int)<\/em><br \/>\n<em>setInitialDividerLocation(double)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Programowo okre\u015bla pozycj\u0119, w kt\u00f3rej ma znajdowa\u0107 si\u0119 linia podzia\u0142u (<em data-start=\"240\" data-end=\"249\">Divider<\/em>).<br \/>\nPozycja linii podzia\u0142u wp\u0142ywa r\u00f3wnie\u017c na szeroko\u015b\u0107 obu region\u00f3w. Warto\u015b\u0107 mo\u017ce zosta\u0107 okre\u015blona jako warto\u015b\u0107 bezwzgl\u0119dna (piksele) lub jako warto\u015b\u0107 wzgl\u0119dna (0.0 do 1.0). Warto\u015b\u0107 <em>0.5<\/em> oznacza po\u0142o\u017cenie na \u015brodku.<br \/>\nOdczyt aktualnej pozycji w tej wersji <em data-start=\"523\" data-end=\"534\">SplitPane<\/em> nie jest mo\u017cliwy.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"514\" data-end=\"761\"><strong>Tabela 48: Hierarchia kontener\u00f3w i zarz\u0105dzanie uk\u0142adem<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 115px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>HORIZONTAL_SPLIT<\/em><br \/>\n<em>VERTICAL_SPLIT<\/em><br \/>\n<em>getOrientation()<\/em><br \/>\n<em>setOrientation(int)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Okre\u015bla, czy obszary wy\u015bwietlania maj\u0105 by\u0107 u\u0142o\u017cone obok siebie (<em data-start=\"841\" data-end=\"859\">HORIZONTAL_SPLIT<\/em>) czy jeden nad drugim (<em data-start=\"883\" data-end=\"899\">VERTICAL_SPLIT<\/em>).<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>getLeftComponent()<\/em><br \/>\n<em>setLeftComponent(VisualElement)<\/em><br \/>\n<em>getRightComponent()<\/em><br \/>\n<em>setRightComponent(VisualElement)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Dodaje <em data-start=\"1034\" data-end=\"1049\">VisualElement<\/em> do lewego lub prawego regionu albo zwraca aktualny element w tym regionie.<br \/>\nMetody te powinny by\u0107 u\u017cywane wy\u0142\u0105cznie w przypadku poziomego podzia\u0142u (<em data-start=\"1206\" data-end=\"1239\">orientation == HORIZONTAL_SPLIT<\/em>).<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>getTopComponent()<\/em><br \/>\n<em>setTopComponent(VisualElement)<\/em><br \/>\n<em>getBottomComponent()<\/em><br \/>\n<em>setBottomComponent(VisualElement)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Dodaje <em data-start=\"1374\" data-end=\"1389\">VisualElement<\/em> do g\u00f3rnego lub dolnego regionu albo zwraca aktualny element w tym regionie.<br \/>\nMetody te powinny by\u0107 u\u017cywane wy\u0142\u0105cznie w przypadku pionowego podzia\u0142u (<em data-start=\"1547\" data-end=\"1578\">orientation == VERTICAL_SPLIT<\/em>).<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>clear()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Usuwa wszystkie elementy (regiony).<br \/>\nMetoda ta powinna by\u0107 stosowana zamiast <em data-start=\"225\" data-end=\"235\">remove()<\/em> lub <em data-start=\"240\" data-end=\"253\">removeAll()<\/em>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h5 data-start=\"514\" data-end=\"761\" id=\"tabbedpane\" ><span class=\"ez-toc-section\" id=\"TabbedPane\"><\/span>TabbedPane<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div class=\"flex flex-col text-sm pb-25\">\n<article class=\"text-token-text-primary w-full focus:outline-none [--shadow-height:45px] has-data-writing-block:pointer-events-none has-data-writing-block:-mt-(--shadow-height) has-data-writing-block:pt-(--shadow-height) [&amp;:has([data-writing-block])&gt;*]:pointer-events-auto scroll-mt-[calc(var(--header-height)+min(200px,max(70px,20svh)))]\" dir=\"auto\" tabindex=\"-1\" data-turn-id=\"request-WEB:9fd56fa0-ec39-4648-927b-2c6726dfe3e2-16\" data-testid=\"conversation-turn-10\" data-scroll-anchor=\"true\" data-turn=\"assistant\">\n<div class=\"text-base my-auto mx-auto pb-10 [--thread-content-margin:--spacing(4)] @w-sm\/main:[--thread-content-margin:--spacing(6)] @w-lg\/main:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)\">\n<div class=\"[--thread-content-max-width:40rem] @w-lg\/main:[--thread-content-max-width:48rem] mx-auto max-w-(--thread-content-max-width) flex-1 group\/turn-messages focus-visible:outline-hidden relative flex w-full min-w-0 flex-col agent-turn\" tabindex=\"-1\">\n<div class=\"flex max-w-full flex-col grow\">\n<div class=\"min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&amp;]:mt-1\" dir=\"auto\" data-message-author-role=\"assistant\" data-message-id=\"e7dd4a83-b324-453e-aa19-02be52f804f7\" data-message-model-slug=\"gpt-5-2\">\n<div class=\"flex w-full flex-col gap-1 empty:hidden first:pt-[1px]\">\n<div class=\"markdown prose dark:prose-invert w-full wrap-break-word dark markdown-new-styling\">\n<p data-start=\"287\" data-end=\"645\">Klasa <em data-start=\"293\" data-end=\"323\">com.cisag.pgm.gui.TabbedPane<\/em> jest kontenerem wywodz\u0105cym si\u0119 z <em data-start=\"357\" data-end=\"363\">View<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"377\" data-end=\"383\">View<\/em>), kt\u00f3ry w danym momencie wy\u015bwietla tylko jeden ze swoich podelement\u00f3w. U\u017cytkownik steruje tym elementem za pomoc\u0105 zak\u0142adek (<em data-start=\"504\" data-end=\"510\">Tabs<\/em>), przy czym ka\u017cdemu podelementowi przypisana jest osobna karta. W wyniku wyboru karty widoczny staje si\u0119 przypisany do niej element.<\/p>\n<p data-start=\"0\" data-end=\"214\">Dodawanie element\u00f3w (zak\u0142adek) do <em data-start=\"34\" data-end=\"46\">TabbedPane<\/em> musi odbywa\u0107 si\u0119 za pomoc\u0105 specjalnych metod (<em data-start=\"93\" data-end=\"106\">addTab(&#8230;)<\/em>, <em data-start=\"108\" data-end=\"124\">insertTab(&#8230;)<\/em>). U\u017cycie metod <em data-start=\"140\" data-end=\"150\">add(&#8230;)<\/em> jest niedozwolone i prowadzi do niezdefiniowanego zachowania.<\/p>\n<p data-start=\"216\" data-end=\"537\">W przypadku <em data-start=\"228\" data-end=\"238\">addTab()<\/em> oraz <em data-start=\"244\" data-end=\"257\">insertTab()<\/em> opr\u00f3cz elementu nale\u017cy przekaza\u0107 r\u00f3wnie\u017c <em data-start=\"299\" data-end=\"307\">Action<\/em>. Ta <em data-start=\"312\" data-end=\"320\">Action<\/em> (z regu\u0142y tworzona na podstawie metadanych z repozytorium) definiuje z jednej strony tekst, <em data-start=\"413\" data-end=\"422\">ToolTip<\/em> oraz\/lub ikon\u0119 zak\u0142adki, a z drugiej strony s\u0142u\u017cy do identyfikacji i sterowania utworzon\u0105 w ten spos\u00f3b zak\u0142adk\u0105.<\/p>\n<p data-start=\"539\" data-end=\"812\">Za pomoc\u0105 tej <em data-start=\"553\" data-end=\"561\">Action<\/em> mo\u017cna np. wybra\u0107 zak\u0142adk\u0119, ustawi\u0107 j\u0105 jako nieaktywn\u0105 (<em>disabled<\/em>) lub ponownie usun\u0105\u0107 z <em data-start=\"651\" data-end=\"663\">TabbedPane<\/em>. Ponadto istnieje mo\u017cliwo\u015b\u0107 zarejestrowania si\u0119 przy tej <em data-start=\"721\" data-end=\"729\">Action<\/em> jako <em data-start=\"735\" data-end=\"751\">ActionListener<\/em> i otrzymywania powiadomie\u0144 o otwarciu powi\u0105zanej zak\u0142adki.<\/p>\n<p data-start=\"814\" data-end=\"928\">Metoda <em data-start=\"821\" data-end=\"830\">clear()<\/em> usuwa wszystkie elementy (regiony). Powinna by\u0107 stosowana zamiast <em data-start=\"897\" data-end=\"907\">remove()<\/em> lub <em data-start=\"912\" data-end=\"925\">removeAll()<\/em>.<\/p>\n<p data-start=\"930\" data-end=\"1074\"><em data-start=\"930\" data-end=\"942\">TabbedPane<\/em> wykorzystuje wewn\u0119trznie w\u0142asny <em data-start=\"975\" data-end=\"990\">LayoutManager<\/em>, dlatego ustawienie innego mened\u017cera uk\u0142adu nie jest mo\u017cliwe i jest niedozwolone.<\/p>\n<h6 data-start=\"930\" data-end=\"1074\" id=\"tabbedpane-api\" ><span class=\"ez-toc-section\" id=\"TabbedPane_API\"><\/span><span style=\"color: initial;\">TabbedPane API<\/span><span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"930\" data-end=\"1074\"><span style=\"color: initial; font-size: 18px;\">Poni\u017csze tabele przedstawiaj\u0105 najwa\u017cniejsze oraz najcz\u0119\u015bciej u\u017cywane metody klasy <\/span><em style=\"color: initial; font-size: 18px;\" data-start=\"1193\" data-end=\"1205\">TabbedPane<\/em><span style=\"color: initial; font-size: 18px;\"> (pe\u0142na lista oraz szczeg\u00f3\u0142owe opisy znajduj\u0105 si\u0119 w dokumentacji JavaDoc klasy <\/span><em style=\"color: initial; font-size: 18px;\" data-start=\"1284\" data-end=\"1296\">TabbedPane<\/em><span style=\"color: initial; font-size: 18px;\">).<\/span><\/p>\n<p data-start=\"930\" data-end=\"1074\"><strong><span style=\"color: initial; font-size: 18px;\">Tabela 49: Konstruktory<\/span><\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 46px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Konstruktor<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>TabbedPane(String)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Tworzy puste <em data-start=\"143\" data-end=\"155\">TabbedPane<\/em> z zak\u0142adkami umieszczonymi u g\u00f3ry (<em data-start=\"191\" data-end=\"196\">TOP<\/em>).<br \/>\nParametr (GUID) s\u0142u\u017cy do identyfikacji <em data-start=\"247\" data-end=\"259\" data-is-only-node=\"\">TabbedPane<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em>W\u0142a\u015bciwo\u015bci og\u00f3lne<\/em>).<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/article>\n<\/div>\n<p data-start=\"514\" data-end=\"761\"><strong>Tabela 50: Wygl\u0105d wizualny<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>TOP<\/em><br \/>\n<em>BOTTOM<\/em><br \/>\n<em>LEFT<\/em><br \/>\n<em>RIGHT<\/em><br \/>\n<em>getTabPlacement()<\/em><br \/>\n<em>setTabPlacement(int)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Okre\u015bla pozycj\u0119 zak\u0142adek (<em data-start=\"520\" data-end=\"526\">Tabs<\/em>).<br \/>\nZak\u0142adki mog\u0105 by\u0107 umieszczone opcjonalnie u g\u00f3ry (<em data-start=\"588\" data-end=\"593\">TOP<\/em>), na dole (<em data-start=\"605\" data-end=\"613\" data-is-only-node=\"\">BOTTOM<\/em>), po lewej (<em data-start=\"626\" data-end=\"632\">LEFT<\/em>) lub po prawej (<em data-start=\"649\" data-end=\"656\">RIGHT<\/em>) stronie <em data-start=\"666\" data-end=\"678\">TabbedPane<\/em>. Ustawieniem domy\u015blnym jest <em data-start=\"707\" data-end=\"712\">TOP<\/em>.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>DEFAULT_TABS<\/em><br \/>\n<em>SMALL_TABS<\/em><br \/>\n<em>EQUALS_TABS<\/em><br \/>\n<em>EXPANDED_TABS<\/em><br \/>\n<em>getTabStyle()<\/em><br \/>\n<em>setTabStyle(int)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Okre\u015bla rozmiar zak\u0142adek (<em data-start=\"236\" data-end=\"242\">Tabs<\/em>).<\/p>\n<ul>\n<li>Przy <em data-start=\"261\" data-end=\"273\">SMALL_TABS<\/em> rozmiar czcionki jest zmniejszony.<\/li>\n<li>Przy <em data-start=\"321\" data-end=\"334\">EQUALS_TABS<\/em> wszystkie zak\u0142adki maj\u0105 jednakow\u0105 szeroko\u015b\u0107.<\/li>\n<li>Przy <em data-start=\"392\" data-end=\"407\">EXPANDED_TABS<\/em> szeroko\u015b\u0107 zak\u0142adek jest rozdzielana na ca\u0142\u0105 szeroko\u015b\u0107 <em data-start=\"462\" data-end=\"474\">TabbedPane<\/em> (w przeciwnym razie szeroko\u015b\u0107 jest dynamiczna).<\/li>\n<\/ul>\n<p>Warto\u015bci te mo\u017cna ze sob\u0105 \u0142\u0105czy\u0107 (operatorem <em>OR<\/em>). Je\u015bli nie zostanie ustawiona \u017cadna warto\u015b\u0107, obowi\u0105zuje <em data-start=\"637\" data-end=\"651\">DEFAULT_TABS<\/em>.<br \/>\nU\u017cycie <em data-start=\"669\" data-end=\"681\">SMALL_TABS<\/em>, <em data-start=\"683\" data-end=\"696\">EQUALS_TABS<\/em> i\/lub <em data-start=\"703\" data-end=\"718\">EXPANDED_TABS<\/em> jest niedozwolone, je\u017celi pozycja zak\u0142adek ustawiona jest na <em data-start=\"780\" data-end=\"785\">TOP<\/em> lub <em data-start=\"790\" data-end=\"798\">BOTTOM<\/em>.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>NO_SCROLL_TAB_LAYOUT<\/em><br \/>\n<em>SCROLL_TAB_LAYOUT<\/em><br \/>\n<em>AUTO_SCROLL_TAB_LAYOUT<\/em><br \/>\n<em>getTabLayoutPolicy()<\/em><br \/>\n<em>setTabLayoutPolicy(int)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Okre\u015bla zachowanie obszaru zak\u0142adek w przypadku braku miejsca.<\/p>\n<ul>\n<li>Przy <em data-start=\"1012\" data-end=\"1034\">NO_SCROLL_TAB_LAYOUT<\/em> wszystkie zak\u0142adki s\u0105 zawsze wy\u015bwietlane; w razie potrzeby ich oznaczenia (np. tekst zak\u0142adki) s\u0105 skracane (\u2026).<\/li>\n<li>Przy <em data-start=\"1161\" data-end=\"1180\">SCROLL_TAB_LAYOUT<\/em> teksty zak\u0142adek s\u0105 zawsze wy\u015bwietlane; w razie potrzeby liczba wy\u015bwietlanych zak\u0142adek jest ograniczana (za pomoc\u0105 dodatkowych element\u00f3w przewijania; wszystkie zak\u0142adki s\u0105 dost\u0119pne przez menu rozwijane).<\/li>\n<li>Przy <em data-start=\"1396\" data-end=\"1420\">AUTO_SCROLL_TAB_LAYOUT<\/em> <em data-start=\"1421\" data-end=\"1433\">TabbedPane<\/em> automatycznie prze\u0142\u0105cza si\u0119 z <em data-start=\"1464\" data-end=\"1486\">NO_SCROLL_TAB_LAYOUT<\/em> na <em data-start=\"1490\" data-end=\"1509\">SCROLL_TAB_LAYOUT<\/em>, je\u017celi zabraknie miejsca.<\/li>\n<\/ul>\n<p>Ustawieniem domy\u015blnym jest <em data-start=\"1573\" data-end=\"1595\">NO_SCROLL_TAB_LAYOUT<\/em>. Zmiana tego ustawienia jest obs\u0142ugiwana wy\u0142\u0105cznie dla zak\u0142adek umieszczonych u g\u00f3ry (<em data-start=\"1682\" data-end=\"1687\">TOP<\/em>).<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"514\" data-end=\"761\"><strong>Tabela 51: Zarz\u0105dzanie zak\u0142adkami<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 230px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>addTab(Action, VisualElement)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Tworzy now\u0105 zak\u0142adk\u0119 (<em data-start=\"163\" data-end=\"168\">Tab<\/em>) dla przekazanego elementu i dodaje j\u0105 za ostatni\u0105 istniej\u0105c\u0105 zak\u0142adk\u0105.Z <em data-start=\"252\" data-end=\"260\">Action<\/em> pobierane s\u0105 tekst, <em data-start=\"281\" data-end=\"290\">ToolTip<\/em> oraz\/lub ikona, a tak\u017ce stan zak\u0142adki.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>insertTab(Action, VisualElement, int)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Zachowanie jak przy <em data-start=\"394\" data-end=\"404\">addTab()<\/em>, jednak nowa zak\u0142adka nie jest dodawana na ko\u0144cu, lecz w okre\u015blonej pozycji.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>removeTab(Action)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Usuwa zak\u0142adk\u0119 powi\u0105zan\u0105 z przekazan\u0105 <em data-start=\"544\" data-end=\"552\">Action<\/em>, czyli usuwa powi\u0105zany element.<br \/>\nZak\u0142adki musz\u0105 by\u0107 usuwane t\u0105 metod\u0105; u\u017cycie <em data-start=\"639\" data-end=\"649\">remove()<\/em> lub <em data-start=\"654\" data-end=\"667\">removeAll()<\/em> jest niedozwolone.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>getTabCount()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Zwraca aktualn\u0105 liczb\u0119 zak\u0142adek.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>getActions()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Zwraca list\u0119 (<em data-start=\"773\" data-end=\"794\">java.util.ArrayList<\/em>) wszystkich <em data-start=\"807\" data-end=\"815\">Action<\/em> dla aktualnych zak\u0142adek. Lista mo\u017ce by\u0107 modyfikowana.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>getSelectedAction()<\/em><br \/>\n<em>setSelectedAction(Action)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Przy <em data-start=\"932\" data-end=\"953\">getSelectedAction()<\/em> zwracana jest <em data-start=\"968\" data-end=\"976\">Action<\/em> odpowiadaj\u0105ca wybranej zak\u0142adce.<br \/>\n<em data-start=\"1019\" data-end=\"1046\">setSelectedAction(Action)<\/em> programowo wybiera zak\u0142adk\u0119 powi\u0105zan\u0105 z przekazan\u0105 <em data-start=\"1098\" data-end=\"1106\">Action<\/em>.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>getSelectedActionId()<\/em><br \/>\n<em>setSelectedActionId(int)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Zachowanie analogiczne do <em data-start=\"1192\" data-end=\"1213\">getSelectedAction()<\/em>, jednak zamiast <em data-start=\"1230\" data-end=\"1238\">Action<\/em> u\u017cywany jest jej identyfikator (ID).<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>getTabVisibility(Action)<\/em><br \/>\n<em>setTabVisibility(Action, boolean)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Umo\u017cliwia ukrycie zak\u0142adki bez usuwania powi\u0105zanego elementu.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>getTabVisibility(int)<\/em><br \/>\n<em>setTabVisibility(int, boolean)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Jak przy <em data-start=\"1481\" data-end=\"1516\">getTabVisibility(Action, boolean)<\/em>, jednak zamiast <em data-start=\"1533\" data-end=\"1541\">Action<\/em> u\u017cywany jest jej identyfikator (ID).<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h5 data-start=\"514\" data-end=\"761\" id=\"layeredpane\" ><span class=\"ez-toc-section\" id=\"LayeredPane\"><\/span>LayeredPane<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"0\" data-end=\"197\">Klasa <em data-start=\"6\" data-end=\"37\">com.cisag.pgm.gui.LayeredPane<\/em> jest kontenerem dziedzicz\u0105cym po <em data-start=\"71\" data-end=\"77\">View<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"91\" data-end=\"97\">View<\/em>), kt\u00f3ry \u2013 podobnie jak <em data-start=\"121\" data-end=\"133\">TabbedPane<\/em> \u2013 wy\u015bwietla zawsze tylko jeden ze swoich element\u00f3w podrz\u0119dnych.<\/p>\n<p data-start=\"199\" data-end=\"570\">W przeciwie\u0144stwie do <em data-start=\"220\" data-end=\"232\">TabbedPane<\/em>, <em data-start=\"234\" data-end=\"247\">LayeredPane<\/em> nie posiada element\u00f3w steruj\u0105cych umo\u017cliwiaj\u0105cych prze\u0142\u0105czanie wy\u015bwietlanego elementu podrz\u0119dnego. Prze\u0142\u0105czanie jest mo\u017cliwe wy\u0142\u0105cznie po stronie programu. Ponadto elementy podrz\u0119dne (okre\u015blane tutaj jako <em>Layer<\/em>) musz\u0105 by\u0107 instancjami klasy <em data-start=\"490\" data-end=\"496\">View<\/em> (w przypadku <em data-start=\"510\" data-end=\"522\">TabbedPane<\/em> zarz\u0105dzane s\u0105 instancje klasy <em data-start=\"553\" data-end=\"568\">VisualElement<\/em>).<\/p>\n<p data-start=\"199\" data-end=\"570\"><section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">Dzia\u0142anie <em data-start=\"599\" data-end=\"612\">LayeredPane<\/em> nie jest por\u00f3wnywalne z klas\u0105 <em data-start=\"643\" data-end=\"657\">JLayeredPane<\/em> ze \u015brodowiska Swing (tam mo\u017cliwe jest jednoczesne wy\u015bwietlanie wielu element\u00f3w, kt\u00f3re mog\u0105 na siebie dowolnie nachodzi\u0107).<\/div><\/section><\/p>\n<p data-start=\"781\" data-end=\"1026\">Dodawanie <em>Layer<\/em>, czyli element\u00f3w podrz\u0119dnych (<em data-start=\"831\" data-end=\"837\">View<\/em>), w <em data-start=\"842\" data-end=\"855\">LayeredPane<\/em> musi odbywa\u0107 si\u0119 przy u\u017cyciu specjalnych metod (<em data-start=\"904\" data-end=\"919\">addLayer(&#8230;)<\/em>, <em data-start=\"921\" data-end=\"939\">insertLayer(&#8230;)<\/em>). U\u017cycie metod <em data-start=\"955\" data-end=\"965\">add(&#8230;)<\/em> jest niedozwolone i prowadzi do niezdefiniowanego dzia\u0142ania.<\/p>\n<h6 data-start=\"781\" data-end=\"1026\" id=\"layeredpane-api\" ><span class=\"ez-toc-section\" id=\"LayeredPane_API\"><\/span>LayeredPane API<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"1062\" data-end=\"1248\">Poni\u017csze tabele przedstawiaj\u0105 najwa\u017cniejsze i najcz\u0119\u015bciej u\u017cywane metody klasy <em data-start=\"1141\" data-end=\"1154\">LayeredPane<\/em> (pe\u0142na lista oraz szczeg\u00f3\u0142owe opisy znajduj\u0105 si\u0119 w dokumentacji JavaDoc klasy <em data-start=\"1233\" data-end=\"1246\">LayeredPane<\/em>).<\/p>\n<p data-start=\"1250\" data-end=\"1278\"><strong>Tabela 52: Konstruktory<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Konstruktor<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>LayeredPane()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Tworzy pusty obiekt <em data-start=\"144\" data-end=\"157\">LayeredPane<\/em>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Tabela 53: Zarz\u0105dzanie Layerami<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 207px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>addLayer(View)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Dodaje wskazany element (<em data-start=\"303\" data-end=\"309\">View<\/em>) jako nowy <em>Layer<\/em> za ostatnim istniej\u0105cym <em>Layerem<\/em>.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>insertLayer(View, int)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Dzia\u0142a analogicznie do <em data-start=\"418\" data-end=\"428\">addLayer<\/em>, jednak umo\u017cliwia wstawienie nowego<em> Layeru<\/em> nie tylko na ko\u0144cu, lecz r\u00f3wnie\u017c w dowolnej pozycji.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>removeLayer(int)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Usuwa <em>Layer<\/em> znajduj\u0105cy si\u0119 na przekazanej pozycji.<br \/>\nElementy podrz\u0119dne (<em data-start=\"209\" data-end=\"216\">Layer<\/em>) musz\u0105 by\u0107 usuwane przy u\u017cyciu tej metody; u\u017cycie <em data-start=\"267\" data-end=\"277\" data-is-only-node=\"\">remove()<\/em> lub <em data-start=\"282\" data-end=\"295\">removeAll()<\/em> jest niedozwolone.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>getLayerCount()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Zwraca aktualn\u0105 liczb\u0119 <em>Layer\u00f3w<\/em>.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>getLayer(int)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Zwraca <em data-start=\"402\" data-end=\"408\">View<\/em> (<em>Layer<\/em>) znajduj\u0105cy si\u0119 na przekazanej pozycji (indeksie).<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>getSelectedLayer()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Zwraca aktualnie wy\u015bwietlany (wybrany) <em data-start=\"535\" data-end=\"541\">View<\/em> (<em>Layer<\/em>).<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>getSelectedIndex()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Zwraca indeks aktualnie wy\u015bwietlanego (wybranego) <em data-start=\"630\" data-end=\"636\">View<\/em>.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>setSelectedIndex(int)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Wy\u015bwietla <em data-start=\"678\" data-end=\"684\">View<\/em> o wskazanym indeksie.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4 data-start=\"514\" data-end=\"761\" id=\"elementy-standardowe\" ><span class=\"ez-toc-section\" id=\"Elementy_standardowe\"><\/span>Elementy standardowe<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<h5 data-start=\"514\" data-end=\"761\" id=\"label\" ><span class=\"ez-toc-section\" id=\"Label\"><\/span>Label<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"17\" data-end=\"199\">Klasa <em data-start=\"23\" data-end=\"48\">com.cisag.pgm.gui.Label<\/em> s\u0142u\u017cy do wy\u015bwietlania statycznych (nieedytowalnych) tekst\u00f3w oraz grafik (ikon). Tekst i ikona mog\u0105 by\u0107 u\u017cywane zar\u00f3wno oddzielnie, jak i w po\u0142\u0105czeniu.<\/p>\n<p data-start=\"201\" data-end=\"676\"><em data-start=\"201\" data-end=\"208\">Label<\/em> mo\u017ce pe\u0142ni\u0107 funkcj\u0119 etykiety dla innego elementu <em data-start=\"258\" data-end=\"273\">VisualElement<\/em>. Przy u\u017cyciu metody <em data-start=\"294\" data-end=\"309\">setLabelFor()<\/em> mo\u017cna utworzy\u0107 jawne powi\u0105zanie pomi\u0119dzy etykiet\u0105 a powi\u0105zanym elementem. Powi\u0105zanie to jest wymagane, aby <em data-start=\"417\" data-end=\"424\">Label<\/em> m\u00f3g\u0142 przekazywa\u0107 okre\u015blone zdarzenia (klikni\u0119cia myszy, klawisze dost\u0119pu itd.) do przypisanego elementu. Niekt\u00f3re mened\u017cery uk\u0142adu (np. <em data-start=\"561\" data-end=\"577\">StandardLayout<\/em>) r\u00f3wnie\u017c wykorzystuj\u0105 to jawne powi\u0105zanie w celu odpowiedniego rozmieszczenia etykiety i elementu.<\/p>\n<p data-start=\"201\" data-end=\"676\"><section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">Pola, tj. podklasy <em data-start=\"714\" data-end=\"739\">com.cisag.pgm.gui.Field<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"759\" data-end=\"765\">Pola<\/em>), posiadaj\u0105 zintegrowan\u0105 etykiet\u0119 i dlatego nie wymagaj\u0105 dodatkowego obiektu <em data-start=\"843\" data-end=\"850\">Label<\/em>.<\/div><\/section><\/p>\n<p data-start=\"853\" data-end=\"1057\"><em data-start=\"853\" data-end=\"860\">Label<\/em> mo\u017ce by\u0107 r\u00f3wnie\u017c u\u017cywany jako hiper\u0142\u0105cze. Opr\u00f3cz odziedziczonej z <em data-start=\"927\" data-end=\"942\">VisualElement<\/em> mo\u017cliwo\u015bci ustawienia <em data-start=\"965\" data-end=\"977\">LinkAction<\/em>, przy u\u017cyciu metody <em data-start=\"998\" data-end=\"1008\">setUrl()<\/em> mo\u017cna zdefiniowa\u0107 adres URL jako cel hiper\u0142\u0105cza.<\/p>\n<p data-start=\"1059\" data-end=\"1245\">Chocia\u017c <em data-start=\"1067\" data-end=\"1074\">Label<\/em> mo\u017ce zasadniczo s\u0142u\u017cy\u0107 do wy\u015bwietlania ka\u017cdego rodzaju nieedytowalnych danych, w Comarch ERP Enterprise dost\u0119pne s\u0105 do tego celu wyspecjalizowane podklasy <em data-start=\"1219\" data-end=\"1244\">com.cisag.pgm.gui.Field<\/em>.<\/p>\n<h6 data-start=\"1059\" data-end=\"1245\" id=\"label-api\" ><span class=\"ez-toc-section\" id=\"Label_API\"><\/span>Label API<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"1275\" data-end=\"1449\">Poni\u017csze tabele przedstawiaj\u0105 najwa\u017cniejsze i najcz\u0119\u015bciej u\u017cywane metody klasy <em data-start=\"1354\" data-end=\"1361\">Label<\/em> (pe\u0142na lista oraz szczeg\u00f3\u0142owe opisy znajduj\u0105 si\u0119 w dokumentacji JavaDoc klasy <em data-start=\"1440\" data-end=\"1447\">Label<\/em>).<\/p>\n<p data-start=\"1275\" data-end=\"1449\"><section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">Dost\u0119p do wi\u0119kszo\u015bci metod jest mo\u017cliwy dopiero po dodaniu etykiety do kontenera.<\/div><\/section><\/p>\n<p data-start=\"1551\" data-end=\"1579\"><strong>Tabela 54: Konstruktory<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Konstruktor<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em data-start=\"92\" data-end=\"101\">Label()<\/em><br \/>\n<em data-start=\"105\" data-end=\"118\" data-is-only-node=\"\">Label(Icon)<\/em><br \/>\n<em data-start=\"122\" data-end=\"137\">Label(String)<\/em><br \/>\n<em data-start=\"141\" data-end=\"162\">Label(String, Icon)<\/em><br \/>\n<em data-start=\"166\" data-end=\"189\">Label(String, String)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Tworzy obiekt <em data-start=\"206\" data-end=\"213\">Label<\/em>.<br \/>\nWy\u015bwietlany tekst lub ikona mog\u0105 zosta\u0107 okre\u015blone opcjonalnie ju\u017c w konstruktorze albo p\u00f3\u017aniej przy u\u017cyciu metod <em data-start=\"335\" data-end=\"346\">setText()<\/em>, <em data-start=\"348\" data-end=\"363\">setTextFrom()<\/em> lub <em data-start=\"368\" data-end=\"379\">setIcon()<\/em>. W konstruktorze specyfikacja tekstu zawsze odbywa si\u0119 po\u015brednio, tj. poprzez \u015bcie\u017ck\u0119 (logiczny typ danych lub <em data-start=\"491\" data-end=\"504\">Stringtable<\/em>).<br \/>\nSygnatury z dwoma parametrami umo\u017cliwiaj\u0105 dodatkowo przypisanie identyfikatora GUID do etykiety (sygnatury bez GUID s\u0105 oznaczone jako <em data-start=\"648\" data-end=\"660\">deprecated<\/em>).<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"514\" data-end=\"761\"><strong>Tabela 55: Wygl\u0105d wizualny<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 115px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em data-start=\"85\" data-end=\"91\">LEFT<\/em><br \/>\n<em data-start=\"95\" data-end=\"102\" data-is-only-node=\"\">RIGHT<\/em><br \/>\n<em data-start=\"106\" data-end=\"111\">TOP<\/em><br \/>\n<em data-start=\"115\" data-end=\"123\">BOTTOM<\/em><br \/>\n<em data-start=\"127\" data-end=\"135\">CENTER<\/em><em data-start=\"143\" data-end=\"169\">getHorizontalAlignment()<\/em><br \/>\n<em data-start=\"173\" data-end=\"202\">setHorizontalAlignment(int)<\/em><br \/>\n<em data-start=\"206\" data-end=\"230\">getVerticalAlignment()<\/em><br \/>\n<em data-start=\"234\" data-end=\"261\">setVerticalAlignment(int)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Poziome lub pionowe wyr\u00f3wnanie tekstu lub ikony wewn\u0105trz etykiety mo\u017cna odczyta\u0107, ustawi\u0107 lub zmieni\u0107 (<em data-start=\"367\" data-end=\"379\">Label.LEFT<\/em>, <em data-start=\"381\" data-end=\"395\">Label.CENTER<\/em>, <em data-start=\"397\" data-end=\"410\">Label.RIGHT<\/em> oraz <em data-start=\"416\" data-end=\"427\">Label.TOP<\/em>, <em data-start=\"429\" data-end=\"443\">Label.CENTER<\/em>, <em data-start=\"445\" data-end=\"459\">Label.BOTTOM<\/em>).<br \/>\nUstawienia te maj\u0105 znaczenie tylko wtedy, gdy etykieta jest wi\u0119ksza ni\u017c wy\u015bwietlany tekst lub ikona.W\u0142a\u015bciwo\u015bci <em data-start=\"589\" data-end=\"611\">horizontal-alignment<\/em> i <em data-start=\"614\" data-end=\"634\">vertical-alignment<\/em> nie powinny by\u0107 mylone z odziedziczonymi z <em data-start=\"678\" data-end=\"693\">VisualElement<\/em> w\u0142a\u015bciwo\u015bciami <em data-start=\"709\" data-end=\"721\">alignmentX<\/em> i <em data-start=\"724\" data-end=\"736\">alignmentY<\/em>. Te ostatnie s\u0142u\u017c\u0105 jako wskaz\u00f3wki dla okre\u015blonych mened\u017cer\u00f3w uk\u0142adu (layout manager\u00f3w) i nie wp\u0142ywaj\u0105 na wyr\u00f3wnanie wewn\u0105trz etykiety, lecz na rozmieszczenie element\u00f3w wzgl\u0119dem siebie.<br \/>\nAby uzyska\u0107 oczekiwane wyr\u00f3wnanie, oba typy w\u0142a\u015bciwo\u015bci musz\u0105 by\u0107 ze sob\u0105 odpowiednio dopasowane.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em data-start=\"1031\" data-end=\"1037\">LEFT<\/em><br \/>\n<em data-start=\"1041\" data-end=\"1048\" data-is-only-node=\"\">RIGHT<\/em><br \/>\n<em data-start=\"1052\" data-end=\"1057\">TOP<\/em><br \/>\n<em data-start=\"1061\" data-end=\"1069\">BOTTOM<\/em><br \/>\n<em data-start=\"1073\" data-end=\"1081\">CENTER<\/em><em data-start=\"1089\" data-end=\"1118\">getHorizontalTextPosition()<\/em><br \/>\n<em data-start=\"1122\" data-end=\"1154\">setHorizontalTextPosition(int)<\/em><br \/>\n<em data-start=\"1158\" data-end=\"1185\">getVerticalTextPosition()<\/em><br \/>\n<em data-start=\"1189\" data-end=\"1219\">setVerticalTextPosition(int)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Odczytanie lub ustawienie pozycji tekstu (wzgl\u0119dem ikony).Je\u017celi etykieta zawiera zar\u00f3wno ikon\u0119, jak i tekst, w\u0142a\u015bciwo\u015bci <em data-start=\"1352\" data-end=\"1376\">horizontalTextPosition<\/em> i <em data-start=\"1379\" data-end=\"1401\">verticalTextPosition<\/em> okre\u015blaj\u0105, czy tekst ma by\u0107 umieszczony po prawej, po lewej, nad, pod czy centralnie wzgl\u0119dem ikony.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em data-start=\"1517\" data-end=\"1535\">getIconTextGap()<\/em><br \/>\n<em data-start=\"1539\" data-end=\"1560\" data-is-only-node=\"\">setIconTextGap(int)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Odczytanie lub ustawienie odst\u0119pu pomi\u0119dzy tekstem a ikon\u0105.Je\u017celi etykieta zawiera zar\u00f3wno ikon\u0119, jak i tekst, elementy te s\u0105 oddzielone zdefiniowanym odst\u0119pem (w pikselach).<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em data-start=\"99\" data-end=\"105\">NONE<\/em><br \/>\n<em data-start=\"109\" data-end=\"121\">HORIZONTAL<\/em><br \/>\n<em data-start=\"125\" data-end=\"135\">VERTICAL<\/em><em data-start=\"143\" data-end=\"165\">getLineOrientation()<\/em><br \/>\n<em data-start=\"169\" data-end=\"194\">setLineOrientation(int)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Odczytanie, ustawienie lub zmiana prowadzenia linii.<br \/>\nObs\u0142ugiwane s\u0105:<\/p>\n<ul>\n<li>bez prowadzenia linii (<em data-start=\"303\" data-end=\"315\">Label.NONE<\/em>)<\/li>\n<li>linia przy dolnej kraw\u0119dzi (<em data-start=\"352\" data-end=\"370\">Label.HORIZONTAL<\/em>)<\/li>\n<li>linia przy lewej kraw\u0119dzi (<em data-start=\"406\" data-end=\"422\" data-is-only-node=\"\">Label.VERTICAL<\/em>)<\/li>\n<\/ul>\n<p>W\u0142a\u015bciwo\u015b\u0107 ta ma znaczenie, gdy <em data-start=\"463\" data-end=\"470\">Label<\/em> ma s\u0142u\u017cy\u0107 jako etykieta dla innego elementu (patrz w\u0142a\u015bciwo\u015b\u0107 <em data-start=\"533\" data-end=\"543\">labelFor<\/em>).<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"514\" data-end=\"761\"><strong>Tabela 56: Wygl\u0105d wizualny<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>setIcon(Icon)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Okre\u015bla ikon\u0119 wy\u015bwietlan\u0105 przez <em data-start=\"689\" data-end=\"696\">Label<\/em>.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>setDisabledIcon(Icon)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Umo\u017cliwia u\u017cycie specjalnej (dodatkowej) ikony dla stanu <em data-start=\"785\" data-end=\"800\">enabled=false<\/em>.<br \/>\nJe\u017celi nie zostanie zdefiniowana specjalna ikona, u\u017cywana jest standardowa reprezentacja dla tego stanu.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"514\" data-end=\"761\"><strong>Tabela 57: Wsparcie aplikacyjne<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em data-start=\"1012\" data-end=\"1022\">getUrl()<\/em><br \/>\n<em data-start=\"1026\" data-end=\"1042\">setUrl(String)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Odczytanie lub ustawienie hiper\u0142\u0105cza (URL).Umo\u017cliwia powi\u0105zanie etykiety z adresem URL. Po klikni\u0119ciu przez u\u017cytkownika etykiety (tekstu i\/lub ikony) wskazany adres URL zostaje otwarty w osobnym oknie.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>setLabelFor(VisualElement)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Okre\u015bla, \u017ce <em data-start=\"1302\" data-end=\"1309\">Label<\/em> ma pe\u0142ni\u0107 funkcj\u0119 etykiety dla innego elementu <em data-start=\"1357\" data-end=\"1372\">VisualElement<\/em>.<br \/>\nZachowanie i wygl\u0105d obu powi\u0105zanych element\u00f3w s\u0105 w\u00f3wczas zbli\u017cone do p\u00f3l (z wbudowan\u0105 etykiet\u0105).<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"514\" data-end=\"761\"><strong>Tabela 58: Wsparcie metadanych<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em data-start=\"89\" data-end=\"100\">getText()<\/em><br \/>\n<em data-start=\"104\" data-end=\"121\">setText(String)<\/em><br \/>\n<em data-start=\"125\" data-end=\"146\">setTextFrom(String)<\/em><br \/>\n<em data-start=\"150\" data-end=\"181\">setTextFrom(String, String[])<\/em><strong><br \/>\n<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Odczytanie, ustawienie lub zmiana tekstu etykiety.<br \/>\nW przypadku element\u00f3w tworzonych na podstawie metadanych (logiczny typ danych lub <em data-start=\"324\" data-end=\"337\">Stringtable<\/em>) warto\u015b\u0107 ta jest ustawiana automatycznie. Je\u017celi tekst nie ma by\u0107 wy\u015bwietlany, mo\u017cna go usun\u0105\u0107 przy u\u017cyciu <em data-start=\"445\" data-end=\"460\">setText(null)<\/em>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h5 data-start=\"514\" data-end=\"761\" id=\"button\" ><span class=\"ez-toc-section\" id=\"Button\"><\/span>Button<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"487\" data-end=\"767\">Klasa <em data-start=\"493\" data-end=\"519\">com.cisag.pgm.gui.Button<\/em> s\u0142u\u017cy do wy\u015bwietlania przycisk\u00f3w (tzw. <em>Buttons<\/em>). Naci\u015bni\u0119cie takiego przycisku przez u\u017cytkownika generuje zdarzenie dla przypisanej aplikacji. Zazwyczaj w aplikacji zdarzenie to wywo\u0142uje akcj\u0119 (<em data-start=\"716\" data-end=\"724\">Action<\/em>) (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"739\" data-end=\"747\">Action<\/em>, <em data-start=\"749\" data-end=\"765\">ActionListener<\/em>).<\/p>\n<p data-start=\"769\" data-end=\"1006\">Tworzenie i inicjalizacja przycisku odbywa si\u0119 \u2013 podobnie jak w przypadku p\u00f3l \u2013 z wykorzystaniem metadanych. Metadane przycisk\u00f3w nie pochodz\u0105 jednak, jak w przypadku p\u00f3l, z logicznych typ\u00f3w danych ani z opis\u00f3w bazodanowych, lecz z akcji.<\/p>\n<p data-start=\"1008\" data-end=\"1478\"><em data-start=\"1008\" data-end=\"1030\">Comarch ERP Enterprise Styleguide<\/em> przewiduje r\u00f3\u017cne typy i style przycisk\u00f3w. Opr\u00f3cz standardowych przycisk\u00f3w (<em data-start=\"1106\" data-end=\"1120\">Push-Buttons<\/em>) dost\u0119pne s\u0105 przyciski z menu (<em data-start=\"1152\" data-end=\"1169\">Drop-Down Menus<\/em>). Wyb\u00f3r konkretnego typu przycisku odbywa si\u0119 poprzez konstruktor. W zale\u017cno\u015bci od tego, czy akcja czy lista akcji zostanie przekazana do konstruktora, tworzony jest prosty przycisk (<em data-start=\"1353\" data-end=\"1366\">Push-Button<\/em>) albo przycisk z menu (<em data-start=\"1390\" data-end=\"1401\">Drop-Down<\/em>). Dodatkowo wygl\u0105d mo\u017cna dostosowa\u0107 do kontekstu za pomoc\u0105 parametru <em data-start=\"1471\" data-end=\"1477\">type<\/em>.<\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 161px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Typ<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Opis<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>Button.TEXT_BUTTON<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">U\u017cywany jest wy\u0142\u0105cznie tekst (etykieta) z akcji.Przycisk korzysta ze standardowej ramki, przyk\u0142adowo\u00a0[<strong>OK<\/strong>] oraz [<strong>Anuluj<\/strong>] w typowych dialogach.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>Button.ICON_BUTTON<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">U\u017cywana jest wy\u0142\u0105cznie (ma\u0142a) ikona z akcji.Przycisk posiada specjaln\u0105 ramk\u0119 z efektem<em> roll-over<\/em>. Przyk\u0142adowo, w Comarch ERP Enterprise praktycznie nie jest u\u017cywany.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>Button.HEADER_BUTTON<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">U\u017cywana jest wy\u0142\u0105cznie (ma\u0142a) ikona z akcji.Przycisk posiada specjaln\u0105 ramk\u0119 z efektem<em> roll-over<\/em>. Przyk\u0142adowo, wszystkie przyciski u\u017cywane w normalnych paskach narz\u0119dzi (<em data-start=\"471\" data-end=\"481\">CoolBars<\/em>).<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>Button.COOLBAR_BUTTON<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Jak <em data-start=\"518\" data-end=\"540\">Button.HEADER_BUTTON<\/em>, jednak u\u017cywana jest tutaj wi\u0119ksza ikona z akcji. Przyk\u0142adowo, wszystkie przyciski u\u017cywane w standardowym pasku symboli.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>Button.MENU_BUTTON<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Specjalny typ dla pozycji menu.Wykorzystywana jest (je\u015bli dost\u0119pna) zar\u00f3wno ikona, jak i tekst z akcji. Przyk\u0142adowo,\u00a0menu kontekstowe.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>Button.SMART_BUTTON<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Specjalny typ dla pozycji menu <em>Smart-Buttons<\/em>.Wykorzystywana jest (je\u015bli dost\u0119pna) zar\u00f3wno ikona, jak i tekst z akcji.<section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\"><em>Smart-Buttons<\/em> nie stanowi\u0105 odr\u0119bnego typu przycisku, lecz jedynie swoje (wewn\u0119trznie generowane) pozycje menu.<\/div><\/section><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"1141\" data-end=\"1300\">Klasa przycisku udost\u0119pnia kilka konstruktor\u00f3w o r\u00f3\u017cnych sygnaturach do tworzenia obiekt\u00f3w, np. <em data-start=\"1237\" data-end=\"1299\">Button(Action, int type, boolean showIcon, boolean showText)<\/em>.<\/p>\n<p data-start=\"1302\" data-end=\"1396\">Na podstawie przekazanego obiektu przycisk jest inicjalizowany z nast\u0119puj\u0105cymi w\u0142a\u015bciwo\u015bciami:<\/p>\n<ul>\n<li data-start=\"1400\" data-end=\"1479\">ikona \u2013 zale\u017cnie od parametru <em data-start=\"1430\" data-end=\"1440\">showIcon<\/em>, rozmiar zale\u017cny od parametru <em data-start=\"1471\" data-end=\"1477\">type<\/em><\/li>\n<li data-start=\"1482\" data-end=\"1527\">etykieta \u2013 zale\u017cnie od parametru <em data-start=\"1515\" data-end=\"1525\">showText<\/em><\/li>\n<li data-start=\"1530\" data-end=\"1539\"><em>ToolTip<\/em><\/li>\n<li data-start=\"1542\" data-end=\"1562\">skr\u00f3t klawiaturowy<\/li>\n<li data-start=\"1565\" data-end=\"1579\">tekst pomocy<\/li>\n<li data-start=\"1582\" data-end=\"1605\">status <em data-start=\"1587\" data-end=\"1605\" data-is-last-node=\"\">enabled\/disabled<\/em><\/li>\n<\/ul>\n<p data-start=\"0\" data-end=\"111\">Metadane dotycz\u0105ce akcji s\u0105 zazwyczaj tworzone i piel\u0119gnowane w repozytorium jako obiekt deweloperski <em data-start=\"102\" data-end=\"110\">Action<\/em>.<\/p>\n<p data-start=\"113\" data-end=\"204\">Przycisk jest automatycznie aktualizowany w przypadku zmiany w\u0142a\u015bciwo\u015bci przypisanej akcji.<\/p>\n<p data-start=\"206\" data-end=\"712\">Je\u017celi w konstruktorze nie zostanie przekazana pojedyncza akcja, lecz lista akcji albo akcja z <em>Subactions<\/em>, przycisk zostaje wyposa\u017cony w rozszerzone funkcje. Lewa cz\u0119\u015b\u0107 przycisku mo\u017ce bezpo\u015brednio wywo\u0142a\u0107 akcj\u0119 domy\u015bln\u0105, natomiast po prawej stronie wy\u015bwietlany jest przycisk strza\u0142ki (<em>Drop-Down-Menu<\/em>) ze wszystkimi akcjami zdefiniowanymi dla tej akcji. Tego typu przycisk okre\u015blany jest jako <em>SmartButton<\/em>. Podobny rodzaj przycisku jest udost\u0119pniany przez klas\u0119 <em data-start=\"670\" data-end=\"682\">MenuButton<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"698\" data-end=\"710\">MenuButton<\/em>).<\/p>\n<p data-start=\"714\" data-end=\"972\">Wy\u015bwietlanie<em> SmartButton<\/em> odbywa si\u0119 w stanie normalnym (u g\u00f3ry), po najechaniu kursorem myszy (\u015brodek) oraz po rozwini\u0119ciu menu (na dole). Typowy jest symbol ikony oraz skierowana w d\u00f3\u0142 strza\u0142ka po prawej stronie. Ikona symbolizuje aktualn\u0105 akcj\u0119 domy\u015bln\u0105.<\/p>\n<p data-start=\"974\" data-end=\"1163\">Menu rozwijane (<em>Drop-Down<\/em>) mo\u017cna otworzy\u0107 poprzez klikni\u0119cie strza\u0142ki. Akcje wymienione na li\u015bcie mog\u0105 zosta\u0107 bezpo\u015brednio wywo\u0142ane poprzez klikni\u0119cie albo naci\u015bni\u0119cie klawisza [<strong data-start=\"1152\" data-end=\"1161\">ENTER<\/strong>].<\/p>\n<p data-start=\"1165\" data-end=\"1303\" data-is-last-node=\"\" data-is-only-node=\"\">Za pomoc\u0105 parametr\u00f3w <em data-start=\"1186\" data-end=\"1196\">showIcon<\/em> oraz <em data-start=\"1202\" data-end=\"1212\">showText<\/em> w konstruktorze klasy mo\u017cna okre\u015bli\u0107, czy ikona, tekst czy oba elementy maj\u0105 by\u0107 widoczne.<\/p>\n<p data-start=\"1165\" data-end=\"1303\" data-is-last-node=\"\" data-is-only-node=\"\">Klasa <em data-start=\"6\" data-end=\"14\">Button<\/em> udost\u0119pnia metod\u0119 <em data-start=\"33\" data-end=\"51\">setIcon(Icon ic)<\/em>. Umo\u017cliwia ona ustawienie zewn\u0119trznych ikon, kt\u00f3re nadpisuj\u0105 ikony dostarczane przez obiekt <em data-start=\"144\" data-end=\"152\">Action<\/em>.<\/p>\n<h6 data-start=\"1165\" data-end=\"1303\" id=\"togglebutton\" ><span class=\"ez-toc-section\" id=\"ToggleButton\"><\/span>ToggleButton<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"186\" data-end=\"460\"><em data-start=\"186\" data-end=\"200\">ToggleButton<\/em> r\u00f3\u017cni si\u0119 od <em data-start=\"214\" data-end=\"222\">Button<\/em> tym, \u017ce mo\u017ce przyjmowa\u0107 jeden z dw\u00f3ch stan\u00f3w: zaznaczony (<em data-start=\"283\" data-end=\"306\">ToggleButton.SELECTED<\/em>) albo niezaznaczony (<em data-start=\"330\" data-end=\"355\">ToggleButton.DESELECTED<\/em>). Stany te r\u00f3\u017cni\u0105 si\u0119 wizualnie. Stan zaznaczony jest zazwyczaj przedstawiany jako wci\u015bni\u0119ty przycisk.<\/p>\n<p data-start=\"103\" data-end=\"461\">Tworzenie instancji <em data-start=\"123\" data-end=\"137\">ToggleButton<\/em> odbywa si\u0119 analogicznie jak w przypadku element\u00f3w klasy nadrz\u0119dnej <em data-start=\"205\" data-end=\"213\">Button<\/em>. Do konstruktora <em data-start=\"233\" data-end=\"321\">ToggleButton(String guid, Action action, int type, boolean showIcon, boolean showText) <\/em>nale\u017cy przekaza\u0107 identyfikator GUID, obiekt <em data-start=\"368\" data-end=\"376\">Action<\/em>, typ przycisku oraz parametry okre\u015blaj\u0105ce, czy maj\u0105 by\u0107 wy\u015bwietlane ikona i tekst.<\/p>\n<p data-start=\"463\" data-end=\"560\">W przypadku u\u017cycia konstruktora bez podania typu domy\u015blnie przyjmowany jest <em data-start=\"539\" data-end=\"559\">Button.TEXT_BUTTON<\/em>.<\/p>\n<p data-start=\"562\" data-end=\"777\">Stan pocz\u0105tkowy <em data-start=\"578\" data-end=\"592\">ToggleButton<\/em> jest okre\u015blany przez obiekt <em data-start=\"621\" data-end=\"629\">Action<\/em> za pomoc\u0105 <em data-start=\"640\" data-end=\"659\">action.getState()<\/em>. Ka\u017cda zmiana stanu jest przekazywana do obiektu <em data-start=\"709\" data-end=\"717\">Action<\/em>, kt\u00f3ry nast\u0119pnie informuje zarejestrowane <em data-start=\"760\" data-end=\"776\">ActionListener<\/em>.<\/p>\n<p data-start=\"779\" data-end=\"899\">Aktualny stan mo\u017cna odczyta\u0107 przy u\u017cyciu metody <em data-start=\"827\" data-end=\"839\">getState()<\/em>. Zmiana stanu jest mo\u017cliwa za pomoc\u0105 <em data-start=\"877\" data-end=\"898\">setState(int state)<\/em>.<\/p>\n<h6 data-start=\"779\" data-end=\"899\" id=\"menubutton\" ><span class=\"ez-toc-section\" id=\"MenuButton\"><\/span>MenuButton<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"930\" data-end=\"1145\"><em data-start=\"930\" data-end=\"942\">MenuButton<\/em> jest w rzeczywisto\u015bci menu rozwijanym (<em data-start=\"982\" data-end=\"993\">Drop-Down<\/em>). Jego wygl\u0105d zosta\u0142 jednak zaprojektowany w taki spos\u00f3b, aby m\u00f3g\u0142 by\u0107 u\u017cywany razem z innymi przyciskami w paskach narz\u0119dzi (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"1132\" data-end=\"1141\">CoolBar<\/em>).<\/p>\n<p data-start=\"1147\" data-end=\"1254\" data-is-last-node=\"\" data-is-only-node=\"\">Przycisk <em data-start=\"1156\" data-end=\"1168\">MenuButton<\/em> s\u0142u\u017cy wy\u0142\u0105cznie do otwierania menu rozwijanego (co jest sygnalizowane ma\u0142\u0105 strza\u0142k\u0105).<\/p>\n<p data-start=\"51\" data-end=\"270\">Podobnie jak wszystkie przyciski, r\u00f3wnie\u017c <em data-start=\"93\" data-end=\"105\">MenuButton<\/em> pobiera swoje ikony, teksty oraz skr\u00f3ty klawiaturowe z odpowiednich obiekt\u00f3w <em data-start=\"183\" data-end=\"191\">Action<\/em>. W przeciwie\u0144stwie do zwyk\u0142ego przycisku wykorzystuje on jednak kilka akcji.<\/p>\n<p data-start=\"272\" data-end=\"768\">Jedna akcja jest przypisana bezpo\u015brednio do <em data-start=\"316\" data-end=\"328\">MenuButton<\/em>, natomiast pozosta\u0142e definiuj\u0105 jego pozycje menu. Akcje te s\u0105 organizowane i udost\u0119pniane przez klas\u0119 pomocnicz\u0105 <em data-start=\"442\" data-end=\"472\">com.cisag.pgm.gui.ActionList<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"487\" data-end=\"499\">ActionList<\/em>). Klasa ta dziedziczy po <em data-start=\"525\" data-end=\"551\">com.cisag.pgm.gui.Action<\/em> i w tej roli okre\u015bla w\u0142a\u015bciwo\u015bci (ikona, tekst, skr\u00f3t klawiaturowy oraz tekst pomocy) samego <em data-start=\"645\" data-end=\"657\">MenuButton<\/em>. Zarejestrowane przy u\u017cyciu <em data-start=\"686\" data-end=\"691\">add<\/em> <em>Sub-Actions<\/em> definiuj\u0105 odpowiednie w\u0142a\u015bciwo\u015bci poszczeg\u00f3lnych pozycji menu.<\/p>\n<p data-start=\"770\" data-end=\"1020\"><em data-start=\"770\" data-end=\"782\">MenuButton<\/em> jest \u015bci\u015ble powi\u0105zany z tzw. <em>SmartButton<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"839\" data-end=\"847\">Button<\/em>). G\u0142\u00f3wna r\u00f3\u017cnica polega na tym, \u017ce <em data-start=\"883\" data-end=\"895\">MenuButton<\/em> nie posiada <em>DefaultAction<\/em> i nie zapami\u0119tuje ostatniego wyboru u\u017cytkownika. Z tego wzgl\u0119du jego przycisk nie jest dzielony.<\/p>\n<p data-start=\"1022\" data-end=\"1127\">Przyk\u0142ad w rozdziale <em data-start=\"1049\" data-end=\"1061\">MenuButton<\/em> pokazuje, jak utworzy\u0107 <em data-start=\"1085\" data-end=\"1097\">MenuButton<\/em> i doda\u0107 go do paska narz\u0119dzi.<\/p>\n<h6 data-start=\"1022\" data-end=\"1127\" id=\"checkbox\" ><span class=\"ez-toc-section\" id=\"CheckBox\"><\/span>CheckBox<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"1156\" data-end=\"1374\">Klasa <em data-start=\"1162\" data-end=\"1190\">com.cisag.pgm.gui.CheckBox<\/em> jest klas\u0105 pochodn\u0105 <em data-start=\"1211\" data-end=\"1243\">com.cisag.pgm.gui.BooleanField<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"1257\" data-end=\"1271\">BooleanField<\/em>) i rozszerza j\u0105 o mo\u017cliwo\u015b\u0107 zdefiniowania obiektu <em data-start=\"1322\" data-end=\"1330\">Action<\/em>, kt\u00f3ry zostaje wywo\u0142any przy zmianie stanu.<\/p>\n<p data-start=\"1376\" data-end=\"1537\">Obiekt <em data-start=\"1383\" data-end=\"1391\">Action<\/em> jest przekazywany do <em data-start=\"1413\" data-end=\"1423\">CheckBox<\/em> w konstruktorze <em data-start=\"1442\" data-end=\"1493\">CheckBox(String guid, String path, Action action) <\/em>wraz z identyfikatorem GUID oraz \u015bcie\u017ck\u0105.<\/p>\n<h6 data-start=\"1376\" data-end=\"1537\" id=\"radiobutton\" ><span class=\"ez-toc-section\" id=\"RadioButton\"><\/span>RadioButton<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"1569\" data-end=\"1866\">Klasa <em data-start=\"1575\" data-end=\"1606\">com.cisag.pgm.gui.RadioButton<\/em> jest klas\u0105 pochodn\u0105 <em data-start=\"1627\" data-end=\"1659\">com.cisag.pgm.gui.ToggleButton<\/em> i r\u00f3\u017cni si\u0119 od niej przede wszystkim graficzn\u0105 reprezentacj\u0105 elementu. <em data-start=\"1731\" data-end=\"1744\">RadioButton<\/em> ma typowy wygl\u0105d znanego z systemu Windows przycisku opcji, sk\u0142adaj\u0105cego si\u0119 z pola wyboru i etykiety.<\/p>\n<p data-start=\"1868\" data-end=\"1929\">Podobnie jak <em data-start=\"1881\" data-end=\"1895\">ToggleButton<\/em>, <em data-start=\"1897\" data-end=\"1910\">RadioButton<\/em> posiada dwa stany. Instancj\u0119 typu <em data-start=\"1946\" data-end=\"1959\">RadioButton<\/em> tworzy si\u0119 za pomoc\u0105 konstruktora <em data-start=\"1996\" data-end=\"2037\">RadioButton(String guid, Action action)<\/em>, kt\u00f3ry wymaga identyfikatora GUID oraz obiektu <em data-start=\"2087\" data-end=\"2095\">Action<\/em>. Sterowanie stanami oraz propagacja zdarze\u0144 przy ich zmianie s\u0105 realizowane przez klas\u0119 nadrz\u0119dn\u0105.<\/p>\n<h5 data-start=\"2100\" data-end=\"2197\" id=\"listbox\" ><span class=\"ez-toc-section\" id=\"ListBox\"><\/span>ListBox<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"2223\" data-end=\"2364\">Do prezentacji prostej listy s\u0142u\u017cy klasa <em data-start=\"2264\" data-end=\"2291\">com.cisag.pgm.gui.ListBox<\/em>. Instancj\u0119 tworzy si\u0119 przy u\u017cyciu konstruktora <em data-start=\"2341\" data-end=\"2363\">ListBox(String guid)<\/em>.<\/p>\n<p data-start=\"2366\" data-end=\"2495\">Wype\u0142nianie listy nast\u0119puje po jej utworzeniu przy u\u017cyciu metod <em data-start=\"2432\" data-end=\"2450\">add(String text)<\/em> lub <em data-start=\"2455\" data-end=\"2492\">add(String text, Object dataObject)<\/em>.<\/p>\n<p data-start=\"2497\" data-end=\"2760\">Przekazany parametr <em data-start=\"2517\" data-end=\"2523\">text<\/em> jest wy\u015bwietlany na li\u015bcie. Parametr <em data-start=\"2561\" data-end=\"2573\">dataObject<\/em> jest powi\u0105zany z danym wpisem. Je\u017celi <em data-start=\"2612\" data-end=\"2624\">dataObject<\/em> nie zostanie przekazany, jako obiekt danych przyjmowany jest sam tekst. Elementy listy s\u0105 dodawane w kolejno\u015bci wywo\u0142a\u0144 metody <em data-start=\"2752\" data-end=\"2759\">add()<\/em>.<\/p>\n<p data-start=\"2762\" data-end=\"2927\">Metoda <em data-start=\"2769\" data-end=\"2797\">getDataObjectAt(int index)<\/em> zwraca wpis o podanym indeksie. Je\u017celi taki wpis nie istnieje, metoda zwraca <em data-start=\"2875\" data-end=\"2881\">null<\/em>. Metoda <em data-start=\"2890\" data-end=\"2899\">clear()<\/em> usuwa ca\u0142\u0105 zawarto\u015b\u0107 listy.<\/p>\n<p data-start=\"2929\" data-end=\"3132\">Domy\u015blnie lista umo\u017cliwia wyb\u00f3r wielu element\u00f3w (<em data-start=\"2978\" data-end=\"3007\">MULTIPLE_INTERVAL_SELECTION<\/em>). Zmiana trybu wyboru odbywa si\u0119 za pomoc\u0105 metody <em data-start=\"3060\" data-end=\"3097\">setSelectionMode(int selectionMode)<\/em>, gdzie nale\u017cy przekaza\u0107 warto\u015b\u0107:<\/p>\n<ul>\n<li data-start=\"3136\" data-end=\"3164\"><em>0<\/em> dla <em data-start=\"3144\" data-end=\"3162\">SINGLE_SELECTION<\/em><\/li>\n<li data-start=\"3167\" data-end=\"3204\"><em>1<\/em> dla <em data-start=\"3175\" data-end=\"3202\">SINGLE_INTERVAL_SELECTION<\/em><\/li>\n<li data-start=\"3207\" data-end=\"3246\"><em>2<\/em> dla <em data-start=\"3215\" data-end=\"3244\">MULTIPLE_INTERVAL_SELECTION<\/em><\/li>\n<\/ul>\n<p data-start=\"3248\" data-end=\"3475\">Wybrane elementy mo\u017cna odczyta\u0107 przy u\u017cyciu <em data-start=\"3292\" data-end=\"3318\">getSelectedDataObjects()<\/em>. Metoda <em data-start=\"3327\" data-end=\"3369\">setSelectedDataObject(Object dataObject)<\/em> umo\u017cliwia wymuszenie wyboru okre\u015blonego elementu. Wywo\u0142anie <em data-start=\"3430\" data-end=\"3448\">clearSelection()<\/em> usuwa bie\u017c\u0105ce zaznaczenie.<\/p>\n<p data-start=\"3477\" data-end=\"3728\">Obiekty <em data-start=\"3485\" data-end=\"3494\">ListBox<\/em> obs\u0142uguj\u0105 mechanizm przewijania i w razie potrzeby wy\u015bwietlaj\u0105 pasek przewijania po prawej stronie. Metoda <em data-start=\"3602\" data-end=\"3643\">setVisibleRowCount(int visibleRowCount)<\/em> pozwala okre\u015bli\u0107 preferowan\u0105 widoczn\u0105 wysoko\u015b\u0107 listy poprzez podanie liczby wierszy.<\/p>\n<h4 data-start=\"3477\" data-end=\"3728\" id=\"pola\" ><span class=\"ez-toc-section\" id=\"Pola\"><\/span>Pola<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<h5 data-start=\"3477\" data-end=\"3728\" id=\"textfield\" ><span class=\"ez-toc-section\" id=\"TextField\"><\/span>TextField<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"21\" data-end=\"144\">Elementy typu <em data-start=\"35\" data-end=\"64\">com.cisag.pgm.gui.TextField<\/em> s\u0142u\u017c\u0105 do wprowadzania i wy\u015bwietlania prostych (jednowierszowych) ci\u0105g\u00f3w znak\u00f3w.<\/p>\n<p data-start=\"146\" data-end=\"258\">Aby utworzy\u0107 obiekt <em data-start=\"166\" data-end=\"177\">TextField<\/em>, do konstruktora nale\u017cy przekaza\u0107 identyfikator GUID oraz \u015bcie\u017ck\u0119 do metadanych.<\/p>\n<p data-start=\"260\" data-end=\"506\">Domy\u015blnie pola tekstowe s\u0105 <em>enabled<\/em>, czyli aktywne. Wywo\u0142anie metod <em data-start=\"329\" data-end=\"349\">setEditable(false)<\/em> lub <em data-start=\"354\" data-end=\"373\">setEnabled(false)<\/em> powoduje prze\u0142\u0105czenie pola odpowiednio w stan<em> read only<\/em> albo <em>disabled<\/em>. W takim przypadku wprowadzanie danych nie jest mo\u017cliwe.<\/p>\n<p data-start=\"508\" data-end=\"655\">Pola nieedytowalne nadal mog\u0105 otrzyma\u0107 fokus, a ich zawarto\u015b\u0107 mo\u017ce zosta\u0107 skopiowana do schowka (np. za pomoc\u0105 skr\u00f3tu klawiaturowego [<strong data-start=\"642\" data-end=\"652\">Ctrl<\/strong>]+[<strong data-start=\"642\" data-end=\"652\">C<\/strong>]).<\/p>\n<p data-start=\"662\" data-end=\"1018\">Za pomoc\u0105 odpowiedniego typu zawarto\u015bci w metodzie <em data-start=\"713\" data-end=\"739\">setContentType(int type)<\/em> zwyk\u0142e pole tekstowe mo\u017ce zosta\u0107 przekszta\u0142cone w pole do wysy\u0142ania wiadomo\u015bci e-mail. W tym celu nale\u017cy przekaza\u0107 warto\u015b\u0107 <em data-start=\"863\" data-end=\"893\">TextField.CONTENT_TYPE_EMAIL<\/em>. Klikni\u0119cie pola powoduje otwarcie nowego okna klienta poczty elektronicznej z wst\u0119pnie uzupe\u0142nionym adresem podanym w polu.<\/p>\n<p data-start=\"1020\" data-end=\"1178\">Analogicznie mo\u017cna utworzy\u0107 pole URL, przekazuj\u0105c warto\u015b\u0107 <em data-start=\"1078\" data-end=\"1106\">TextField.CONTENT_TYPE_URL<\/em>. Klikni\u0119cie pola otwiera wskazany adres URL w nowym oknie przegl\u0105darki.<\/p>\n<p data-start=\"1180\" data-end=\"1286\">Wizualizacja oraz zachowanie p\u00f3l e-mail i URL podczas najechania kursorem odpowiadaj\u0105 elementom typu link.<\/p>\n<p data-start=\"1288\" data-end=\"1533\">Na podstawie ustawienia <em data-start=\"1312\" data-end=\"1326\">CONTENT_TYPE<\/em> w <em data-start=\"1329\" data-end=\"1346\">DataDescription<\/em> pole tekstowe mo\u017ce zosta\u0107 prze\u0142\u0105czone w tryb <em data-start=\"1392\" data-end=\"1417\">CONTENT_TYPE_IDENTIFIER<\/em>. Oznacza to, \u017ce zawarto\u015b\u0107 pola mo\u017ce zawiera\u0107 wy\u0142\u0105cznie okre\u015blone znaki dopuszczalne dla identyfikatora (ID), tj.:<\/p>\n<ul>\n<li data-start=\"1537\" data-end=\"1554\">wielkie litery,<\/li>\n<li data-start=\"1557\" data-end=\"1565\">cyfry,<\/li>\n<li data-start=\"1568\" data-end=\"1582\">my\u015blnik,<\/li>\n<li data-start=\"1585\" data-end=\"1604\">podkre\u015blenie,<\/li>\n<li data-start=\"1607\" data-end=\"1620\">kropk\u0119.<\/li>\n<\/ul>\n<p data-start=\"1622\" data-end=\"1768\">Przy ka\u017cdej zmianie zawarto\u015bci pole jest sprawdzane pod k\u0105tem niedozwolonych znak\u00f3w i w razie potrzeby oznaczane czerwonym naro\u017cnikiem komunikatu.<\/p>\n<p data-start=\"1770\" data-end=\"2042\">Wprowadzanie niedozwolonych znak\u00f3w w polach typu <em>IDENTIFIER<\/em> jest blokowane. Dodatkowo ma\u0142e litery s\u0105 automatycznie konwertowane na wielkie. Kombinacja klawiszy [<strong data-start=\"1933\" data-end=\"1949\">CTRL<\/strong>]+[<strong data-start=\"1933\" data-end=\"1949\">ALT<\/strong>]+[<strong data-start=\"1933\" data-end=\"1949\">F12<\/strong>] umo\u017cliwia wy\u0142\u0105czenie blokady wprowadzania znak\u00f3w, a jej ponowne u\u017cycie \u2013 ponowne w\u0142\u0105czenie.<\/p>\n<p data-start=\"2044\" data-end=\"2311\">Pola dzia\u0142aj\u0105ce w trybie wyboru (<em>Selection Mode<\/em>) nie przeprowadzaj\u0105 kontroli znak\u00f3w <em>IDENTIFIER<\/em>. Nie jest r\u00f3wnie\u017c sprawdzana d\u0142ugo\u015b\u0107 tekstu, nawet je\u015bli przewiduje to logiczny typ danych przypisany do pola. Konwersja ma\u0142ych liter na wielkie pozostaje jednak aktywna.<\/p>\n<h5 data-start=\"2044\" data-end=\"2311\" id=\"extendedtextfield\" ><span class=\"ez-toc-section\" id=\"ExtendedTextField\"><\/span>ExtendedTextField<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"2347\" data-end=\"2429\"><em data-start=\"2347\" data-end=\"2366\">ExtendedTextField<\/em> to pole tekstowe rozszerzone o dodatkow\u0105, nieedytowaln\u0105 cz\u0119\u015b\u0107.<\/p>\n<p data-start=\"2431\" data-end=\"2620\" data-is-last-node=\"\" data-is-only-node=\"\">Ilustracja przedstawia <em data-start=\"2454\" data-end=\"2473\">ExtendedTextField<\/em> bez fokusu (g\u00f3rny obraz) oraz z aktywnym fokusem. Opisowa cz\u0119\u015b\u0107 tekstowa jest wy\u015bwietlana po prawej stronie pola edytowalnego jasnoszar\u0105 czcionk\u0105.<\/p>\n<p data-start=\"63\" data-end=\"220\">U\u017cytkownik mo\u017ce zmienia\u0107 wy\u0142\u0105cznie cz\u0119\u015b\u0107 edytowaln\u0105 tekstu. Cz\u0119\u015b\u0107 opisowa jest zawsze ustawiana przez system przy u\u017cyciu metody <em data-start=\"191\" data-end=\"219\">setDescription(String str)<\/em>.<\/p>\n<p data-start=\"222\" data-end=\"308\"><em data-start=\"222\" data-end=\"241\">ExtendedTextField<\/em> mo\u017ce \u2013 jak ka\u017cde pole \u2013 zosta\u0107 wyposa\u017cone w pomoc wyboru warto\u015bci.<\/p>\n<p data-start=\"310\" data-end=\"642\">W konstruktorze <em data-start=\"326\" data-end=\"345\">ExtendedTextField<\/em>, opr\u00f3cz identyfikatora GUID i \u015bcie\u017cki, oczekiwany jest parametr logiczny <em>description<\/em>. Parametr ten okre\u015bla, czy cz\u0119\u015b\u0107 opisowa ma by\u0107 wy\u015bwietlana na sta\u0142e, czy jedynie jako podpowied\u017a (<em>ToolTip<\/em>). Zachowanie to mo\u017cna r\u00f3wnie\u017c kontrolowa\u0107 za pomoc\u0105 metody <em data-start=\"599\" data-end=\"641\">setDescriptionAsTooltip(boolean enabled)<\/em>.<\/p>\n<p data-start=\"644\" data-end=\"749\">Podobnie jak <em data-start=\"657\" data-end=\"668\">TextField<\/em>, r\u00f3wnie\u017c <em data-start=\"678\" data-end=\"697\">ExtendedTextField<\/em> obs\u0142uguje typ zawarto\u015bci <em data-start=\"723\" data-end=\"748\">CONTENT_TYPE_IDENTIFIER<\/em>.<\/p>\n<h5 data-start=\"644\" data-end=\"749\" id=\"multilinetextfield\" ><span class=\"ez-toc-section\" id=\"MultiLineTextField\"><\/span>MultiLineTextField<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"644\" data-end=\"749\">Do wy\u015bwietlania tekstu wielowierszowego s\u0142u\u017cy klasa <em data-start=\"838\" data-end=\"876\">com.cisag.pgm.gui.MultiLineTextField<\/em>. Ilustracja przedstawia pole w stanie edytowalnym.<\/p>\n<p data-start=\"33\" data-end=\"164\">Tworzenie instancji pola odbywa si\u0119 w standardowy spos\u00f3b przy u\u017cyciu konstruktora<br data-start=\"114\" data-end=\"117\" \/><em data-start=\"117\" data-end=\"163\">MultiLineTextField(String guid, String path)<\/em>.<\/p>\n<p data-start=\"166\" data-end=\"382\">Za pomoc\u0105 metod <em data-start=\"182\" data-end=\"200\">setValue(String)<\/em>, <em data-start=\"202\" data-end=\"226\">setStringValue(String)<\/em> lub <em data-start=\"231\" data-end=\"259\">setValueFromObject(Object)<\/em> mo\u017cna ustawi\u0107 lub zmieni\u0107 tekst wy\u015bwietlany w polu. Odpowiadaj\u0105ce im metody typu <em>get()<\/em> zwracaj\u0105 aktualn\u0105 zawarto\u015b\u0107 pola.<\/p>\n<p data-start=\"384\" data-end=\"581\">Programista aplikacji mo\u017ce okre\u015bli\u0107 wysoko\u015b\u0107 <em data-start=\"429\" data-end=\"449\">MultiLineTextField<\/em> w interfejsie u\u017cytkownika poprzez podanie liczby widocznych wierszy za pomoc\u0105 metody <em data-start=\"537\" data-end=\"578\">setVisibleRowCount(int visibleRowCount)<\/em>.<\/p>\n<p data-start=\"583\" data-end=\"743\">Warto\u015b\u0107 domy\u015blna wynosi 8 wierszy. Dopiero gdy zawarto\u015b\u0107 nie mie\u015bci si\u0119 w widocznym obszarze, po prawej stronie pola wy\u015bwietlany jest pionowy pasek przewijania.<\/p>\n<p data-start=\"745\" data-end=\"843\">Zawijanie wierszy odbywa si\u0119 zawsze automatycznie. Poziomy pasek przewijania nie jest wy\u015bwietlany.<\/p>\n<p data-start=\"50\" data-end=\"312\">Pole wy\u015bwietla po prawej stronie obok etykiety symbol rombu, kt\u00f3ry po klikni\u0119ciu otwiera okno dialogowe. W oknie dialogowym zawarto\u015b\u0107 jest edytowana, w razie potrzeby przekszta\u0142cana i nast\u0119pnie przekazywana do pola. W tym przypadku samo pole nie jest edytowalne.<\/p>\n<p data-start=\"314\" data-end=\"540\">W aplikacjach <em data-start=\"328\" data-end=\"348\">MultiLineTextField<\/em> jest cz\u0119sto u\u017cywane w po\u0142\u0105czeniu z funkcj\u0105 <em data-start=\"392\" data-end=\"419\">National Language Support<\/em> (NLS). Informacja, czy wsparcie NLS ma by\u0107 aktywne, jest okre\u015blana w <em data-start=\"489\" data-end=\"506\">DataDescription<\/em> (<em data-start=\"508\" data-end=\"538\">LOCALIZATION_ENABLED == true<\/em>).<\/p>\n<h5 data-start=\"314\" data-end=\"540\" id=\"entityfield\" ><span class=\"ez-toc-section\" id=\"EntityField\"><\/span>EntityField<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"570\" data-end=\"759\">Abstrakcyjna klasa <em data-start=\"589\" data-end=\"602\">EntityField<\/em> (<em data-start=\"604\" data-end=\"635\">com.cisag.pgm.gui.EntityField<\/em>), b\u0119d\u0105ca klas\u0105 pochodn\u0105 <em data-start=\"660\" data-end=\"697\">com.cisag.pgm.gui.ExtendedTextField<\/em>, stanowi klas\u0119 bazow\u0105 dla wszystkich wariant\u00f3w <em data-start=\"745\" data-end=\"758\">EntityField<\/em>.<\/p>\n<p data-start=\"761\" data-end=\"985\"><em data-start=\"761\" data-end=\"774\">EntityField<\/em> s\u0142u\u017cy do reprezentowania obiekt\u00f3w biznesowych (<em data-start=\"822\" data-end=\"841\">Business Entities<\/em>) na ekranie poprzez wy\u015bwietlanie ich identyfikatora (klucza merytorycznego) w cz\u0119\u015bci edytowalnej oraz tekstu opisowego w cz\u0119\u015bci nieedytowalnej.<\/p>\n<p data-start=\"987\" data-end=\"1062\">Podczas inicjalizacji wszystkie <em data-start=\"1019\" data-end=\"1032\">EntityField<\/em> s\u0105 automatycznie powi\u0105zane z:<\/p>\n<ul>\n<li data-start=\"1066\" data-end=\"1119\"><em data-start=\"1066\" data-end=\"1079\">Link-Action<\/em> (hiper\u0142\u0105cze do powi\u0105zanej aplikacji),<\/li>\n<li data-start=\"1122\" data-end=\"1177\"><em data-start=\"1122\" data-end=\"1136\">Popup-Action<\/em> (menu kontekstowe dla danego obiektu),<\/li>\n<li data-start=\"1180\" data-end=\"1203\">pomoc\u0105 wyboru warto\u015bci.<\/li>\n<\/ul>\n<p data-start=\"1205\" data-end=\"1407\" data-is-last-node=\"\" data-is-only-node=\"\">Ilustracja przedstawia typowe <em data-start=\"1235\" data-end=\"1248\">EntityField<\/em> (<em data-start=\"1250\" data-end=\"1290\">com.cisag.app.general.gui.CountryField<\/em>) z symbolem pomocy wyboru warto\u015bci. Symbol jest widoczny tylko wtedy, gdy wska\u017anik myszy znajduje si\u0119 nad elementem.<\/p>\n<p data-start=\"1205\" data-end=\"1407\" data-is-last-node=\"\" data-is-only-node=\"\">Tworzenie (implementacja) oraz u\u017cycie <em data-start=\"84\" data-end=\"97\">EntityField<\/em> zosta\u0142y opisane w <em data-start=\"116\" data-end=\"141\">Podr\u0119czniku programowania<\/em>.<\/p>\n<h5 data-start=\"1205\" data-end=\"1407\" id=\"valuesetfield\" ><span class=\"ez-toc-section\" id=\"ValueSetField\"><\/span>ValueSetField<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"174\" data-end=\"272\"><em data-start=\"174\" data-end=\"189\">ValueSetField<\/em> s\u0142u\u017cy do wprowadzania i wy\u015bwietlania danych opartych na typie danych <em data-start=\"259\" data-end=\"269\">ValueSet<\/em>.<\/p>\n<p data-start=\"274\" data-end=\"491\"><em data-start=\"274\" data-end=\"284\">ValueSet<\/em> (por\u00f3wnywalny z enumeracj\u0105) posiada z g\u00f3ry okre\u015blony zakres warto\u015bci, zdefiniowany w repozytorium jako zbi\u00f3r dyskretnych warto\u015bci typu <em data-start=\"420\" data-end=\"427\">short<\/em>. Dla ka\u017cdej warto\u015bci zdefiniowany jest dodatkowo tekst opisowy.<\/p>\n<p data-start=\"493\" data-end=\"692\">W trybie standardowym u\u017cytkownik mo\u017ce wybra\u0107 dok\u0142adnie jedn\u0105 warto\u015b\u0107 z listy dost\u0119pnych opcji. Wygl\u0105d i zachowanie <em data-start=\"608\" data-end=\"623\">ValueSetField<\/em> odpowiadaj\u0105 typowej (nieedytowalnej) li\u015bcie rozwijanej (<em data-start=\"680\" data-end=\"690\">ComboBox<\/em>).<\/p>\n<p data-start=\"694\" data-end=\"896\">Do wy\u015bwietlania w polu oraz na li\u015bcie wyboru u\u017cywane s\u0105 teksty opisowe. Natomiast jako warto\u015b\u0107 w metodach <em data-start=\"802\" data-end=\"814\">getValue()<\/em> i <em data-start=\"817\" data-end=\"829\">setValue()<\/em> wykorzystywane s\u0105 warto\u015bci typu <em data-start=\"862\" data-end=\"869\">short<\/em> zdefiniowane w <em data-start=\"885\" data-end=\"895\">ValueSet<\/em>.<\/p>\n<p data-start=\"898\" data-end=\"1080\">Je\u017celi <em data-start=\"905\" data-end=\"920\">ValueSetField<\/em> nie jest skonfigurowane jako pole obowi\u0105zkowe (<em data-start=\"968\" data-end=\"986\">required == true<\/em>), bie\u017c\u0105cy wyb\u00f3r mo\u017cna usun\u0105\u0107 za pomoc\u0105 klawisza [<strong data-start=\"1036\" data-end=\"1044\">Enter<\/strong>], co powoduje wyczyszczenie pola.<\/p>\n<p data-start=\"1082\" data-end=\"1215\" data-is-last-node=\"\" data-is-only-node=\"\">W takim przypadku na li\u015bcie wyboru dost\u0119pna jest r\u00f3wnie\u017c dodatkowa pozycja oznaczona jako <em>(brak)<\/em>, umo\u017cliwiaj\u0105ca wyczyszczenie pola.<\/p>\n<p data-start=\"47\" data-end=\"219\">Obiekty <em data-start=\"55\" data-end=\"70\">ValueSetField<\/em> s\u0105 tworzone za pomoc\u0105 konstruktor\u00f3w: <em data-start=\"110\" data-end=\"151\">ValueSetField(String guid, String path) <\/em>lub <em data-start=\"160\" data-end=\"216\">ValueSetField(String guid, String path, Action action)<\/em>.<\/p>\n<p data-start=\"221\" data-end=\"351\">Dodatkowo mo\u017cliwe jest zarejestrowanie obiektu <em data-start=\"268\" data-end=\"276\">Action<\/em>, kt\u00f3rego <em data-start=\"286\" data-end=\"296\">Listener<\/em> zostan\u0105 powiadomieni w przypadku zmiany warto\u015bci pola.<\/p>\n<p data-start=\"353\" data-end=\"418\">Dodatkowe wpisy mo\u017cna definiowa\u0107 lub dodawa\u0107 przy u\u017cyciu metod:<\/p>\n<ul>\n<li data-start=\"422\" data-end=\"462\"><em data-start=\"422\" data-end=\"460\">addValueSetItem(String externalName)<\/em><\/li>\n<li data-start=\"465\" data-end=\"526\"><em data-start=\"465\" data-end=\"524\">addValueSetItem(short constantValue, String externalName)<\/em><\/li>\n<\/ul>\n<p data-start=\"528\" data-end=\"710\">Za pomoc\u0105 metody <em data-start=\"547\" data-end=\"614\">setVisibleValues(short[] constantValues, boolean originalSorting) <\/em>mo\u017cna ograniczy\u0107 wy\u015bwietlanie do okre\u015blonych warto\u015bci i\/lub zmieni\u0107 ich kolejno\u015b\u0107 sortowania.<\/p>\n<p data-start=\"712\" data-end=\"900\">W trybie standardowym metody <em data-start=\"741\" data-end=\"761\">getValueAsObject()<\/em> oraz <em data-start=\"767\" data-end=\"795\">setValueFromObject(Object)<\/em> dzia\u0142aj\u0105 analogicznie do <em data-start=\"821\" data-end=\"833\">getValue()<\/em> oraz <em data-start=\"839\" data-end=\"856\">setValue(short)<\/em> \u2013 zwracaj\u0105 lub ustawiaj\u0105 wybran\u0105 warto\u015b\u0107.<\/p>\n<p data-start=\"902\" data-end=\"995\">Sta\u0142a <em data-start=\"908\" data-end=\"933\">ValueSetField.UNDEFINED<\/em> reprezentuje przypadek, w kt\u00f3rym nie dokonano \u017cadnego wyboru.<\/p>\n<p data-start=\"902\" data-end=\"995\"><strong>Tryb wyboru<\/strong><\/p>\n<p data-start=\"1037\" data-end=\"1118\">W trybie wyboru <em data-start=\"1053\" data-end=\"1068\">ValueSetField<\/em> umo\u017cliwia zaznaczenie wi\u0119cej ni\u017c jednej warto\u015bci.<\/p>\n<p data-start=\"1120\" data-end=\"1366\">W interfejsie u\u017cytkownika zamiast listy rozwijanej (<em data-start=\"1172\" data-end=\"1182\">ComboBox<\/em>) wy\u015bwietlane jest okno typu popup z polami wyboru (<em data-start=\"1234\" data-end=\"1244\">CheckBox<\/em>). Poniewa\u017c mo\u017cliwe jest zaznaczenie wi\u0119cej ni\u017c jednego elementu, wymagany jest przycisk [<strong data-start=\"1334\" data-end=\"1340\">OK<\/strong>], kt\u00f3ry zatwierdza wyb\u00f3r.<\/p>\n<p data-start=\"1368\" data-end=\"1505\" data-is-last-node=\"\" data-is-only-node=\"\">Jako pomoc dost\u0119pne jest dodatkowe pole wyboru <em>(wszystkie)<\/em>, umo\u017cliwiaj\u0105ce zaznaczenie lub odznaczenie wszystkich pozycji jednym klikni\u0119ciem.<\/p>\n<p data-start=\"42\" data-end=\"123\">Po zamkni\u0119ciu okna spos\u00f3b wy\u015bwietlania w polu zale\u017cy od liczby wybranych pozycji:<\/p>\n<ul>\n<li data-start=\"127\" data-end=\"190\">je\u015bli nie wybrano \u017cadnej pozycji \u2013 wy\u015bwietlane jest <em>(Brak)<\/em>,<\/li>\n<li data-start=\"193\" data-end=\"263\">je\u015bli wybrano dok\u0142adnie jedn\u0105 pozycj\u0119 \u2013 wy\u015bwietlana jest ta pozycja,<\/li>\n<li data-start=\"266\" data-end=\"328\">je\u015bli wybrano wszystkie pozycje \u2013 wy\u015bwietlane jest <em>(wszystko)<\/em>,<\/li>\n<li data-start=\"331\" data-end=\"398\">w pozosta\u0142ych przypadkach \u2013 wy\u015bwietlane jest <em>(wyb\u00f3r)<\/em>.<\/li>\n<\/ul>\n<p data-start=\"400\" data-end=\"634\">Je\u017celi pole nie jest polem obowi\u0105zkowym, na ko\u0144cu listy dodawane jest dodatkowe pole wyboru. Wybranie tej pozycji powoduje, \u017ce przy wyszukiwaniu uwzgl\u0119dniane s\u0105 r\u00f3wnie\u017c rekordy posiadaj\u0105ce warto\u015b\u0107 <em data-start=\"608\" data-end=\"633\">ValueSetField.UNDEFINED<\/em>.<\/p>\n<p data-start=\"400\" data-end=\"634\"><section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">W trybie wyboru w\u0142a\u015bciwo\u015b\u0107 <em>required<\/em> (pole obowi\u0105zkowe) nie odnosi si\u0119 bezpo\u015brednio do <em data-start=\"741\" data-end=\"756\">ValueSetField<\/em>, lecz do danych, w kt\u00f3rych wykonywane jest wyszukiwanie. Na podstawie tej w\u0142a\u015bciwo\u015bci <em data-start=\"843\" data-end=\"858\">ValueSetField<\/em> okre\u015bla, jakie warto\u015bci mog\u0105 wyst\u0119powa\u0107 w danych:<\/p>\n<ul>\n<li data-start=\"912\" data-end=\"999\">przy <em data-start=\"917\" data-end=\"935\">required == true<\/em> mog\u0105 wyst\u0119powa\u0107 wy\u0142\u0105cznie warto\u015bci zdefiniowane w <em data-start=\"986\" data-end=\"996\">ValueSet<\/em>,<\/li>\n<li data-start=\"1002\" data-end=\"1089\">przy <em data-start=\"1007\" data-end=\"1026\">required == false<\/em> mo\u017ce dodatkowo wyst\u0119powa\u0107 warto\u015b\u0107 <em data-start=\"1061\" data-end=\"1086\">ValueSetField.UNDEFINED<\/em>.<\/div><\/section><\/li>\n<\/ul>\n<p data-start=\"1091\" data-end=\"1316\">Pusta selekcja nie jest dozwolona (przycisk [<strong data-start=\"1136\" data-end=\"1142\">OK<\/strong>] pozostaje nieaktywny). Wywo\u0142anie <em data-start=\"1177\" data-end=\"1203\">setValueFromObject(null)<\/em> powoduje wi\u0119c zaznaczenie wszystkich pozycji. Zachowanie to mo\u017cna zmieni\u0107 przy u\u017cyciu metody <em data-start=\"1297\" data-end=\"1315\">setNoneAllowed()<\/em>.<\/p>\n<p data-start=\"1318\" data-end=\"1490\">W trybie wyboru metoda <em data-start=\"1341\" data-end=\"1361\">getValueAsObject()<\/em> \u2013 podobnie jak <em data-start=\"1377\" data-end=\"1393\">getSelection()<\/em> \u2013 zwraca tablic\u0119 (<em data-start=\"1412\" data-end=\"1421\">short[]<\/em>) z wybranymi warto\u015bciami lub <em data-start=\"1451\" data-end=\"1457\">null<\/em>, je\u017celi nic nie zosta\u0142o wybrane.<\/p>\n<p data-start=\"1492\" data-end=\"1663\">Analogicznie w trybie wyboru metoda <em data-start=\"1528\" data-end=\"1556\">setValueFromObject(Object)<\/em> \u2013 podobnie jak <em data-start=\"1572\" data-end=\"1594\">setSelection(Object)<\/em> \u2013 oczekuje tablicy (<em data-start=\"1615\" data-end=\"1624\">short[]<\/em>) zawieraj\u0105cej warto\u015bci do zaznaczenia.<\/p>\n<h5 data-start=\"1492\" data-end=\"1663\" id=\"multivaluesetfield\" ><span class=\"ez-toc-section\" id=\"MultiValueSetField\"><\/span>MultiValueSetField<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"1700\" data-end=\"1871\"><em data-start=\"1700\" data-end=\"1720\">MultiValueSetField<\/em> stanowi rozszerzenie <em data-start=\"1742\" data-end=\"1757\">ValueSetField<\/em> (wy\u0142\u0105cznie w trybie wyboru). Umo\u017cliwia grupowanie pozycji wraz z mo\u017cliwo\u015bci\u0105 grupowego zaznaczania i odznaczania.<\/p>\n<p data-start=\"33\" data-end=\"203\">Grupy przeznaczone do wy\u015bwietlania i wyboru s\u0105 definiowane za pomoc\u0105 odpowiednich <em data-start=\"115\" data-end=\"125\">ValueSet<\/em>. Dodawanie grup odbywa si\u0119 przy u\u017cyciu metody <em data-start=\"174\" data-end=\"200\">addValueSet(String path)<\/em>.<\/p>\n<p data-start=\"205\" data-end=\"300\">Parametr <em data-start=\"214\" data-end=\"220\">path<\/em> okre\u015bla logiczny typ danych (<em data-start=\"250\" data-end=\"260\">ValueSet<\/em>) lub powi\u0105zan\u0105 z nim <em data-start=\"282\" data-end=\"299\">DataDescription<\/em>.<\/p>\n<p data-start=\"302\" data-end=\"443\">Warto\u015b\u0107 pola, czyli aktualny wyb\u00f3r, jest reprezentowana przez tablic\u0119 dwuwymiarow\u0105 (<em data-start=\"386\" data-end=\"397\">short[][]<\/em>). Warto\u015b\u0107 t\u0119 mo\u017cna ustawi\u0107 przy u\u017cyciu metod:<\/p>\n<ul>\n<li data-start=\"447\" data-end=\"470\"><em>setValue(short[][])<\/em><\/li>\n<li data-start=\"473\" data-end=\"503\"><em>setValueFromObject(Object)<\/em><\/li>\n<\/ul>\n<p data-start=\"505\" data-end=\"621\">Metoda <em data-start=\"512\" data-end=\"540\">setValueFromObject(Object)<\/em> akceptuje dodatkowo list\u0119 (<em data-start=\"568\" data-end=\"584\">java.util.List<\/em>) zawieraj\u0105c\u0105 obiekty typu <em data-start=\"611\" data-end=\"620\">short[]<\/em>. Analogicznie:<\/p>\n<ul>\n<li data-start=\"640\" data-end=\"697\"><em data-start=\"640\" data-end=\"652\">getValue()<\/em> zwraca tablic\u0119 dwuwymiarow\u0105 (<em data-start=\"682\" data-end=\"693\">short[][]<\/em>),<\/li>\n<li data-start=\"700\" data-end=\"790\"><em data-start=\"700\" data-end=\"720\">getValueAsObject()<\/em> zwraca list\u0119 (<em data-start=\"735\" data-end=\"751\">java.util.List<\/em>) zawieraj\u0105c\u0105 obiekty typu <em data-start=\"778\" data-end=\"787\">short[]<\/em>.<\/li>\n<\/ul>\n<h5 id=\"booleanfield\" ><span class=\"ez-toc-section\" id=\"BooleanField\"><\/span>BooleanField<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div class=\"flex flex-col text-sm pb-25\">\n<article class=\"text-token-text-primary w-full focus:outline-none [--shadow-height:45px] has-data-writing-block:pointer-events-none has-data-writing-block:-mt-(--shadow-height) has-data-writing-block:pt-(--shadow-height) [&amp;:has([data-writing-block])&gt;*]:pointer-events-auto scroll-mt-[calc(var(--header-height)+min(200px,max(70px,20svh)))]\" dir=\"auto\" tabindex=\"-1\" data-turn-id=\"request-699d696c-bd80-8328-9b70-a89658b4e7a0-10\" data-testid=\"conversation-turn-48\" data-scroll-anchor=\"true\" data-turn=\"assistant\">\n<div class=\"text-base my-auto mx-auto pb-10 [--thread-content-margin:--spacing(4)] @w-sm\/main:[--thread-content-margin:--spacing(6)] @w-lg\/main:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)\">\n<div class=\"[--thread-content-max-width:40rem] @w-lg\/main:[--thread-content-max-width:48rem] mx-auto max-w-(--thread-content-max-width) flex-1 group\/turn-messages focus-visible:outline-hidden relative flex w-full min-w-0 flex-col agent-turn\" tabindex=\"-1\">\n<div class=\"flex max-w-full flex-col grow\">\n<div class=\"min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&amp;]:mt-1\" dir=\"auto\" data-message-author-role=\"assistant\" data-message-id=\"0cff9c7d-843c-4ab6-b790-45e51369e809\" data-message-model-slug=\"gpt-5-2\">\n<div class=\"flex w-full flex-col gap-1 empty:hidden first:pt-[1px]\">\n<div class=\"markdown prose dark:prose-invert w-full wrap-break-word dark markdown-new-styling\">\n<p data-start=\"821\" data-end=\"907\"><em data-start=\"821\" data-end=\"835\">BooleanField<\/em> posiada dwie formy prezentacji, zale\u017cne od w\u0142a\u015bciwo\u015bci <em data-start=\"891\" data-end=\"906\">selectionMode<\/em>.<\/p>\n<p data-start=\"909\" data-end=\"981\" data-is-last-node=\"\" data-is-only-node=\"\">W trybie standardowym pole wykorzystuje typowe pole wyboru (<em data-start=\"969\" data-end=\"979\">CheckBox<\/em>).<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"mt-3 w-full empty:hidden\">\n<p data-start=\"46\" data-end=\"213\">Opr\u00f3cz stan\u00f3w <em>zaznaczony<\/em> i <em>niezaznaczony<\/em> za pomoc\u0105 metody <em data-start=\"110\" data-end=\"159\">setTriStateSupported(boolean triStateSupported) <\/em>mo\u017cna opcjonalnie aktywowa\u0107 stan niezdefiniowany.<\/p>\n<p data-start=\"215\" data-end=\"315\">Dla tego stanu mo\u017cna zdefiniowa\u0107 specjaln\u0105 ikon\u0119 przy u\u017cyciu metody <em data-start=\"285\" data-end=\"314\">setUndefinedIcon(Icon icon)<\/em>.<\/p>\n<p data-start=\"317\" data-end=\"370\">Warto\u015b\u0107 <em data-start=\"325\" data-end=\"339\">BooleanField<\/em> mo\u017cna ustawi\u0107 za pomoc\u0105 metod:<\/p>\n<ul>\n<li data-start=\"374\" data-end=\"395\"><em data-start=\"374\" data-end=\"393\">setValue(boolean)<\/em><\/li>\n<li data-start=\"398\" data-end=\"428\"><em data-start=\"398\" data-end=\"426\">setValueFromObject(Object)<\/em><\/li>\n<li data-start=\"431\" data-end=\"448\"><em data-start=\"431\" data-end=\"446\">setState(int)<\/em><\/li>\n<\/ul>\n<p data-start=\"450\" data-end=\"556\">Warto\u015b\u0107 <em data-start=\"458\" data-end=\"464\">true<\/em> odpowiada <em data-start=\"475\" data-end=\"498\">BooleanField.SELECTED<\/em>, natomiast <em data-start=\"510\" data-end=\"517\">false<\/em> odpowiada <em data-start=\"528\" data-end=\"553\">BooleanField.DESELECTED<\/em>.<\/p>\n<p data-start=\"558\" data-end=\"690\">Warto\u015b\u0107 <em data-start=\"566\" data-end=\"590\">BooleanField.UNDEFINED<\/em> mo\u017ce zosta\u0107 ustawiona wy\u0142\u0105cznie przy u\u017cyciu metod <em data-start=\"641\" data-end=\"669\">setValueFromObject(Object)<\/em> lub <em data-start=\"674\" data-end=\"689\">setState(int)<\/em>.<\/p>\n<p data-start=\"692\" data-end=\"769\">Odpowiednie metody typu <em>get()<\/em> zwracaj\u0105 aktualny stan w analogicznej formie.<\/p>\n<p data-start=\"692\" data-end=\"769\"><strong>Tryb wyboru<\/strong><\/p>\n<p data-start=\"692\" data-end=\"769\">W trybie wyboru <em data-start=\"827\" data-end=\"841\">BooleanField<\/em> jest prezentowane w formie listy rozwijanej (<em data-start=\"887\" data-end=\"897\">ComboBox<\/em>).<\/p>\n<p data-start=\"43\" data-end=\"251\">To, jakie stany mo\u017ce przyjmowa\u0107 pole w trybie wyboru, zale\u017cy od w\u0142a\u015bciwo\u015bci <em data-start=\"119\" data-end=\"129\">required<\/em>. W\u0142a\u015bciwo\u015b\u0107 ta standardowo ma warto\u015b\u0107 <em data-start=\"168\" data-end=\"175\">false<\/em>, co oznacza, \u017ce mo\u017cliwe s\u0105 trzy warto\u015bci: <em>tak<\/em>, <em>nie<\/em> oraz <em>ignoruj<\/em>.<\/p>\n<p data-start=\"253\" data-end=\"402\">Wywo\u0142anie metody <em data-start=\"270\" data-end=\"289\">setRequired(true)<\/em> powoduje ustawienie pola jako obowi\u0105zkowego. W takim przypadku dopuszczalne s\u0105 wy\u0142\u0105cznie warto\u015bci<em> tak<\/em> i <em>nie<\/em>.<\/p>\n<p data-start=\"404\" data-end=\"542\">Metody <em data-start=\"411\" data-end=\"433\">setSelectionString()<\/em> oraz <em data-start=\"439\" data-end=\"461\">getSelectionString()<\/em> mog\u0105 by\u0107 r\u00f3wnie\u017c u\u017cywane w trybie wyboru do ustawiania lub odczytu stanu pola.<\/p>\n<p data-start=\"544\" data-end=\"700\">Warto\u015b\u0107 <em>true<\/em> odpowiada <em>tak<\/em>, warto\u015b\u0107 <em>false<\/em> odpowiada <em>nie<\/em>, natomiast warto\u015b\u0107 <em data-start=\"631\" data-end=\"637\">null<\/em> (lub pusty ci\u0105g znak\u00f3w) jest interpretowana jako <em>ignoruj.<\/em><\/p>\n<p data-start=\"702\" data-end=\"788\">Metody <em data-start=\"709\" data-end=\"721\">setValue()<\/em> oraz <em data-start=\"727\" data-end=\"739\">getValue()<\/em> dzia\u0142aj\u0105 analogicznie jak w trybie standardowym.<\/p>\n<h5 data-start=\"702\" data-end=\"788\" id=\"radiobuttongroup\" ><span class=\"ez-toc-section\" id=\"RadioButtonGroup\"><\/span>RadioButtonGroup<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div class=\"flex flex-col text-sm pb-25\">\n<article class=\"text-token-text-primary w-full focus:outline-none [--shadow-height:45px] has-data-writing-block:pointer-events-none has-data-writing-block:-mt-(--shadow-height) has-data-writing-block:pt-(--shadow-height) [&amp;:has([data-writing-block])&gt;*]:pointer-events-auto scroll-mt-[calc(var(--header-height)+min(200px,max(70px,20svh)))]\" dir=\"auto\" tabindex=\"-1\" data-turn-id=\"request-699d696c-bd80-8328-9b70-a89658b4e7a0-12\" data-testid=\"conversation-turn-52\" data-scroll-anchor=\"true\" data-turn=\"assistant\">\n<div class=\"text-base my-auto mx-auto pb-10 [--thread-content-margin:--spacing(4)] @w-sm\/main:[--thread-content-margin:--spacing(6)] @w-lg\/main:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)\">\n<div class=\"[--thread-content-max-width:40rem] @w-lg\/main:[--thread-content-max-width:48rem] mx-auto max-w-(--thread-content-max-width) flex-1 group\/turn-messages focus-visible:outline-hidden relative flex w-full min-w-0 flex-col agent-turn\" tabindex=\"-1\">\n<div class=\"flex max-w-full flex-col grow\">\n<div class=\"min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&amp;]:mt-1\" dir=\"auto\" data-message-author-role=\"assistant\" data-message-id=\"7c2b8a49-79e8-4694-a97c-883a8b87dcf0\" data-message-model-slug=\"gpt-5-2\">\n<div class=\"flex w-full flex-col gap-1 empty:hidden first:pt-[1px]\">\n<div class=\"markdown prose dark:prose-invert w-full wrap-break-word dark markdown-new-styling\">\n<p data-start=\"823\" data-end=\"1011\">Klasa <em data-start=\"829\" data-end=\"865\">com.cisag.pgm.gui.RadioButtonGroup<\/em> s\u0142u\u017cy \u2013 podobnie jak <em data-start=\"887\" data-end=\"902\">ValueSetField<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"916\" data-end=\"931\">ValueSetField<\/em>) \u2013 do wprowadzania i wy\u015bwietlania danych opartych na typie danych <em data-start=\"998\" data-end=\"1008\">ValueSet<\/em>.<\/p>\n<p data-start=\"1013\" data-end=\"1235\">W przypadku <em data-start=\"1025\" data-end=\"1043\">RadioButtonGroup<\/em> prezentacja oraz wyb\u00f3r warto\u015bci odbywaj\u0105 si\u0119 za pomoc\u0105 przycisk\u00f3w opcji (<em data-start=\"1117\" data-end=\"1130\">RadioButton<\/em>, wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"1146\" data-end=\"1159\">RadioButton<\/em>). Dla ka\u017cdej warto\u015bci z <em data-start=\"1184\" data-end=\"1194\">ValueSet<\/em> tworzony jest oddzielny <em data-start=\"1219\" data-end=\"1232\">RadioButton<\/em>.<\/p>\n<p data-start=\"1237\" data-end=\"1323\">Podobnie jak w <em data-start=\"1252\" data-end=\"1267\">ValueSetField<\/em>, w danym momencie mo\u017ce by\u0107 wybrana tylko jedna warto\u015b\u0107.<\/p>\n<p data-start=\"1325\" data-end=\"1439\">Aby <em data-start=\"1329\" data-end=\"1347\">RadioButtonGroup<\/em> mog\u0142a by\u0107 traktowana jak ka\u017cde inne pole, klasa ta dziedziczy po <em data-start=\"1413\" data-end=\"1438\">com.cisag.pgm.gui.Field<\/em>.<\/p>\n<p data-start=\"1441\" data-end=\"1573\">Instancj\u0119 tworzy si\u0119 przy u\u017cyciu konstruktora: <em data-start=\"1490\" data-end=\"1570\">RadioButtonGroup(String guid, String path, Action changed, boolean horizontal)<\/em>.<\/p>\n<p data-start=\"1575\" data-end=\"1760\" data-is-last-node=\"\" data-is-only-node=\"\">Parametrami s\u0105 identyfikator GUID, \u015bcie\u017cka oraz opcjonalnie obiekt <em data-start=\"1642\" data-end=\"1650\">Action<\/em>. Parametr <em data-start=\"1661\" data-end=\"1673\">horizontal<\/em> okre\u015bla, czy przyciski maj\u0105 by\u0107 rozmieszczone poziomo (<em data-start=\"1729\" data-end=\"1735\">true<\/em>), czy pionowo (<em data-start=\"1751\" data-end=\"1758\">false<\/em>).<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/article>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/article>\n<\/div>\n<p data-start=\"31\" data-end=\"177\">Definicja przycisk\u00f3w opcji, czyli pozycji w <em data-start=\"75\" data-end=\"93\">RadioButtonGroup<\/em>, odbywa si\u0119 \u2013 podobnie jak w przypadku <em data-start=\"133\" data-end=\"148\">ValueSetField<\/em> \u2013 poprzez <em data-start=\"159\" data-end=\"176\">DataDescription<\/em>.<\/p>\n<p data-start=\"179\" data-end=\"402\">Wywo\u0142anie metody <em data-start=\"196\" data-end=\"225\">setSelectedIndex(int index)<\/em> w <em data-start=\"228\" data-end=\"246\">RadioButtonGroup<\/em> powoduje ustawienie przycisku o podanym indeksie jako zaznaczony. Odpowiednio metoda <em data-start=\"334\" data-end=\"354\">getSelectedIndex()<\/em> zwraca indeks aktualnie zaznaczonego przycisku.<\/p>\n<p data-start=\"404\" data-end=\"675\">Je\u017celi w konstruktorze przekazany zostanie obiekt <em data-start=\"454\" data-end=\"462\">Action<\/em>, jego <em data-start=\"469\" data-end=\"479\">Listener<\/em> s\u0105 powiadamiani przy ka\u017cdej zmianie wyboru. W zarejestrowanym obiekcie <em data-start=\"551\" data-end=\"559\">Action<\/em> za pomoc\u0105 <em data-start=\"570\" data-end=\"582\">getState()<\/em> mo\u017cna odczyta\u0107 aktualny wyb\u00f3r lub powi\u0105zany z nim obiekt danych (najcz\u0119\u015bciej tekst opisowy).<\/p>\n<p data-start=\"677\" data-end=\"780\">Przyciski <em data-start=\"687\" data-end=\"700\">RadioButton<\/em> mog\u0105 by\u0107 r\u00f3wnie\u017c dodawane bezpo\u015brednio do <em data-start=\"743\" data-end=\"761\">RadioButtonGroup<\/em> przy u\u017cyciu metod:<\/p>\n<ul>\n<li data-start=\"784\" data-end=\"817\"><em data-start=\"784\" data-end=\"815\">add(short value, String text)<\/em><\/li>\n<li data-start=\"820\" data-end=\"840\"><em data-start=\"820\" data-end=\"838\">add(String text)<\/em><\/li>\n<li data-start=\"843\" data-end=\"882\"><em data-start=\"843\" data-end=\"880\">add(String text, Object dataObject)<\/em><\/li>\n<\/ul>\n<p data-start=\"884\" data-end=\"1094\">Za pomoc\u0105 metody <em data-start=\"903\" data-end=\"970\">setVisibleValues(short[] constantValues, boolean originalSorting) <\/em>mo\u017cna \u2013 analogicznie jak w <em data-start=\"1000\" data-end=\"1015\">ValueSetField<\/em> \u2013 ograniczy\u0107 wy\u015bwietlanie do okre\u015blonych warto\u015bci i\/lub zmieni\u0107 ich kolejno\u015b\u0107.<\/p>\n<h5 data-start=\"884\" data-end=\"1094\" id=\"decimalfield\" ><span class=\"ez-toc-section\" id=\"DecimalField\"><\/span>DecimalField<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"1125\" data-end=\"1258\">Klasa <em data-start=\"1131\" data-end=\"1163\">com.cisag.pgm.gui.DecimalField<\/em> s\u0142u\u017cy do wprowadzania i wy\u015bwietlania liczb dziesi\u0119tnych (<em data-start=\"1221\" data-end=\"1256\">com.cisag.pgm.datatype.CisDecimal<\/em>).<\/p>\n<p data-start=\"1260\" data-end=\"1438\">Struktura klasy <em data-start=\"1276\" data-end=\"1290\">DecimalField<\/em> jest podobna do klas typu <em data-start=\"1317\" data-end=\"1331\">IntegerField<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"1346\" data-end=\"1357\">ByteField<\/em>, <em data-start=\"1359\" data-end=\"1371\">ShortField<\/em>, <em data-start=\"1373\" data-end=\"1387\">IntegerField<\/em>, <em data-start=\"1389\" data-end=\"1400\">LongField<\/em>) i jest u\u017cywana w analogiczny spos\u00f3b.<\/p>\n<p data-start=\"1440\" data-end=\"1574\">Formatowanie wy\u015bwietlanych warto\u015bci odbywa si\u0119 zgodnie z ustawieniami u\u017cytkownika (np. separator dziesi\u0119tny, grupowanie tysi\u0119cy itd.).<\/p>\n<p data-start=\"1576\" data-end=\"1785\" data-is-last-node=\"\" data-is-only-node=\"\">Liczba miejsc przed i po przecinku oraz warto\u015bci minimalne i maksymalne s\u0105 przejmowane z <em data-start=\"1665\" data-end=\"1682\">DataDescription<\/em>. Je\u017celi w repozytorium nie okre\u015blono specjalnych parametr\u00f3w, obowi\u0105zuj\u0105 nast\u0119puj\u0105ce warto\u015bci domy\u015blne:<\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Ustawienie domy\u015blne<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Opis<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">15<\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">maks. liczba cyfr przed przecinkiem<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">6<\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">maks. liczba cyfr po przecinku<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">2<\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">min. liczba cyfr po przecinku<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div class=\"flex flex-col text-sm pb-25\">\n<article class=\"text-token-text-primary w-full focus:outline-none [--shadow-height:45px] has-data-writing-block:pointer-events-none has-data-writing-block:-mt-(--shadow-height) has-data-writing-block:pt-(--shadow-height) [&amp;:has([data-writing-block])&gt;*]:pointer-events-auto scroll-mt-[calc(var(--header-height)+min(200px,max(70px,20svh)))]\" dir=\"auto\" tabindex=\"-1\" data-turn-id=\"request-699d696c-bd80-8328-9b70-a89658b4e7a0-14\" data-testid=\"conversation-turn-56\" data-scroll-anchor=\"true\" data-turn=\"assistant\">\n<div class=\"text-base my-auto mx-auto pb-10 [--thread-content-margin:--spacing(4)] @w-sm\/main:[--thread-content-margin:--spacing(6)] @w-lg\/main:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)\">\n<div class=\"[--thread-content-max-width:40rem] @w-lg\/main:[--thread-content-max-width:48rem] mx-auto max-w-(--thread-content-max-width) flex-1 group\/turn-messages focus-visible:outline-hidden relative flex w-full min-w-0 flex-col agent-turn\" tabindex=\"-1\">\n<div class=\"flex max-w-full flex-col grow\">\n<div class=\"min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&amp;]:mt-1\" dir=\"auto\" data-message-author-role=\"assistant\" data-message-id=\"00c64c1d-7893-4674-8c70-87e311272864\" data-message-model-slug=\"gpt-5-2\">\n<div class=\"flex w-full flex-col gap-1 empty:hidden first:pt-[1px]\">\n<div class=\"markdown prose dark:prose-invert w-full wrap-break-word dark markdown-new-styling\">\n<p data-start=\"187\" data-end=\"348\" data-is-last-node=\"\" data-is-only-node=\"\">Warto\u015b\u0107 pola mo\u017cna odczyta\u0107 przy u\u017cyciu metod <em data-start=\"233\" data-end=\"245\">getValue()<\/em> lub <em data-start=\"250\" data-end=\"270\">getValueAsObject()<\/em>, a zmieni\u0107 za pomoc\u0105 <em data-start=\"292\" data-end=\"314\">setValue(CisDecimal)<\/em> lub <em data-start=\"319\" data-end=\"347\">setValueFromObject(Object)<\/em>.<\/p>\n<h5 data-start=\"23\" data-end=\"141\" id=\"percentfield\" ><span class=\"ez-toc-section\" id=\"PercentField\"><\/span>PercentField<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"23\" data-end=\"141\">Klasa <em data-start=\"29\" data-end=\"61\">com.cisag.pgm.gui.PercentField<\/em> umo\u017cliwia wprowadzanie i wyprowadzanie warto\u015bci liczbowych z jednostk\u0105 procent. Edytowalna jest wy\u0142\u0105cznie liczba dziesi\u0119tna, natomiast znak procentu pozostaje niezmiennie wy\u015bwietlany po prawej stronie liczby.<\/p>\n<p data-start=\"332\" data-end=\"421\">Pole nale\u017cy utworzy\u0107 standardowo za pomoc\u0105 konstruktora, przekazuj\u0105c GUID oraz \u015bcie\u017ck\u0119.<\/p>\n<p data-start=\"423\" data-end=\"597\">Za pomoc\u0105 metod <em data-start=\"439\" data-end=\"461\">setValue(CisDecimal)<\/em> oraz <em data-start=\"469\" data-end=\"497\">setValueFromObject(Object)<\/em> mo\u017cna przypisa\u0107 polu now\u0105<br data-start=\"523\" data-end=\"526\" \/>liczb\u0119 dziesi\u0119tn\u0105. Jednostka procent pozostaje przy tym niezmieniona.<\/p>\n<p data-start=\"599\" data-end=\"781\" data-is-last-node=\"\" data-is-only-node=\"\">Metody <em data-start=\"606\" data-end=\"618\">getValue()<\/em> oraz <em data-start=\"624\" data-end=\"644\">getValueAsObject()<\/em> zwracaj\u0105 liczb\u0119 dziesi\u0119tn\u0105. Metoda <em data-start=\"684\" data-end=\"702\">getStringValue()<\/em> zwraca \u0142a\u0144cuch znak\u00f3w sk\u0142adaj\u0105cy si\u0119 z liczby z do\u0142\u0105czonym znakiem procentu.<\/p>\n<h5 data-start=\"599\" data-end=\"781\" id=\"bytefield-shortfield-integerfield-longfield\" ><span class=\"ez-toc-section\" id=\"ByteField_ShortField_IntegerField_LongField\"><\/span>ByteField, ShortField, IntegerField, LongField<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"57\" data-end=\"237\">Do wprowadzania i wyprowadzania liczb ca\u0142kowitych dla ka\u017cdego typu prymitywnego (byte, short, int, long) dost\u0119pna jest osobna klasa dziedzicz\u0105ca po <em data-start=\"209\" data-end=\"234\">com.cisag.pgm.gui.Field<\/em>.<\/p>\n<p data-start=\"239\" data-end=\"360\">Instancjonowanie p\u00f3l odbywa si\u0119 za pomoc\u0105 ich odpowiedniego konstruktora, kt\u00f3remu nale\u017cy przekaza\u0107 GUID oraz \u015bcie\u017ck\u0119.<\/p>\n<p data-start=\"362\" data-end=\"460\">Metody <em data-start=\"369\" data-end=\"381\">setValue()<\/em> oraz <em data-start=\"387\" data-end=\"399\">getValue()<\/em> operuj\u0105 na typie danych, kt\u00f3ry charakteryzuje dane pole.<\/p>\n<p data-start=\"462\" data-end=\"680\">Funkcji <em data-start=\"470\" data-end=\"504\">setValueFromObject(Object value)<\/em> nale\u017cy przekaza\u0107 jako warto\u015b\u0107 odpowiedni dla danego typu danych obiekt <em data-start=\"580\" data-end=\"598\">java.lang.Object<\/em> (<em data-start=\"600\" data-end=\"616\">java.lang.Byte<\/em>, <em data-start=\"618\" data-end=\"635\">java.lang.Short<\/em>, <em data-start=\"639\" data-end=\"658\">java.lang.Integer<\/em>, <em data-start=\"660\" data-end=\"676\">java.lang.Long<\/em>).<\/p>\n<p data-start=\"682\" data-end=\"771\">Warto\u015b\u0107 pola jako <em data-start=\"700\" data-end=\"718\">java.lang.Object<\/em> zwracana jest przez metod\u0119 <em data-start=\"748\" data-end=\"768\">getValueAsObject()<\/em>.<\/p>\n<p data-start=\"773\" data-end=\"1004\">Pola umo\u017cliwiaj\u0105 wprowadzanie wy\u0142\u0105cznie znak\u00f3w numerycznych, separator\u00f3w oraz znaku minus. Wprowadzone dane s\u0105 analizowane po utracie fokusu i sprawdzane pod k\u0105tem zakresu warto\u015bci<br data-start=\"957\" data-end=\"960\" \/>dopuszczalnego dla danego typu liczbowego.<\/p>\n<p data-start=\"1006\" data-end=\"1175\">W przypadku przekroczenia zakresu pole otrzymuje czerwony naro\u017cnik, kt\u00f3rego klikni\u0119cie powoduje wy\u015bwietlenie komunikatu o b\u0142\u0119dzie (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em>Komunikaty<\/em>).<\/p>\n<p data-start=\"1177\" data-end=\"1409\">Pola uwzgl\u0119dniaj\u0105 ustawienia u\u017cytkownika dotycz\u0105ce wybranych symboli znaku minus oraz separatora grup tysi\u0119cy. W ustawieniach u\u017cytkownika mo\u017cna r\u00f3wnie\u017c zdefiniowa\u0107, czy liczby ujemne maj\u0105 by\u0107 wy\u015bwietlane w kolorze czerwonym.<\/p>\n<p data-start=\"1177\" data-end=\"1409\">Maksymalna liczba cyfr jest pobierana z <em data-start=\"1580\" data-end=\"1597\">DataDescription<\/em>. Je\u015bli nie podano \u017cadnej warto\u015bci, obowi\u0105zuj\u0105 nast\u0119puj\u0105ce ustawienia domy\u015blne:<\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Typ<\/strong><\/td>\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Domy\u015blna maksymalna liczba cyfr ca\u0142kowitych<\/strong><\/td>\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Domy\u015blna warto\u015b\u0107 minimalna\/maksymalna<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>BYTE<\/em><\/td>\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff;\">3<\/td>\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>Byte.MIN_VALUE<\/em><br \/>\n<em>Byte.MAX_VALUE<\/em><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>SHORT<\/em><\/td>\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff;\">5<\/td>\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>Short.MIN_VALUE<\/em><br \/>\n<em>Short.MAX_VALUE<\/em><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>INT<\/em><\/td>\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff;\">10<\/td>\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>Integer.MIN_VALUE<\/em><br \/>\n<em>Integer.MAX_VALUE<\/em><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>LONG<\/em><\/td>\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff;\">19<\/td>\n<td style=\"width: 33.3333%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>Long.MIN_VALUE<\/em><br \/>\n<em>Long.MAX_VALUE<\/em><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/article>\n<\/div>\n<p data-start=\"656\" data-end=\"912\">Wprowadzanie danych przez u\u017cytkownika jest ograniczone do maksymalnej liczby cyfr; po przekroczeniu limitu klawiatura zostaje zablokowana. Je\u015bli za pomoc\u0105 schowka zostanie wprowadzona nieprawid\u0142owa warto\u015b\u0107, pole zostaje oznaczone czerwon\u0105 ramk\u0105 komunikatu.<\/p>\n<p data-start=\"914\" data-end=\"1102\" data-is-last-node=\"\" data-is-only-node=\"\">W przypadku p\u00f3l numerycznych deweloper ma mo\u017cliwo\u015b\u0107 zdefiniowania w repozytorium zakresu warto\u015bci (minimum, maksimum), kt\u00f3rego warto\u015b\u0107 pola nie mo\u017ce przekroczy\u0107 ani nie mo\u017ce spa\u015b\u0107 poni\u017cej.<\/p>\n<h5 data-start=\"914\" data-end=\"1102\" id=\"cisdatefield\" ><span class=\"ez-toc-section\" id=\"CisDateField\"><\/span>CisDateField<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"27\" data-end=\"446\">Warto\u015bci daty oraz znaczniki czasu s\u0105 w Comarch ERP Enterprise reprezentowane przez klas\u0119 <em data-start=\"117\" data-end=\"149\">com.cisag.pgm.datatype.CisDate<\/em>. Klasa ta przechowuje nie tylko dan\u0105 dat\u0119 lub znacznik czasu, lecz r\u00f3wnie\u017c stref\u0119 czasow\u0105 u\u017cywan\u0105 w momencie wprowadzania danych. Dzi\u0119ki temu warto\u015b\u0107 mo\u017ce zosta\u0107 p\u00f3\u017aniej wy\u015bwietlona dok\u0142adnie tak, jak zosta\u0142a wprowadzona \u2014 nawet je\u015bli nast\u0105pi to przez innego u\u017cytkownika w innej strefie czasowej.<\/p>\n<p data-start=\"448\" data-end=\"707\">Klasa <em data-start=\"454\" data-end=\"468\">CisDateField<\/em> s\u0142u\u017cy do wprowadzania i wyprowadzania warto\u015bci daty lub znacznik\u00f3w czasu opartych na <em data-start=\"554\" data-end=\"563\">CisDate<\/em>. \u015acie\u017cka przekazywana w konstruktorze musi nale\u017ce\u0107 do logicznego typu danych, kt\u00f3ry zosta\u0142 wyprowadzony z jednego z nast\u0119puj\u0105cych typ\u00f3w danych:<\/p>\n<ul>\n<li data-start=\"711\" data-end=\"751\"><em data-start=\"711\" data-end=\"749\">com.cisag.pgm.datatype.CisObjectDate<\/em><\/li>\n<li data-start=\"754\" data-end=\"797\"><em data-start=\"754\" data-end=\"795\">com.cisag.pgm.datatype.CisAttributeDate<\/em><\/li>\n<li data-start=\"800\" data-end=\"845\"><em data-start=\"800\" data-end=\"843\">com.cisag.pgm.datatype.CisObjectDateUntil<\/em><\/li>\n<li data-start=\"848\" data-end=\"896\"><em data-start=\"848\" data-end=\"894\">com.cisag.pgm.datatype.CisAttributeDateUntil<\/em><\/li>\n<li data-start=\"899\" data-end=\"944\"><em data-start=\"899\" data-end=\"942\">com.cisag.pgm.datatype.CisObjectTimeStamp<\/em><\/li>\n<li data-start=\"947\" data-end=\"995\"><em data-start=\"947\" data-end=\"993\">com.cisag.pgm.datatype.CisAttributeTimeStamp<\/em><\/li>\n<\/ul>\n<p data-start=\"997\" data-end=\"1208\">Pierwsze cztery typy danych okre\u015blaj\u0105 warto\u015bci daty, dwa ostatnie \u2014 znaczniki czasu. R\u00f3\u017cnice mi\u0119dzy <em data-start=\"1097\" data-end=\"1110\">CisObject*<\/em> a <em data-start=\"1113\" data-end=\"1129\">CisAttribute*<\/em> dotycz\u0105 wy\u0142\u0105cznie reprezentacji w bazie danych i nie maj\u0105 znaczenia dla pola.<\/p>\n<p data-start=\"1210\" data-end=\"1340\">Warto\u015bci daty oznaczone jako <em data-start=\"1239\" data-end=\"1246\">Until<\/em> s\u0142u\u017c\u0105 do szczeg\u00f3lnego przypadku, w kt\u00f3rym data ma by\u0107 u\u017cywana jako g\u00f3rna granica przedzia\u0142u.<\/p>\n<p data-start=\"1342\" data-end=\"1626\">W <em data-start=\"1344\" data-end=\"1361\">DataDescription<\/em>\u00a0generowanej z logicznego typu danych warto\u015bci daty s\u0105 reprezentowane przez typy <em data-start=\"1443\" data-end=\"1463\">Variant.LOCAL_DATE<\/em> oraz <em data-start=\"1469\" data-end=\"1495\">Variant.LOCAL_DATE_UNTIL<\/em>, natomiast wszystkie znaczniki czasu jako <em data-start=\"1538\" data-end=\"1563\">Variant.LOCAL_TIMESTAMP<\/em>. Typ ten okre\u015bla spos\u00f3b obs\u0142ugi obiekt\u00f3w <em data-start=\"1605\" data-end=\"1614\">CisDate<\/em> przez pole.<\/p>\n<p data-start=\"1628\" data-end=\"1966\">W ustawieniu standardowym <em data-start=\"1654\" data-end=\"1668\">CisDateField<\/em> wy\u015bwietla stref\u0119 czasow\u0105 obiektu <em data-start=\"1702\" data-end=\"1711\">CisDate<\/em> tylko wtedy, gdy r\u00f3\u017cni si\u0119 ona od bie\u017c\u0105cego kontekstu. Nawet w takim przypadku nie jest ona edytowalna ani modyfikowalna. Za pomoc\u0105 metody <em data-start=\"1851\" data-end=\"1874\">setTimeZoneEditable()<\/em> pole mo\u017ce zosta\u0107 skonfigurowane w taki spos\u00f3b, aby u\u017cytkownik m\u00f3g\u0142 zmienia\u0107 stref\u0119 czasow\u0105.<\/p>\n<p data-start=\"1968\" data-end=\"2401\">W odr\u00f3\u017cnieniu od wielu innych p\u00f3l <em data-start=\"2002\" data-end=\"2016\">CisDateField<\/em> wymaga jawnej inicjalizacji. Poprzez wywo\u0142anie <em data-start=\"2064\" data-end=\"2076\">setValue()<\/em> do pola nale\u017cy przekaza\u0107 obiekt <em data-start=\"2109\" data-end=\"2118\">CisDate<\/em> z prawid\u0142ow\u0105 stref\u0105 czasow\u0105 (GUID). W przypadku braku tej inicjalizacji pole nie mo\u017ce przy wywo\u0142aniu <em data-start=\"2220\" data-end=\"2232\">getValue()<\/em> utworzy\u0107 obiektu <em data-start=\"2250\" data-end=\"2259\">CisDate<\/em> i zg\u0142asza wyj\u0105tek <em data-start=\"2278\" data-end=\"2311\">java.lang.IllegalStateException<\/em>. Z tego samego powodu nie jest dozwolone ustawienie warto\u015bci pola bezpo\u015brednio na <em data-start=\"2394\" data-end=\"2400\">null<\/em>.<\/p>\n<p data-start=\"2403\" data-end=\"2756\">Za pomoc\u0105 klasy <em data-start=\"2419\" data-end=\"2458\">com.cisag.pgm.datatype.CisDateUtility<\/em> mo\u017cna tworzy\u0107 odpowiednie obiekty <em data-start=\"2493\" data-end=\"2502\">CisDate<\/em>. Metoda <em data-start=\"2513\" data-end=\"2558\">createUndefinedCisDate(byte[] timeZoneGuid)<\/em> zwraca przyk\u0142adowo obiekt <em data-start=\"2585\" data-end=\"2594\">CisDate<\/em>, za pomoc\u0105 kt\u00f3rego pole <em data-start=\"2619\" data-end=\"2633\">CisDateField<\/em> mo\u017ce zosta\u0107 zainicjalizowane lub ponownie wyczyszczone. Wyb\u00f3r w\u0142a\u015bciwej strefy czasowej zale\u017cy od danego przypadku u\u017cycia.<\/p>\n<p data-start=\"2758\" data-end=\"2865\">Je\u017celi strefa czasowa ma odpowiada\u0107 bie\u017c\u0105cemu kontekstowi aplikacji, mo\u017cna j\u0105 ustali\u0107 w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n<p data-start=\"2758\" data-end=\"2865\"><em>CisCalendar cisCalendar =<\/em><br \/>\n<em>CisEnvironment.getInstance().getContext().<\/em><br \/>\n<em>getCisCalendar();<\/em><br \/>\n<em>byte[] tzguid = cisCalendar.getTimeZoneGuid()<\/em><\/p>\n<p data-start=\"3018\" data-end=\"3320\">Kolejn\u0105 cech\u0105 szczeg\u00f3ln\u0105 pola jest obs\u0142uga walidacji i komunikat\u00f3w. Sprawdzanie wprowadzonych danych musi by\u0107 jawnie realizowane lub inicjowane przez dan\u0105 aplikacj\u0119. Aplikacja mo\u017ce (i powinna) korzysta\u0107 z klasy pomocniczej <em data-start=\"3241\" data-end=\"3282\">com.cisag.pgm.util.RepositoryValidation<\/em>, kt\u00f3ra udost\u0119pnia odpowiednie metody.<\/p>\n<p data-start=\"3322\" data-end=\"3653\">Aby b\u0142\u0119dy mog\u0142y zosta\u0107 mo\u017cliwie precyzyjnie przypisane do poszczeg\u00f3lnych danych cz\u0105stkowych (tj. data, godzina, strefa czasowa) oraz odpowiednio zwizualizowane, pole wykorzystuje dodatkowe <em data-start=\"3511\" data-end=\"3523\">MessageIds<\/em> dla swoich podp\u00f3l. Za pomoc\u0105 klas pomocniczych <em data-start=\"3571\" data-end=\"3587\">CisDateUtility<\/em> oraz <em data-start=\"3593\" data-end=\"3614\">CisTimeStampUtility<\/em> mo\u017cna odczyta\u0107 te og\u00f3lne <em data-start=\"3640\" data-end=\"3652\">MessageIds<\/em>.<\/p>\n<h6 data-start=\"3322\" data-end=\"3653\" id=\"cisdatefield-api\" ><span class=\"ez-toc-section\" id=\"CisDateField_API\"><\/span>CisDateField API<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"3693\" data-end=\"3884\">Poni\u017csze tabele przedstawiaj\u0105 najwa\u017cniejsze oraz najcz\u0119\u015bciej u\u017cywane metody klasy <em data-start=\"3775\" data-end=\"3789\">CisDateField<\/em> (pe\u0142na lista oraz szczeg\u00f3\u0142owe opisy znajduj\u0105 si\u0119 w dokumentacji JavaDoc klasy <em data-start=\"3868\" data-end=\"3882\">CisDateField<\/em>).<\/p>\n<p data-start=\"3886\" data-end=\"3909\"><strong>Tabela 59: Konstruktory<\/strong><\/p>\n<table style=\"height: 46px; width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Konstruktor<\/strong><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em data-start=\"93\" data-end=\"123\">CisDateField(String, String)<\/em><br \/>\n<em data-start=\"127\" data-end=\"166\" data-is-only-node=\"\">CisDateField(String, String, boolean)<\/em><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\">Tworzy obiekt <em data-start=\"183\" data-end=\"197\">CisDateField<\/em>.<br \/>\nJako parametry nale\u017cy przekaza\u0107 GUID oraz \u015bcie\u017ck\u0119 (logiczny typ danych).<br \/>\nOpcjonalnie mo\u017cna okre\u015bli\u0107, \u017ce pole jest u\u017cywane wy\u0142\u0105cznie do wy\u015bwietlania danych (np. w listach).<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"514\" data-end=\"761\"><strong>Tabela 60: Dost\u0119p do danych<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 46px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em data-start=\"87\" data-end=\"99\">getValue()<\/em><br \/>\n<em data-start=\"103\" data-end=\"122\">setValue(CisDate)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Odczyt lub zmiana aktualnej warto\u015bci pola.<br \/>\nJak w przypadku wszystkich p\u00f3l, dost\u0119pne s\u0105 r\u00f3wnie\u017c metody dziedziczone z klasy nadrz\u0119dnej <em data-start=\"262\" data-end=\"269\">Field<\/em>: <em data-start=\"271\" data-end=\"291\">getValueAsObject()<\/em> oraz <em data-start=\"297\" data-end=\"319\">setValueFromObject()<\/em>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"514\" data-end=\"761\"><strong>Tabela 61: Wsparcie aplikacyjne<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em data-start=\"420\" data-end=\"440\">getSelectionMode()<\/em><br \/>\n<em data-start=\"444\" data-end=\"471\">setSelectionMode(boolean)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Nie jest obs\u0142ugiwane przez <em data-start=\"501\" data-end=\"515\">CisDateField<\/em>.<br \/>\nW tym celu dost\u0119pne jest specjalne pole <em data-start=\"560\" data-end=\"583\">CisDateSelectionField<\/em>.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em data-start=\"589\" data-end=\"611\">isTimeZoneEditable()<\/em><br \/>\n<em data-start=\"615\" data-end=\"645\">setTimeZoneEditable(boolean)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Okre\u015bla, czy strefa czasowa mo\u017ce by\u0107 zmieniana przez u\u017cytkownika.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>setTimeOutputFormatPattern(short)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Za pomoc\u0105 tej metody mo\u017cna okre\u015bli\u0107, czy sekundy lub milisekundy maj\u0105 by\u0107 zawsze wy\u015bwietlane, czy tylko wtedy, gdy s\u0105 r\u00f3\u017cne od 0.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h5 data-start=\"514\" data-end=\"761\" id=\"cispointintimefield\" ><span class=\"ez-toc-section\" id=\"CisPointInTimeField\"><\/span>CisPointInTimeField<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"514\" data-end=\"761\">Pole to s\u0142u\u017cy do wprowadzania i wyprowadzania termin\u00f3w, przy czym jako dok\u0142adno\u015b\u0107 terminu mo\u017cna wybra\u0107 milisekund\u0119, dzie\u0144, (kalendarzowy) tydzie\u0144, miesi\u0105c, kwarta\u0142 lub rok.<\/p>\n<p data-start=\"514\" data-end=\"761\"><section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">Opisana tutaj klasa udost\u0119pnia jedynie funkcjonalno\u015b\u0107 bazow\u0105. W typowych aplikacjach Comarch ERP Enterprise nale\u017cy stosowa\u0107 klas\u0119 <em data-start=\"357\" data-end=\"375\">PointInTimeField<\/em> z pakietu <em data-start=\"386\" data-end=\"413\">com.cisag.app.general.gui<\/em>.<\/div><\/section><\/p>\n<p data-start=\"514\" data-end=\"761\">Techniczna realizacja terminu odbywa si\u0119 poprzez interfejs <em data-start=\"475\" data-end=\"514\">com.cisag.pgm.datatype.CisPointInTime<\/em>, kt\u00f3ry definiuje termin za pomoc\u0105 nast\u0119puj\u0105cych w\u0142a\u015bciwo\u015bci:<\/p>\n<ul>\n<li data-start=\"579\" data-end=\"605\"><em data-start=\"579\" data-end=\"603\">Calendar (CisCalendar)<\/em><\/li>\n<li data-start=\"608\" data-end=\"646\"><em data-start=\"608\" data-end=\"644\">Accuracy (CisPointInTime.Accuracy)<\/em><\/li>\n<li data-start=\"649\" data-end=\"667\"><em data-start=\"649\" data-end=\"665\">Value (String)<\/em><\/li>\n<li data-start=\"670\" data-end=\"689\"><em data-start=\"670\" data-end=\"687\">Offset (String)<\/em><\/li>\n<li data-start=\"692\" data-end=\"722\"><em data-start=\"692\" data-end=\"720\">Timestamp (java.util.Date)<\/em><\/li>\n<li data-start=\"725\" data-end=\"747\"><em data-start=\"725\" data-end=\"745\">Precision (byte[])<\/em><\/li>\n<\/ul>\n<p data-start=\"749\" data-end=\"1048\">Termin zawsze odnosi si\u0119 do kalendarza, poniewa\u017c dopiero on okre\u015bla, kiedy rozpoczyna si\u0119 dzie\u0144 lub tydzie\u0144. Za pomoc\u0105 w\u0142a\u015bciwo\u015bci <em data-start=\"880\" data-end=\"890\">Accuracy<\/em> okre\u015blana jest dok\u0142adno\u015b\u0107 terminu, np. z dok\u0142adno\u015bci\u0105 do dnia lub tygodnia. W\u0142a\u015bciwo\u015b\u0107 <em data-start=\"978\" data-end=\"985\">Value<\/em> umo\u017cliwia odczyt warto\u015bci w znormalizowanej postaci tekstowej.<\/p>\n<p data-start=\"1050\" data-end=\"1429\">W\u0142a\u015bciwo\u015b\u0107 <em data-start=\"1061\" data-end=\"1069\">Offset<\/em> pozwala na przesuni\u0119cie mi\u0119dzy reprezentacj\u0105 zewn\u0119trzn\u0105 a warto\u015bci\u0105 zapisan\u0105 wewn\u0119trznie. Przyk\u0142adowo termin tygodniowy z offsetem <em>5 dni<\/em> powoduje, \u017ce jako wewn\u0119trzny punkt odniesienia nie jest u\u017cywany poniedzia\u0142ek (0:00), lecz sobota (0:00) danego tygodnia. <em>Offset<\/em> \u2014 podobnie jak warto\u015b\u0107 (<em data-start=\"1361\" data-end=\"1368\">Value<\/em>) \u2014 mo\u017ce by\u0107 odczytywany w znormalizowanej postaci tekstowej.<\/p>\n<p data-start=\"1431\" data-end=\"1618\">Warto\u015b\u0107 wewn\u0119trznego punktu odniesienia jest reprezentowana przez w\u0142a\u015bciwo\u015b\u0107 <em data-start=\"1508\" data-end=\"1519\">Timestamp<\/em>. W\u0142a\u015bciwo\u015b\u0107 <em data-start=\"1532\" data-end=\"1543\">Precision<\/em> zwraca GUID obiektu biznesowego u\u017cywanego do zapisu <em data-start=\"1596\" data-end=\"1606\">Accuracy<\/em> i <em data-start=\"1609\" data-end=\"1617\">Offset<\/em>.<\/p>\n<p data-start=\"1620\" data-end=\"2072\">Podobnie jak <em data-start=\"1633\" data-end=\"1647\">CisDateField<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"1700\" data-end=\"1714\">CisDateField<\/em>), r\u00f3wnie\u017c <em data-start=\"1725\" data-end=\"1746\">CisPointInTimeField<\/em> wymaga jawnej inicjalizacji. Inicjalizacja odbywa si\u0119 poprzez wywo\u0142anie <em data-start=\"1819\" data-end=\"1831\">setValue()<\/em>. W przypadku jej braku pole nie mo\u017ce przy wywo\u0142aniu <em data-start=\"1884\" data-end=\"1896\">getValue()<\/em> utworzy\u0107 obiektu <em data-start=\"1914\" data-end=\"1930\">CisPointInTime<\/em> i zg\u0142asza wyj\u0105tek <em data-start=\"1949\" data-end=\"1982\">java.lang.IllegalStateException<\/em>. Z tego samego powodu nie jest dozwolone ustawienie warto\u015bci pola bezpo\u015brednio na <em data-start=\"2065\" data-end=\"2071\">null<\/em>.<\/p>\n<p data-start=\"2074\" data-end=\"2197\">Za pomoc\u0105 klasy <em data-start=\"2090\" data-end=\"2136\">com.cisag.pgm.datatype.CisPointInTimeUtility<\/em> mo\u017cna tworzy\u0107 odpowiednie obiekty <em data-start=\"2171\" data-end=\"2187\">CisPointInTime<\/em>. Metoda<\/p>\n<p data-start=\"2074\" data-end=\"2197\"><em data-start=\"2199\" data-end=\"2308\">createUndefinedCisPointInTimeMutable(CisCalendar calendar, short accuracy, String offset, byte[] precision)<\/em><\/p>\n<p data-start=\"2312\" data-end=\"2522\">zwraca przyk\u0142adowo obiekt <em data-start=\"2338\" data-end=\"2354\">CisPointInTime<\/em>, za pomoc\u0105 kt\u00f3rego pole <em data-start=\"2379\" data-end=\"2400\">CisPointInTimeField<\/em> mo\u017ce zosta\u0107 zainicjalizowane lub ponownie wyczyszczone. Wyb\u00f3r odpowiedniego kalendarza zale\u017cy od danego przypadku u\u017cycia.<\/p>\n<p data-start=\"2524\" data-end=\"2626\">Je\u017celi kalendarz ma odpowiada\u0107 bie\u017c\u0105cemu kontekstowi aplikacji, mo\u017cna go ustali\u0107 w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n<p data-start=\"2524\" data-end=\"2626\"><em>CisCalendar cisCalendar =<\/em><br \/>\n<em>CisEnvironment.getInstance().getContext().<\/em><br \/>\n<em>getCisCalendar();<\/em><\/p>\n<p data-start=\"2732\" data-end=\"3069\">R\u00f3wnie\u017c w zakresie walidacji i komunikat\u00f3w <em data-start=\"2775\" data-end=\"2796\">CisPointInTimeField<\/em> zachowuje si\u0119 tak jak <em data-start=\"2819\" data-end=\"2833\">CisDateField<\/em>. Sprawdzanie wprowadzonych danych musi by\u0107 jawnie realizowane lub inicjowane przez dan\u0105 aplikacj\u0119. Aplikacja mo\u017ce (i powinna) korzysta\u0107 z klasy pomocniczej <em data-start=\"2990\" data-end=\"3031\">com.cisag.pgm.util.RepositoryValidation<\/em>, kt\u00f3ra udost\u0119pnia odpowiednie metody.<\/p>\n<h6 data-start=\"2732\" data-end=\"3069\" id=\"cispointintimefield-api\" ><span class=\"ez-toc-section\" id=\"CisPointInTimeField_API\"><\/span>CisPointInTimeField API<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"2732\" data-end=\"3069\">Poni\u017csze tabele przedstawiaj\u0105 najwa\u017cniejsze oraz najcz\u0119\u015bciej u\u017cywane metody klasy <em data-start=\"3198\" data-end=\"3219\">CisPointInTimeField<\/em> (pe\u0142na lista oraz szczeg\u00f3\u0142owe opisy znajduj\u0105 si\u0119 w dokumentacji JavaDoc klasy <em data-start=\"3298\" data-end=\"3319\">CisPointInTimeField<\/em>).<\/p>\n<p data-start=\"2732\" data-end=\"3069\"><strong>Tabela 62: Konstruktory<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 46px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Konstruktor<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em data-start=\"93\" data-end=\"130\">CisPointInTimeField(String, String)<\/em><br \/>\n<em data-start=\"134\" data-end=\"180\">CisPointInTimeField(String, String, boolean)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Tworzy obiekt <em data-start=\"197\" data-end=\"218\">CisPointInTimeField<\/em>.<br \/>\nJako parametry nale\u017cy przekaza\u0107 GUID oraz \u015bcie\u017ck\u0119 (logiczny typ danych).<br \/>\nOpcjonalnie mo\u017cna okre\u015bli\u0107, \u017ce pole jest u\u017cywane wy\u0142\u0105cznie do wy\u015bwietlania danych (np. w listach).<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"514\" data-end=\"761\"><strong>Tabela 63: Dost\u0119p do danych<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em data-start=\"493\" data-end=\"505\">getValue()<\/em><br \/>\n<em data-start=\"509\" data-end=\"535\">setValue(CisPointInTime)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Odczyt lub zmiana aktualnej warto\u015bci pola.<br \/>\nJak w przypadku wszystkich p\u00f3l, dost\u0119pne s\u0105 r\u00f3wnie\u017c metody dziedziczone z klasy nadrz\u0119dnej <em data-start=\"675\" data-end=\"682\">Field<\/em>: <em data-start=\"684\" data-end=\"704\">getValueAsObject()<\/em> oraz <em data-start=\"710\" data-end=\"732\">setValueFromObject()<\/em>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h5 data-start=\"514\" data-end=\"761\" id=\"timestampfield\" ><span class=\"ez-toc-section\" id=\"TimeStampField\"><\/span>TimeStampField<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"29\" data-end=\"149\">Pole <em data-start=\"34\" data-end=\"50\">TimeStampField<\/em> s\u0142u\u017cy do wprowadzania i wyprowadzania znacznik\u00f3w czasu opartych na <em data-start=\"118\" data-end=\"134\">java.util.Date<\/em> (timestamp\u00f3w).<\/p>\n<p data-start=\"151\" data-end=\"420\">Ten typ znacznik\u00f3w czasu jest wykorzystywany g\u0142\u00f3wnie przez aplikacje systemowe, np. jako znacznik czasu w protoko\u0142ach zmian lub komunikat\u00f3w. Warto\u015bci daty i czasu wy\u015bwietlane przez <em data-start=\"332\" data-end=\"348\">TimeStampField<\/em> zawsze odnosz\u0105 si\u0119 do strefy czasowej z bie\u017c\u0105cego kontekstu aplikacji.<\/p>\n<p data-start=\"422\" data-end=\"748\">\u015acie\u017cka przekazywana w konstruktorze musi nale\u017ce\u0107 do logicznego typu danych wyprowadzonego z logicznego typu <em data-start=\"531\" data-end=\"565\">com.cisag.pgm.datatype.TimeStamp<\/em> lub wykorzystywa\u0107 znacznik czasu jako prymitywny typ danych. W <em data-start=\"631\" data-end=\"648\">DataDescription<\/em> generowanej z logicznego typu danych warto\u015bci daty s\u0105 reprezentowane przez typ <em data-start=\"728\" data-end=\"747\">Variant.TIMESTAMP<\/em>.<\/p>\n<p data-start=\"750\" data-end=\"1187\">Podobnie jak <em data-start=\"763\" data-end=\"777\">CisDateField<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"830\" data-end=\"844\">CisDateField<\/em>), r\u00f3wnie\u017c <em data-start=\"855\" data-end=\"871\">TimeStampField<\/em> wymaga jawnej inicjalizacji. Inicjalizacja odbywa si\u0119 poprzez wywo\u0142anie <em data-start=\"944\" data-end=\"956\">setValue()<\/em>. W przypadku jej braku pole nie mo\u017ce przy wywo\u0142aniu <em data-start=\"1009\" data-end=\"1021\">getValue()<\/em> utworzy\u0107 obiektu <em data-start=\"1039\" data-end=\"1045\">Date<\/em> i zg\u0142asza wyj\u0105tek <em data-start=\"1064\" data-end=\"1097\">java.lang.IllegalStateException<\/em>. Z tego samego powodu nie jest dozwolone ustawienie warto\u015bci pola bezpo\u015brednio na <em data-start=\"1180\" data-end=\"1186\">null<\/em>.<\/p>\n<p data-start=\"1189\" data-end=\"1453\">Za pomoc\u0105 klasy <em data-start=\"1205\" data-end=\"1249\">com.cisag.pgm.datatype.CisTimeStampUtility<\/em> mo\u017cna tworzy\u0107 odpowiednie obiekty <em data-start=\"1284\" data-end=\"1290\">Date<\/em>. Sta\u0142a <em data-start=\"1298\" data-end=\"1320\">UNDEFINED_TIME_STAMP<\/em> definiuje przyk\u0142adowo obiekt <em data-start=\"1350\" data-end=\"1356\">Date<\/em>, za pomoc\u0105 kt\u00f3rego pole <em data-start=\"1381\" data-end=\"1397\">TimeStampField<\/em> mo\u017ce zosta\u0107 zainicjalizowane lub ponownie wyczyszczone.<\/p>\n<p data-start=\"1455\" data-end=\"1787\">R\u00f3wnie\u017c w zakresie walidacji i komunikat\u00f3w <em data-start=\"1498\" data-end=\"1514\">TimeStampField<\/em> zachowuje si\u0119 tak jak <em data-start=\"1537\" data-end=\"1551\">CisDateField<\/em>. Sprawdzanie wprowadzonych danych musi by\u0107 jawnie realizowane lub inicjowane przez dan\u0105 aplikacj\u0119. Aplikacja mo\u017ce (i powinna) korzysta\u0107 z klasy pomocniczej <em data-start=\"1708\" data-end=\"1749\">com.cisag.pgm.util.RepositoryValidation<\/em>, kt\u00f3ra udost\u0119pnia odpowiednie metody.<\/p>\n<p data-start=\"1789\" data-end=\"2082\">Aby b\u0142\u0119dy mog\u0142y zosta\u0107 mo\u017cliwie precyzyjnie przypisane do poszczeg\u00f3lnych danych cz\u0105stkowych (tj. data, godzina) oraz odpowiednio zwizualizowane, pole wykorzystuje dodatkowe <em data-start=\"1962\" data-end=\"1974\">MessageIds<\/em> dla swoich podp\u00f3l. Za pomoc\u0105 klasy pomocniczej <em data-start=\"2022\" data-end=\"2043\">CisTimeStampUtility<\/em> mo\u017cna odczyta\u0107 te og\u00f3lne <em data-start=\"2069\" data-end=\"2081\">MessageIds<\/em>.<\/p>\n<h6 data-start=\"1789\" data-end=\"2082\" id=\"timestampfield-api\" ><span class=\"ez-toc-section\" id=\"TimeStampField_API\"><\/span>TimeStampField API<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"1789\" data-end=\"2082\">Poni\u017csze tabele przedstawiaj\u0105 najwa\u017cniejsze oraz najcz\u0119\u015bciej u\u017cywane metody klasy <em data-start=\"2206\" data-end=\"2222\">TimeStampField<\/em> (pe\u0142na lista oraz szczeg\u00f3\u0142owe opisy znajduj\u0105 si\u0119 w dokumentacji JavaDoc klasy <em data-start=\"2301\" data-end=\"2317\">TimeStampField<\/em>).<\/p>\n<p data-start=\"1789\" data-end=\"2082\"><strong>Tabela 64: Konstruktory<\/strong><\/p>\n<table style=\"height: 46px; width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Konstruktor<\/strong><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em data-start=\"93\" data-end=\"125\">TimeStampField(String, String)<\/em><br \/>\n<em data-start=\"129\" data-end=\"170\">TimeStampField(String, String, boolean)<\/em><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\">Tworzy obiekt <em data-start=\"187\" data-end=\"203\">TimeStampField<\/em>.<br \/>\nJako parametry nale\u017cy przekaza\u0107 GUID oraz \u015bcie\u017ck\u0119 (logiczny typ danych).<br \/>\nOpcjonalnie mo\u017cna okre\u015bli\u0107, \u017ce pole jest u\u017cywane wy\u0142\u0105cznie do wy\u015bwietlania danych (np. w listach).<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"1789\" data-end=\"2082\"><strong>Tabela 65: Dost\u0119p do danych<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em data-start=\"478\" data-end=\"490\">getValue()<\/em><br \/>\n<em data-start=\"494\" data-end=\"520\">setValue(java.util.Date)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Odczyt lub zmiana aktualnej warto\u015bci pola.<br \/>\nJak w przypadku wszystkich p\u00f3l, dost\u0119pne s\u0105 r\u00f3wnie\u017c metody dziedziczone z klasy nadrz\u0119dnej <em data-start=\"660\" data-end=\"667\">Field<\/em>: <em data-start=\"669\" data-end=\"689\">getValueAsObject()<\/em> oraz <em data-start=\"695\" data-end=\"717\">setValueFromObject()<\/em>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"514\" data-end=\"761\"><strong>Tabela 66: Wsparcie aplikacyjne<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em data-start=\"818\" data-end=\"838\">getSelectionMode()<\/em><br \/>\n<em data-start=\"842\" data-end=\"869\">setSelectionMode(boolean)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\" data-col-size=\"lg\" data-start=\"870\" data-end=\"986\" data-is-last-node=\"\">Nie jest obs\u0142ugiwane przez <em data-start=\"899\" data-end=\"915\">TimeStampField<\/em>.<br \/>\nW tym celu dost\u0119pne jest specjalne pole <em data-start=\"960\" data-end=\"983\">CisDateSelectionField<\/em>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h5 data-start=\"514\" data-end=\"761\" id=\"timeofdayfield\" ><span class=\"ez-toc-section\" id=\"TimeOfDayField\"><\/span>TimeOfDayField<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"29\" data-end=\"266\">Pole <em data-start=\"34\" data-end=\"50\">TimeOfDayField<\/em> s\u0142u\u017cy do wprowadzania i wyprowadzania godzin. Typem danych dla <em data-start=\"114\" data-end=\"121\">value<\/em> jest <em data-start=\"127\" data-end=\"143\">java.util.Date<\/em>, przy czym jako data zawsze musi by\u0107 u\u017cywana warto\u015b\u0107 <em>1.1.1970<\/em>, tzn. godzina jest zapisywana jako milisekundy od p\u00f3\u0142nocy.<\/p>\n<p data-start=\"268\" data-end=\"594\">\u015acie\u017cka przekazywana w konstruktorze musi nale\u017ce\u0107 do logicznego typu danych wyprowadzonego z logicznego typu <em data-start=\"377\" data-end=\"411\">com.cisag.pgm.datatype.TimeOfDay<\/em> lub wykorzystywa\u0107 znacznik czasu jako prymitywny typ danych. W <em data-start=\"477\" data-end=\"494\">DataDescription<\/em> generowanej z logicznego typu danych warto\u015bci daty s\u0105 reprezentowane przez typ <em data-start=\"574\" data-end=\"593\">Variant.TIMESTAMP<\/em>.<\/p>\n<p data-start=\"596\" data-end=\"1125\">Podobnie jak <em data-start=\"609\" data-end=\"623\">CisDateField<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"676\" data-end=\"690\">CisDateField<\/em>) oraz <em data-start=\"697\" data-end=\"713\">TimeStampField<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"766\" data-end=\"782\">TimeStampField<\/em>), r\u00f3wnie\u017c <em data-start=\"793\" data-end=\"809\">TimeOfDayField<\/em> wymaga jawnej inicjalizacji. Inicjalizacja odbywa si\u0119 poprzez wywo\u0142anie <em data-start=\"882\" data-end=\"894\">setValue()<\/em>. W przypadku jej braku pole nie mo\u017ce przy wywo\u0142aniu <em data-start=\"947\" data-end=\"959\">getValue()<\/em> utworzy\u0107 obiektu <em data-start=\"977\" data-end=\"983\">Date<\/em> i zg\u0142asza wyj\u0105tek <em data-start=\"1002\" data-end=\"1035\">java.lang.IllegalStateException<\/em>. Z tego samego powodu nie jest dozwolone ustawienie warto\u015bci pola bezpo\u015brednio na <em data-start=\"1118\" data-end=\"1124\">null<\/em>.<\/p>\n<p data-start=\"1127\" data-end=\"1391\">Za pomoc\u0105 klasy <em data-start=\"1143\" data-end=\"1187\">com.cisag.pgm.datatype.CisTimeStampUtility<\/em> mo\u017cna tworzy\u0107 odpowiednie obiekty <em data-start=\"1222\" data-end=\"1228\">Date<\/em>. Sta\u0142a <em data-start=\"1236\" data-end=\"1258\">UNDEFINED_TIME_STAMP<\/em> definiuje przyk\u0142adowo obiekt <em data-start=\"1288\" data-end=\"1294\">Date<\/em>, za pomoc\u0105 kt\u00f3rego pole <em data-start=\"1319\" data-end=\"1335\">TimeOfDayField<\/em> mo\u017ce zosta\u0107 zainicjalizowane lub ponownie wyczyszczone.<\/p>\n<p data-start=\"1393\" data-end=\"1725\">R\u00f3wnie\u017c w zakresie walidacji i komunikat\u00f3w <em data-start=\"1436\" data-end=\"1452\">TimeOfDayField<\/em> zachowuje si\u0119 tak jak <em data-start=\"1475\" data-end=\"1489\">CisDateField<\/em>. Sprawdzanie wprowadzonych danych musi by\u0107 jawnie realizowane lub inicjowane przez dan\u0105 aplikacj\u0119. Aplikacja mo\u017ce (i powinna) korzysta\u0107 z klasy pomocniczej <em data-start=\"1646\" data-end=\"1687\">com.cisag.pgm.util.RepositoryValidation<\/em>, kt\u00f3ra udost\u0119pnia odpowiednie metody.<\/p>\n<h6 data-start=\"1393\" data-end=\"1725\" id=\"timeofdayfield-api\" ><span class=\"ez-toc-section\" id=\"TimeOfDayField_API\"><\/span>TimeOfDayField API<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"1767\" data-end=\"1962\">Poni\u017csze tabele przedstawiaj\u0105 najwa\u017cniejsze oraz najcz\u0119\u015bciej u\u017cywane metody klasy <em data-start=\"1849\" data-end=\"1865\">TimeOfDayField<\/em> (pe\u0142na lista oraz szczeg\u00f3\u0142owe opisy znajduj\u0105 si\u0119 w dokumentacji JavaDoc klasy <em data-start=\"1944\" data-end=\"1960\">TimeOfDayField<\/em>).<\/p>\n<p data-start=\"1964\" data-end=\"1987\" data-is-last-node=\"\" data-is-only-node=\"\"><strong>Tabela 67: Konstruktory<\/strong><\/p>\n<table style=\"height: 46px; width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Konstruktor<\/strong><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em data-start=\"93\" data-end=\"125\">TimeOfDayField(String, String)<\/em><br \/>\n<em data-start=\"129\" data-end=\"170\" data-is-only-node=\"\">TimeOfDayField(String, String, boolean)<\/em><\/td>\n<td style=\"width: 50%; height: 23px; border-style: outset; border-color: #000000; background-color: #ffffff;\">Tworzy obiekt <em data-start=\"187\" data-end=\"203\">TimeOfDayField<\/em>.<br \/>\nJako parametry nale\u017cy przekaza\u0107 GUID oraz \u015bcie\u017ck\u0119 (logiczny typ danych).<br \/>\nOpcjonalnie mo\u017cna okre\u015bli\u0107, \u017ce pole jest u\u017cywane wy\u0142\u0105cznie do wy\u015bwietlania danych (np. w listach).<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"514\" data-end=\"761\"><strong>Tabela 68: Dost\u0119p do danych<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em data-start=\"87\" data-end=\"99\">getValue()<\/em><br \/>\n<em data-start=\"103\" data-end=\"129\">setValue(java.util.Date)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Odczyt lub zmiana aktualnej warto\u015bci pola.<br \/>\nJak w przypadku wszystkich p\u00f3l, dost\u0119pne s\u0105 r\u00f3wnie\u017c metody dziedziczone z klasy nadrz\u0119dnej <em data-start=\"269\" data-end=\"276\">Field<\/em>: <em data-start=\"278\" data-end=\"298\">getValueAsObject()<\/em> oraz <em data-start=\"304\" data-end=\"326\">setValueFromObject()<\/em>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"514\" data-end=\"761\"><strong>Tabela 69: Wsparcie aplikacyjne<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em data-start=\"427\" data-end=\"447\">getSelectionMode()<\/em><br \/>\n<em data-start=\"451\" data-end=\"478\">setSelectionMode(boolean)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Nie jest obs\u0142ugiwane przez <em data-start=\"508\" data-end=\"524\">TimeOfDayField<\/em>.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>setTimeOutputFormatPattern(short)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Za pomoc\u0105 tej metody mo\u017cna okre\u015bli\u0107, czy sekundy lub milisekundy maj\u0105 by\u0107 zawsze wy\u015bwietlane, czy tylko wtedy, gdy s\u0105 r\u00f3\u017cne od 0.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h5 data-start=\"514\" data-end=\"761\" id=\"labelfield\" ><span class=\"ez-toc-section\" id=\"LabelField\"><\/span>LabelField<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"25\" data-end=\"353\">Klasa <em data-start=\"31\" data-end=\"61\">com.cisag.pgm.gui.LabelField<\/em> s\u0142u\u017cy przede wszystkim do wy\u015bwietlania prostych tekst\u00f3w (tylko do odczytu) w tabelach (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"199\" data-end=\"206\">Table<\/em>). W tabelach (i listach) preferowane jest u\u017cycie <em data-start=\"256\" data-end=\"268\">LabelField<\/em> zamiast odpowiednio skonfigurowanego <em data-start=\"306\" data-end=\"317\">TextField<\/em>, poniewa\u017c zu\u017cywa ono mniej zasob\u00f3w.<\/p>\n<p data-start=\"355\" data-end=\"576\">Klasa <em data-start=\"361\" data-end=\"386\">com.cisag.pgm.gui.Label<\/em> nie mo\u017ce by\u0107 u\u017cywana w tabelach, poniewa\u017c kolumny tabel mog\u0105 by\u0107 definiowane wy\u0142\u0105cznie za pomoc\u0105 instancji <em data-start=\"494\" data-end=\"519\">com.cisag.pgm.gui.Field<\/em>. Z tego powodu <em data-start=\"535\" data-end=\"547\">LabelField<\/em> jest klas\u0105 pochodn\u0105 <em data-start=\"568\" data-end=\"575\">Field<\/em>.<\/p>\n<p data-start=\"578\" data-end=\"677\">Instancje <em data-start=\"588\" data-end=\"600\">LabelField<\/em> s\u0105 tworzone za pomoc\u0105 konstruktora <em data-start=\"638\" data-end=\"676\">LabelField(String guid, String path)<\/em>.<\/p>\n<p data-start=\"679\" data-end=\"868\">Metody <em data-start=\"686\" data-end=\"709\">setText(String value)<\/em> oraz <em data-start=\"715\" data-end=\"747\">setValueFromObject(Object obj)<\/em> s\u0142u\u017c\u0105 do przypisania tekstu do pola <em data-start=\"784\" data-end=\"796\">LabelField<\/em>. Aktualn\u0105 zawarto\u015b\u0107 pola mo\u017cna odczyta\u0107 za pomoc\u0105 <em data-start=\"847\" data-end=\"867\">getValueAsObject()<\/em>.<\/p>\n<p data-start=\"679\" data-end=\"868\"><section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">W przeciwie\u0144stwie do klasy <em data-start=\"914\" data-end=\"939\">com.cisag.pgm.gui.Label<\/em>, <em data-start=\"941\" data-end=\"953\">LabelField<\/em> mo\u017ce wy\u015bwietla\u0107 tekst albo ikon\u0119, lecz nie oba elementy jednocze\u015bnie. Mo\u017cliwo\u015b\u0107 wy\u015bwietlania ikon za pomoc\u0105 <em data-start=\"1062\" data-end=\"1074\">LabelField<\/em> nie powinna by\u0107 jednak wykorzystywana. Zamiast tego nale\u017cy u\u017cywa\u0107 <em data-start=\"1142\" data-end=\"1153\">IconField<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"1206\" data-end=\"1217\">IconField<\/em>).<\/div><\/section><\/p>\n<h5 data-start=\"679\" data-end=\"868\" id=\"iconfield\" ><span class=\"ez-toc-section\" id=\"IconField\"><\/span>IconField<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"1250\" data-end=\"1401\">Klasa <em data-start=\"1256\" data-end=\"1285\">com.cisag.pgm.gui.IconField<\/em> s\u0142u\u017cy przede wszystkim do wy\u015bwietlania ikon w tabelach (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"1392\" data-end=\"1399\">Table<\/em>).<\/p>\n<p data-start=\"1403\" data-end=\"1816\">Ikony s\u0105 zazwyczaj wy\u015bwietlane za pomoc\u0105 <em data-start=\"1444\" data-end=\"1469\">com.cisag.pgm.gui.Label<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"1521\" data-end=\"1528\">Label<\/em>). Klasa <em data-start=\"1537\" data-end=\"1544\">Label<\/em> nie mo\u017ce by\u0107 jednak u\u017cywana w tabelach, poniewa\u017c kolumny tabel mog\u0105 by\u0107 definiowane wy\u0142\u0105cznie za pomoc\u0105 instancji <em data-start=\"1659\" data-end=\"1684\">com.cisag.pgm.gui.Field<\/em>. Z tego powodu <em data-start=\"1700\" data-end=\"1711\">IconField<\/em> jest klas\u0105 pochodn\u0105 <em data-start=\"1732\" data-end=\"1739\">Field<\/em>. Klasa <em data-start=\"1747\" data-end=\"1777\">com.cisag.pgm.gui.LabelField<\/em> pe\u0142ni analogiczn\u0105 funkcj\u0119 dla tekst\u00f3w.<\/p>\n<p data-start=\"1818\" data-end=\"1923\">Pole jest tworzone za pomoc\u0105 standardowego konstruktora dla p\u00f3l: <em data-start=\"1885\" data-end=\"1922\">IconField(String guid, String path)<\/em>.<\/p>\n<p data-start=\"1925\" data-end=\"2167\">Ikony, tj. instancje <em data-start=\"1946\" data-end=\"1970\">com.cisag.pgm.gui.Icon<\/em>, mog\u0105 by\u0107 przypisywane do pola za pomoc\u0105 metod <em data-start=\"2018\" data-end=\"2034\">setValue(Icon)<\/em> lub <em data-start=\"2039\" data-end=\"2067\">setValueFromObject(Object)<\/em>. Tekst podpowiedzi (<em>ToolTip<\/em>) dla pola mo\u017cna ustawi\u0107 za pomoc\u0105 metody <em data-start=\"2137\" data-end=\"2166\">setToolTipText(String text)<\/em>.<\/p>\n<p data-start=\"2169\" data-end=\"2237\">Nie jest mo\u017cliwe przypisanie do <em data-start=\"2201\" data-end=\"2212\">IconField<\/em> tekstu opisu (etykiety).<\/p>\n<h5 data-start=\"2169\" data-end=\"2237\" id=\"layerediconfield\" ><span class=\"ez-toc-section\" id=\"LayeredIconField\"><\/span>LayeredIconField<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"2275\" data-end=\"2538\">Klasa <em data-start=\"2281\" data-end=\"2317\">com.cisag.pgm.gui.LayeredIconField<\/em> umo\u017cliwia jednoczesne wy\u015bwietlanie wielu ikon. Ikony s\u0105 rozmieszczane jedna nad drug\u0105 (w kierunku osi <em>Z<\/em>). Je\u015bli widoczna ma by\u0107 nie tylko najwy\u017csza ikona, pozosta\u0142e ikony musz\u0105 by\u0107 (przynajmniej cz\u0119\u015bciowo) przezroczyste.<\/p>\n<p data-start=\"2540\" data-end=\"2648\">Ikony, kt\u00f3re maj\u0105 by\u0107 wy\u015bwietlane w polu, nale\u017cy doda\u0107 za pomoc\u0105 metody <em data-start=\"2614\" data-end=\"2647\">addIcon(short value, Icon icon)<\/em>.<\/p>\n<p data-start=\"2650\" data-end=\"2926\">Wizualizacja ikon odbywa si\u0119 poprzez wywo\u0142anie metody <em data-start=\"2706\" data-end=\"2731\">setValue(short[] value)<\/em>, przy czym tablica zawiera indeksy ikon, kt\u00f3re maj\u0105 by\u0107 wy\u015bwietlone. Podobne dzia\u0142anie ma metoda <em data-start=\"2829\" data-end=\"2861\">setValueFromObject(Object obj)<\/em>, kt\u00f3ra jako parametr akceptuje wy\u0142\u0105cznie tablic\u0119 typu <em data-start=\"2916\" data-end=\"2925\">short[]<\/em>.<\/p>\n<p data-start=\"2928\" data-end=\"3125\">Metody <em data-start=\"2935\" data-end=\"2947\">getValue()<\/em> oraz <em data-start=\"2953\" data-end=\"2973\">getValueAsObject()<\/em> zwracaj\u0105 indeksy aktualnie wy\u015bwietlanych ikon. Za pomoc\u0105 metody <em data-start=\"3038\" data-end=\"3065\">containsIcon(short value)<\/em> mo\u017cna sprawdzi\u0107, czy pole zawiera ikon\u0119 o podanym indeksie.<\/p>\n<h5 data-start=\"2928\" data-end=\"3125\" id=\"guidfield\" ><span class=\"ez-toc-section\" id=\"GuidField\"><\/span>GuidField<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"3156\" data-end=\"3274\">Klasa <em data-start=\"3162\" data-end=\"3191\">com.cisag.pgm.gui.GuidField<\/em> zosta\u0142a stworzona specjalnie do wprowadzania i wyprowadzania identyfikator\u00f3w GUID.<\/p>\n<p data-start=\"3276\" data-end=\"3489\">Metody <em data-start=\"3283\" data-end=\"3295\">getValue()<\/em> oraz <em data-start=\"3301\" data-end=\"3319\">setValue(byte[])<\/em> zwracaj\u0105 GUID w postaci tablicy (<em data-start=\"3353\" data-end=\"3361\">byte[]<\/em>) lub akceptuj\u0105 GUID wy\u0142\u0105cznie w tej formie. To samo dotyczy metod <em data-start=\"3428\" data-end=\"3462\">setValueFromObject(Object value)<\/em> oraz <em data-start=\"3468\" data-end=\"3488\">getValueAsObject()<\/em>.<\/p>\n<p data-start=\"3491\" data-end=\"3591\">Za pomoc\u0105 metody <em data-start=\"3508\" data-end=\"3526\">getStringValue()<\/em> mo\u017cna uzyska\u0107 reprezentacj\u0119 GUID w postaci tekstowej (<em data-start=\"3581\" data-end=\"3589\">String<\/em>).<\/p>\n<h5 data-start=\"3491\" data-end=\"3591\" id=\"favoritefield\" ><span class=\"ez-toc-section\" id=\"FavoriteField\"><\/span>FavoriteField<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"3626\" data-end=\"3826\">Pole <em data-start=\"3631\" data-end=\"3664\">com.cisag.pgm.gui.FavoriteField<\/em> s\u0142u\u017cy w tabelach do oznaczania wiersza jako warto\u015bci domy\u015blnej lub ulubionej. Wszystkie kom\u00f3rki (<em>CheckBox<\/em>) w danej kolumnie tabeli s\u0105 ze sob\u0105 zsynchronizowane.<\/p>\n<p data-start=\"3828\" data-end=\"4034\">Zawsze dok\u0142adnie jedna kom\u00f3rka (<em>z n<\/em>) mo\u017ce by\u0107 zaznaczona. Zaznaczenie nowej kom\u00f3rki powoduje automatyczne odznaczenie poprzedniej. <em>CheckBoxy<\/em> w wierszach zachowuj\u0105 si\u0119 zatem jak grupa przycisk\u00f3w <em>RadioButton<\/em>.<\/p>\n<h5 data-start=\"3828\" data-end=\"4034\" id=\"passwordfield\" ><span class=\"ez-toc-section\" id=\"PasswordField\"><\/span>PasswordField<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"4069\" data-end=\"4312\">Do wprowadzania hase\u0142 dost\u0119pna jest klasa <em data-start=\"4111\" data-end=\"4144\">com.cisag.pgm.gui.PasswordField<\/em>. <em data-start=\"4146\" data-end=\"4161\">PasswordField<\/em> bazuje na <em data-start=\"4172\" data-end=\"4183\">TextField<\/em>, jednak w interfejsie u\u017cytkownika zawsze wy\u015bwietla swoj\u0105 zawarto\u015b\u0107 \u2014 tekst wprowadzony przez u\u017cytkownika \u2014 jako ci\u0105g znak\u00f3w <em>*<\/em>.<\/p>\n<p data-start=\"4314\" data-end=\"4519\">Za pomoc\u0105 metod <em data-start=\"4330\" data-end=\"4342\">getValue()<\/em> oraz <em data-start=\"4348\" data-end=\"4368\">getValueAsObject()<\/em> zawarto\u015b\u0107 pola jest dost\u0119pna jako <em data-start=\"4403\" data-end=\"4411\">String<\/em>. Wszystkie bia\u0142e znaki na pocz\u0105tku i\/lub ko\u0144cu tekstu s\u0105 automatycznie usuwane (<em data-start=\"4492\" data-end=\"4517\">java.lang.String#trim()<\/em>).<\/p>\n<p data-start=\"4521\" data-end=\"4625\">Metody <em data-start=\"4528\" data-end=\"4546\">setValue(String)<\/em> oraz <em data-start=\"4552\" data-end=\"4580\">setValueFromObject(Object)<\/em> umo\u017cliwiaj\u0105 zmian\u0119 has\u0142a po stronie serwera.<\/p>\n<h5 data-start=\"4521\" data-end=\"4625\" id=\"characterfield\" ><span class=\"ez-toc-section\" id=\"CharacterField\"><\/span>CharacterField<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"29\" data-end=\"127\">Klasa <em data-start=\"35\" data-end=\"69\">com.cisag.pgm.gui.CharacterField<\/em> s\u0142u\u017cy do wprowadzania i wyprowadzania pojedynczego znaku.<\/p>\n<p data-start=\"129\" data-end=\"241\">Pole oczekuje jako warto\u015bci obiektu typu <em data-start=\"170\" data-end=\"191\">java.lang.Character<\/em>, przekazywanego do metody <em data-start=\"218\" data-end=\"240\">setValueFromObject()<\/em>.<\/p>\n<p data-start=\"243\" data-end=\"484\">Je\u017celi za pomoc\u0105 odziedziczonej z klasy nadrz\u0119dnej <em data-start=\"294\" data-end=\"319\">com.cisag.pgm.gui.Field<\/em> metody <em data-start=\"327\" data-end=\"351\">setStringValue(String)<\/em> zostanie ustawiony \u0142a\u0144cuch znak\u00f3w o d\u0142ugo\u015bci wi\u0119kszej ni\u017c jeden znak, <em data-start=\"422\" data-end=\"438\">CharacterField<\/em> przejmuje pierwszy znak z przekazanego ci\u0105gu.<\/p>\n<h5 data-start=\"243\" data-end=\"484\" id=\"pola-wyboru\" ><span class=\"ez-toc-section\" id=\"Pola_wyboru\"><\/span>Pola wyboru<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"515\" data-end=\"837\">W niekt\u00f3rych zastosowaniach, w szczeg\u00f3lno\u015bci przy wyszukiwaniu i w aplikacjach zapyta\u0144, konieczne jest wprowadzanie listy warto\u015bci, zakresu warto\u015bci (przedzia\u0142u) i\/lub wzorca wyszukiwania (z symbolami zast\u0119pczymi <em>*<\/em>, <em>?<\/em>). W artykule <em data-start=\"750\" data-end=\"771\">Instrukcja obs\u0142ugi<\/em> pola te s\u0105 okre\u015blane jako pola wprowadzania wielowarto\u015bciowego.<\/p>\n<p data-start=\"839\" data-end=\"1087\">Od wersji 4 dost\u0119pne s\u0105 w tym celu specjalne typy p\u00f3l. Wszystkie nowe pola wyboru obs\u0142uguj\u0105 wzorce wprowadzania w formie listy wyboru. Ma to umo\u017cliwi\u0107 u\u017cytkownikowi zapoznanie si\u0119 ze standardowymi w Comarch ERP Enterprise sposobami zapisu selekcji.<\/p>\n<p data-start=\"1089\" data-end=\"1363\">Na li\u015bcie wyboru wy\u015bwietlanych jest kilka propozycji selekcji, np. zaczyna si\u0119 od ABC. Po wybraniu jednej z nich do pola przenoszony jest odpowiadaj\u0105cy jej wzorzec, np. <em>ABC*<\/em>. Wzorzec ten mo\u017ce zosta\u0107 dostosowany do indywidualnych potrzeb przed uruchomieniem wyszukiwania.<\/p>\n<h6 data-start=\"1089\" data-end=\"1363\" id=\"textselectionfield\" ><span class=\"ez-toc-section\" id=\"TextSelectionField\"><\/span>TextSelectionField<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"1089\" data-end=\"1363\"><em data-start=\"1405\" data-end=\"1425\">TextSelectionField<\/em> s\u0142u\u017cy jako pole wyboru dla wszystkich tekstowych typ\u00f3w danych.<\/p>\n<p data-start=\"1089\" data-end=\"1363\"><strong>TextSelectionField API<\/strong><\/p>\n<p data-start=\"1521\" data-end=\"1699\">Poni\u017csze tabele przedstawiaj\u0105 najwa\u017cniejsze metody klasy <em data-start=\"1578\" data-end=\"1598\">TextSelectionField<\/em> (pe\u0142na lista oraz szczeg\u00f3\u0142owe opisy znajduj\u0105 si\u0119 w dokumentacji JavaDoc klasy <em data-start=\"1677\" data-end=\"1697\">TextSelectionField<\/em>).<\/p>\n<p data-start=\"1521\" data-end=\"1699\"><strong>Tabela 70: Konstruktory<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Konstruktor<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>TextSelectionField(String, String)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Tworzy obiekt <em data-start=\"146\" data-end=\"166\">TextSelectionField<\/em>.<br \/>\nJako parametry nale\u017cy przekaza\u0107 GUID oraz \u015bcie\u017ck\u0119 (logiczny typ danych).<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"514\" data-end=\"761\"><strong>Tabela 71: Dost\u0119p do danych<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 92px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 46px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 46px;\"><em data-start=\"339\" data-end=\"351\">getValue()<\/em><br \/>\n<em data-start=\"355\" data-end=\"373\">setValue(String)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 46px;\">Odczyt lub zmiana aktualnej warto\u015bci pola.<br \/>\nJak w przypadku wszystkich p\u00f3l, dost\u0119pne s\u0105 r\u00f3wnie\u017c metody dziedziczone z klasy nadrz\u0119dnej <em data-start=\"513\" data-end=\"520\">Field<\/em>: <em data-start=\"522\" data-end=\"542\">getValueAsObject()<\/em> oraz <em data-start=\"548\" data-end=\"570\">setValueFromObject()<\/em>.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>getSelectionString()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Zwraca aktualn\u0105 warto\u015b\u0107 w formacie wymaganym wewn\u0119trznie przez wyszukiwanie.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"514\" data-end=\"761\"><strong>Tabela 72: Wsparcie aplikacyjne<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em data-start=\"777\" data-end=\"797\">getSelectionMode()<\/em><br \/>\n<em data-start=\"801\" data-end=\"828\">setSelectionMode(boolean)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Nie jest obs\u0142ugiwane przez <em data-start=\"858\" data-end=\"878\">TextSelectionField<\/em> (zawsze <em data-start=\"887\" data-end=\"893\">true<\/em>).<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h6 data-start=\"514\" data-end=\"761\" id=\"decimalselectionfield\" ><span class=\"ez-toc-section\" id=\"DecimalSelectionField\"><\/span>DecimalSelectionField<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"38\" data-end=\"129\"><em data-start=\"38\" data-end=\"61\">DecimalSelectionField<\/em> s\u0142u\u017cy jako pole wyboru dla nast\u0119puj\u0105cych numerycznych typ\u00f3w danych:<\/p>\n<ul>\n<li data-start=\"133\" data-end=\"170\"><em data-start=\"133\" data-end=\"168\">com.cisag.pgm.datatype.CisDecimal<\/em><\/li>\n<li data-start=\"173\" data-end=\"204\"><em data-start=\"173\" data-end=\"192\">java.lang.Integer<\/em> lub <em data-start=\"197\" data-end=\"202\">int<\/em><\/li>\n<li data-start=\"207\" data-end=\"236\"><em data-start=\"207\" data-end=\"223\">java.lang.Long<\/em> lub <em data-start=\"228\" data-end=\"234\">long<\/em><\/li>\n<li data-start=\"239\" data-end=\"270\"><em data-start=\"239\" data-end=\"256\">java.lang.Short<\/em> lub <em data-start=\"261\" data-end=\"268\">short<\/em><\/li>\n<li data-start=\"273\" data-end=\"302\"><em data-start=\"273\" data-end=\"289\">java.lang.Byte<\/em> lub <em data-start=\"294\" data-end=\"300\">byte<\/em><\/li>\n<\/ul>\n<h4 data-start=\"304\" data-end=\"336\" id=\"decimalselectionfield-api\" ><span class=\"ez-toc-section\" id=\"DecimalSelectionField_API\"><\/span>DecimalSelectionField API<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"338\" data-end=\"522\">Poni\u017csze tabele przedstawiaj\u0105 najwa\u017cniejsze metody klasy <em data-start=\"395\" data-end=\"418\">DecimalSelectionField<\/em> (pe\u0142na lista oraz szczeg\u00f3\u0142owe opisy znajduj\u0105 si\u0119 w dokumentacji JavaDoc klasy <em data-start=\"497\" data-end=\"520\">DecimalSelectionField<\/em>).<\/p>\n<p data-start=\"338\" data-end=\"522\"><strong>Tabela 73: Konstruktory<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Konstruktor<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>DecimalSelectionField(String, String)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Tworzy obiekt <em data-start=\"149\" data-end=\"172\">DecimalSelectionField<\/em>.<br \/>\nJako parametry nale\u017cy przekaza\u0107 GUID oraz \u015bcie\u017ck\u0119 (logiczny typ danych).<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"514\" data-end=\"761\"><strong>Tabela 74: Dost\u0119p do danych<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 69px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em data-start=\"345\" data-end=\"363\">getStringValue()<\/em><br \/>\n<em data-start=\"367\" data-end=\"391\">setStringValue(String)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Odczyt lub zmiana aktualnej warto\u015bci pola.<br \/>\nPole dostarcza lub oczekuje \u0142a\u0144cuch\u00f3w znak\u00f3w w znormalizowanej postaci (zob. <em data-start=\"517\" data-end=\"568\">com.cisag.pgm.datatype.CisDecimalSelectionUtility<\/em>).<br \/>\nJak w przypadku wszystkich p\u00f3l, dost\u0119pne s\u0105 r\u00f3wnie\u017c metody dziedziczone z klasy nadrz\u0119dnej <em data-start=\"665\" data-end=\"672\">Field<\/em>: <em data-start=\"674\" data-end=\"694\">getValueAsObject()<\/em> oraz <em data-start=\"700\" data-end=\"722\">setValueFromObject()<\/em>.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>getSelectionString()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Zwraca aktualn\u0105 warto\u015b\u0107 w formacie wymaganym wewn\u0119trznie przez wyszukiwanie.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"514\" data-end=\"761\"><strong>Tabela 75: Wsparcie aplikacyjne<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 69px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em data-start=\"929\" data-end=\"949\">getSelectionMode()<\/em><br \/>\n<em data-start=\"953\" data-end=\"980\">setSelectionMode(boolean)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Nie jest obs\u0142ugiwane przez <em data-start=\"1010\" data-end=\"1033\">DecimalSelectionField<\/em> (zawsze <em data-start=\"1042\" data-end=\"1048\">true<\/em>).<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em data-start=\"1055\" data-end=\"1073\">isGroupingUsed()<\/em><br \/>\n<em data-start=\"1077\" data-end=\"1103\">setGroupingUsed(boolean)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Odczyt lub zmiana ustawienia grupowania cyfr.<br \/>\nUstawienie to okre\u015bla, czy cyfry maj\u0105 by\u0107 grupowane za pomoc\u0105 separator\u00f3w (np. kropki). U\u017cywany znak separatora zale\u017cy od indywidualnych ustawie\u0144 u\u017cytkownika.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h6 data-start=\"514\" data-end=\"761\" id=\"cisdateselectionfield\" ><span class=\"ez-toc-section\" id=\"CisDateSelectionField\"><\/span>CisDateSelectionField<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"38\" data-end=\"141\"><em data-start=\"38\" data-end=\"62\">CisDateSelectionField<\/em> s\u0142u\u017cy jako pole wyboru dla wszystkich typ\u00f3w danych opartych na dacie i czasie:<\/p>\n<ul>\n<li data-start=\"145\" data-end=\"179\"><em data-start=\"145\" data-end=\"177\">com.cisag.pgm.datatype.CisDate<\/em><\/li>\n<li data-start=\"182\" data-end=\"200\"><em data-start=\"182\" data-end=\"198\">java.util.Date<\/em><\/li>\n<\/ul>\n<p data-start=\"202\" data-end=\"658\">Podobnie jak <em data-start=\"215\" data-end=\"229\">CisDateField<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"282\" data-end=\"296\">CisDateField<\/em>), r\u00f3wnie\u017c <em data-start=\"307\" data-end=\"330\">CisDateSelectionField<\/em> wymaga jawnej inicjalizacji. Inicjalizacja odbywa si\u0119 poprzez wywo\u0142anie <em data-start=\"403\" data-end=\"415\">setValue()<\/em>. W przypadku jej braku pole nie mo\u017ce przy wywo\u0142aniu <em data-start=\"468\" data-end=\"480\">getValue()<\/em> utworzy\u0107 obiektu <em data-start=\"498\" data-end=\"516\">CisDateSelection<\/em> i zg\u0142asza wyj\u0105tek <em data-start=\"535\" data-end=\"568\">java.lang.IllegalStateException<\/em>. Z tego samego powodu nie jest dozwolone ustawienie warto\u015bci pola bezpo\u015brednio na <em data-start=\"651\" data-end=\"657\">null<\/em>.<\/p>\n<p data-start=\"660\" data-end=\"787\">Za pomoc\u0105 klasy <em data-start=\"676\" data-end=\"724\">com.cisag.pgm.datatype.CisDateSelectionUtility<\/em> mo\u017cna tworzy\u0107 odpowiednie obiekty <em data-start=\"759\" data-end=\"777\">CisDateSelection<\/em>. Metoda <em data-start=\"789\" data-end=\"844\">createUndefinedCisDateSelection(CisCalendar calendar) <\/em>zwraca przyk\u0142adowo obiekt <em data-start=\"874\" data-end=\"892\">CisDateSelection<\/em>, za pomoc\u0105 kt\u00f3rego pole <em data-start=\"917\" data-end=\"940\">CisDateSelectionField<\/em> mo\u017ce zosta\u0107 zainicjalizowane lub ponownie wyczyszczone. Wyb\u00f3r odpowiedniego kalendarza zale\u017cy od danego przypadku u\u017cycia.<\/p>\n<p data-start=\"1064\" data-end=\"1166\">Je\u017celi kalendarz ma odpowiada\u0107 bie\u017c\u0105cemu kontekstowi aplikacji, mo\u017cna go ustali\u0107 w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n<p data-start=\"1064\" data-end=\"1166\"><em>CisCalendar cisCalendar =<\/em><br \/>\n<em>CisEnvironment.getInstance().getContext().<\/em><br \/>\n<em>getCisCalendar();<\/em><\/p>\n<p data-start=\"1064\" data-end=\"1166\">R\u00f3wnie\u017c w zakresie walidacji i komunikat\u00f3w <em data-start=\"1315\" data-end=\"1338\">CisDateSelectionField<\/em> zachowuje si\u0119 tak jak <em data-start=\"1361\" data-end=\"1375\">CisDateField<\/em>. Sprawdzanie wprowadzonych danych musi by\u0107 jawnie realizowane lub inicjowane przez dan\u0105 aplikacj\u0119. Aplikacja mo\u017ce (i powinna) korzysta\u0107 z klasy pomocniczej <em data-start=\"1532\" data-end=\"1573\">com.cisag.pgm.util.RepositoryValidation<\/em>, kt\u00f3ra udost\u0119pnia odpowiednie metody.<\/p>\n<p data-start=\"1064\" data-end=\"1166\"><strong>CisDateSelectionField API<\/strong><\/p>\n<p data-start=\"1651\" data-end=\"1835\">Poni\u017csze tabele przedstawiaj\u0105 najwa\u017cniejsze metody klasy <em data-start=\"1708\" data-end=\"1731\">CisDateSelectionField<\/em> (pe\u0142na lista oraz szczeg\u00f3\u0142owe opisy znajduj\u0105 si\u0119 w dokumentacji JavaDoc klasy <em data-start=\"1810\" data-end=\"1833\">CisDateSelectionField<\/em>).<\/p>\n<p data-start=\"1837\" data-end=\"1860\" data-is-last-node=\"\" data-is-only-node=\"\"><strong>Tabela 76: Konstruktory<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Konstruktor<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>CisDateSelectionField(String, String)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Tworzy obiekt <em data-start=\"149\" data-end=\"172\">CisDateSelectionField<\/em>.<br \/>\nJako parametry nale\u017cy przekaza\u0107 GUID oraz \u015bcie\u017ck\u0119 (logiczny typ danych).<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"514\" data-end=\"761\"><strong>Tabela 77: Dost\u0119p do danych<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em data-start=\"345\" data-end=\"357\">getValue()<\/em><br \/>\n<em data-start=\"361\" data-end=\"389\">setValue(CisDateSelection)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Odczyt lub zmiana aktualnej warto\u015bci pola.<br \/>\nJak w przypadku wszystkich p\u00f3l, dost\u0119pne s\u0105 r\u00f3wnie\u017c metody dziedziczone z klasy nadrz\u0119dnej <em data-start=\"529\" data-end=\"536\">Field<\/em>: <em data-start=\"538\" data-end=\"558\">getValueAsObject()<\/em> oraz <em data-start=\"564\" data-end=\"586\">setValueFromObject()<\/em>.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>getTimeIntervals()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Zwraca aktualn\u0105 warto\u015b\u0107 pola w postaci tablicy obiekt\u00f3w <em data-start=\"671\" data-end=\"688\">CisTimeInterval<\/em>.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>getSelectionString()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Zwraca aktualn\u0105 warto\u015b\u0107 w formacie wymaganym wewn\u0119trznie przez wyszukiwanie.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"514\" data-end=\"761\"><strong>Tabela 78: Wsparcie aplikacyjne<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 185px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 46px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 46px;\"><em data-start=\"895\" data-end=\"915\">getSelectionMode()<\/em><br \/>\n<em data-start=\"919\" data-end=\"946\">setSelectionMode(boolean)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 46px;\">Nie jest obs\u0142ugiwane przez <em data-start=\"976\" data-end=\"999\">CisDateSelectionField<\/em> (zawsze <em data-start=\"1008\" data-end=\"1014\">true<\/em>).<\/td>\n<\/tr>\n<tr style=\"height: 46px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 46px;\"><em data-start=\"1021\" data-end=\"1043\">isTimeZoneEditable()<\/em><br \/>\n<em data-start=\"1047\" data-end=\"1077\">setTimeZoneEditable(boolean)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 46px;\">Okre\u015bla, czy strefa czasowa mo\u017ce by\u0107 zmieniana przez u\u017cytkownika.<\/td>\n<\/tr>\n<tr style=\"height: 70px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 70px;\"><em>setTimeOutputFormatPattern(short)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 70px;\">Za pomoc\u0105 tej metody mo\u017cna okre\u015bli\u0107, czy sekundy lub milisekundy maj\u0105 by\u0107 zawsze wy\u015bwietlane, czy tylko wtedy, gdy s\u0105 r\u00f3\u017cne od 0.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h6 data-start=\"514\" data-end=\"761\" id=\"abstractcisquantityselectionfield\" ><span class=\"ez-toc-section\" id=\"AbstractCisQuantitySelectionField\"><\/span>AbstractCisQuantitySelectionField<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"50\" data-end=\"200\">Klasa <em data-start=\"56\" data-end=\"91\">AbstractCisQuantitySelectionField<\/em> jest klas\u0105 bazow\u0105 dla wszystkich wariant\u00f3w p\u00f3l wyboru typu <em>Quantity<\/em> z pakietu <em data-start=\"172\" data-end=\"199\">com.cisag.app.general.gui<\/em>.<\/p>\n<p data-start=\"202\" data-end=\"234\">Do tej grupy nale\u017c\u0105 przyk\u0142adowo:<\/p>\n<ul>\n<li data-start=\"238\" data-end=\"270\"><em data-start=\"238\" data-end=\"268\">DomesticAmountSelectionField<\/em><\/li>\n<li data-start=\"273\" data-end=\"299\"><em data-start=\"273\" data-end=\"297\">DurationSelectionField<\/em><\/li>\n<li data-start=\"302\" data-end=\"333\"><em data-start=\"302\" data-end=\"331\">ForeignAmountSelectionField<\/em><\/li>\n<li data-start=\"336\" data-end=\"362\"><em data-start=\"336\" data-end=\"360\">QuantitySelectionField<\/em><\/li>\n<\/ul>\n<h5 id=\"validfromuntilfieldsupport\" ><span class=\"ez-toc-section\" id=\"ValidFromUntilFieldSupport\"><\/span>ValidFromUntilFieldSupport<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"410\" data-end=\"611\">Aplikacje pracuj\u0105ce z obiektami biznesowymi zale\u017cnymi od czasu z regu\u0142y wymagaj\u0105 odpowiednich p\u00f3l do wy\u015bwietlania oraz edycji przez u\u017cytkownika pocz\u0105tku (<em>From<\/em>) i ko\u0144ca (<em>Until<\/em>) okresu obowi\u0105zywania.<\/p>\n<p data-start=\"613\" data-end=\"882\">Zasadniczo ka\u017cda aplikacja mo\u017ce w tym celu utworzy\u0107 dwa oddzielne pola <em data-start=\"684\" data-end=\"698\">CisDateField<\/em> oraz odpowiednio je skonfigurowa\u0107 i rozmie\u015bci\u0107. Aby upro\u015bci\u0107 to zadanie oraz zapewni\u0107 jednolity wygl\u0105d i zachowanie, mo\u017cna skorzysta\u0107 z klasy pomocniczej <em data-start=\"853\" data-end=\"881\">ValidFromUntilFieldSupport<\/em>.<\/p>\n<p data-start=\"884\" data-end=\"1037\">Klasa ta nie jest klas\u0105 pochodn\u0105 <em data-start=\"917\" data-end=\"924\">Field<\/em> ani <em data-start=\"929\" data-end=\"944\">VisualElement<\/em>, lecz udost\u0119pnia jedynie metody s\u0142u\u017c\u0105ce do tworzenia odpowiednio skonfigurowanych element\u00f3w.<\/p>\n<p data-start=\"1039\" data-end=\"1095\">Klasa pomocnicza mo\u017ce by\u0107 wykorzystywana na dwa sposoby:<\/p>\n<ul>\n<li data-start=\"1099\" data-end=\"1297\">Za pomoc\u0105 metody <em data-start=\"1116\" data-end=\"1151\">createSingleFieldRepresentation()<\/em> mo\u017cna utworzy\u0107 specjalne pole, kt\u00f3re wewn\u0119trznie wykorzystuje dwa pola <em data-start=\"1223\" data-end=\"1237\">CisDateField<\/em> jako podpola. Pole to mo\u017cna nast\u0119pnie doda\u0107 do kontenera.<\/li>\n<li data-start=\"1300\" data-end=\"1450\">Alternatywnie \u2014 bez wywo\u0142ywania metody <em data-start=\"1339\" data-end=\"1374\">createSingleFieldRepresentation()<\/em> \u2014 podpola mog\u0105 by\u0107 u\u017cywane bezpo\u015brednio i dodawane do kontenera oddzielnie.<\/li>\n<\/ul>\n<h6 id=\"validfromuntilfieldsupport-api\" ><span class=\"ez-toc-section\" id=\"ValidFromUntilFieldSupport_API\"><\/span>ValidFromUntilFieldSupport API<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Poni\u017csze tabele przedstawiaj\u0105 najwa\u017cniejsze metody klasy <em data-start=\"177\" data-end=\"205\">ValidFromUntilFieldSupport<\/em> (pe\u0142na lista oraz szczeg\u00f3\u0142owe opisy znajduj\u0105 si\u0119 w dokumentacji JavaDoc klasy <em data-start=\"284\" data-end=\"312\">ValidFromUntilFieldSupport<\/em>).<\/p>\n<p><strong>Tabela 79: Konstruktory<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Konstruktor<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>ValidFromUntilFieldSupport(String, String, String, String)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Tworzy instancj\u0119 <em data-start=\"494\" data-end=\"522\">ValidFromUntilFieldSupport<\/em>.<br \/>\nDla p\u00f3l <em>From<\/em> i <em>Until<\/em> nale\u017cy przekaza\u0107 po jednym GUID oraz \u015bcie\u017cce.<br \/>\nPrzekazane \u015bcie\u017cki musz\u0105 by\u0107 kompatybilne z logicznymi typami danych wymaganymi przez <em data-start=\"687\" data-end=\"701\">CisDateField<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"754\" data-end=\"768\">CisDateField<\/em>).<br \/>\nKlasa udost\u0119pnia r\u00f3wnie\u017c konstruktor, w kt\u00f3rym podawane s\u0105 wy\u0142\u0105cznie dwa identyfikatory GUID. W takim przypadku implementacja korzysta z og\u00f3lnych logicznych typ\u00f3w danych. U\u017cycie tego konstruktora nie jest zalecane.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"514\" data-end=\"761\"><strong>Tabela 80: Dost\u0119p do danych<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 92px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>getFromDate()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Odczyt aktualnej warto\u015bci <em>From<\/em>. Zwracany jest obiekt <em data-start=\"1161\" data-end=\"1177\">java.util.Date<\/em>.<br \/>\nInformacja o strefie czasowej jest zawsze identyczna jak dla warto\u015bci <em>Until<\/em> i mo\u017ce zosta\u0107 tam odczytana.<br \/>\nAlternatywnie mo\u017cna u\u017cy\u0107 metody <em data-start=\"1324\" data-end=\"1340\">getFromField()<\/em>. Zwr\u00f3cone pole <em data-start=\"1356\" data-end=\"1370\">CisDateField<\/em> umo\u017cliwia np. wywo\u0142anie metody <em data-start=\"1402\" data-end=\"1414\">getValue()<\/em>.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>getUntilDate()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Odczyt aktualnej warto\u015bci <em>Until<\/em>. Zwracany jest obiekt <em data-start=\"1495\" data-end=\"1527\">com.cisag.pgm.datatype.CisDate<\/em>.<br \/>\nZawarta w nim informacja o strefie czasowej obowi\u0105zuje r\u00f3wnie\u017c dla warto\u015bci <em>From<\/em>.<br \/>\nAlternatywnie mo\u017cna u\u017cy\u0107 metody <em data-start=\"1651\" data-end=\"1668\">getUntilField()<\/em>. Zwr\u00f3cone pole <em data-start=\"1684\" data-end=\"1698\">CisDateField<\/em> umo\u017cliwia np. wywo\u0142anie metody <em data-start=\"1730\" data-end=\"1742\">getValue()<\/em>.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>setValue(Date, CisDate)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Jednoczesna zmiana warto\u015bci <em>From<\/em> i <em>Until<\/em>.<br \/>\nWarto\u015b\u0107 <em>From<\/em> nale\u017cy przekaza\u0107 jako <em data-start=\"1862\" data-end=\"1878\">java.util.Date<\/em>, a warto\u015b\u0107 <em>Until<\/em> jako <em data-start=\"1903\" data-end=\"1935\">com.cisag.pgm.datatype.CisDate<\/em>.<br \/>\nInformacja o strefie czasowej zawarta w warto\u015bci <em>Until<\/em> obowi\u0105zuje dla obu warto\u015bci.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"514\" data-end=\"761\"><strong>Tabela 81: Wsparcie aplikacyjne<\/strong><\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 92px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Metoda<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>createSingleFieldRepresentation(String, String)<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Tworzy zewn\u0119trzne pole, kt\u00f3re wewn\u0119trznie zawiera dwa podpola dla <em>From<\/em> i <em>Until<\/em>.<br \/>\nParametry GUID i \u015bcie\u017cki odnosz\u0105 si\u0119 do pola zewn\u0119trznego (parametry dla p\u00f3l wewn\u0119trznych s\u0105 przekazywane ju\u017c w konstruktorze <em data-start=\"2392\" data-end=\"2420\">ValidFromUntilFieldSupport<\/em>).<br \/>\nUtworzone pole mo\u017cna doda\u0107 do kontenera jak ka\u017cde inne pole. Do dost\u0119pu do danych nale\u017cy jednak u\u017cywa\u0107 metod klasy <em data-start=\"2541\" data-end=\"2569\">ValidFromUntilFieldSupport<\/em>.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em data-start=\"2575\" data-end=\"2591\">getFromField()<\/em><br \/>\n<em data-start=\"2595\" data-end=\"2612\">getUntilField()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Dost\u0119p do wewn\u0119trznie u\u017cywanych p\u00f3l (<em data-start=\"2652\" data-end=\"2666\">CisDateField<\/em>).<br \/>\nBezpo\u015bredni dost\u0119p do tych p\u00f3l jest wymagany np. w celu zarejestrowania w\u0142a\u015bciwych <em data-start=\"2755\" data-end=\"2768\">Message-IDs<\/em> dla danego podpola.<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>getSingleRepresentation()<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Zwraca zewn\u0119trzne pole. Warunkiem jest wcze\u015bniejsze jego utworzenie przy u\u017cyciu <em data-start=\"2905\" data-end=\"2940\">createSingleFieldRepresentation()<\/em>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h5 data-start=\"514\" data-end=\"761\" id=\"validfromfieldsupport\" ><span class=\"ez-toc-section\" id=\"ValidFromFieldSupport\"><\/span>ValidFromFieldSupport<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"2986\" data-end=\"3162\">Aplikacje pracuj\u0105ce z obiektami biznesowymi zale\u017cnymi od czasu (wersjonowanymi) zazwyczaj wymagaj\u0105 odpowiednich element\u00f3w umo\u017cliwiaj\u0105cych u\u017cytkownikowi wyb\u00f3r okre\u015blonej wersji.<\/p>\n<p data-start=\"3164\" data-end=\"3413\">Zasadniczo ka\u017cda aplikacja mo\u017ce samodzielnie utworzy\u0107, odpowiednio skonfigurowa\u0107 i rozmie\u015bci\u0107 wymagane elementy. Aby upro\u015bci\u0107 to zadanie oraz zapewni\u0107 jednolity wygl\u0105d i zachowanie, zaleca si\u0119 jednak u\u017cycie klasy pomocniczej <em data-start=\"3389\" data-end=\"3412\">ValidFromFieldSupport<\/em>.<\/p>\n<p data-start=\"3415\" data-end=\"3603\">Podobnie jak klasa <em data-start=\"3434\" data-end=\"3462\">ValidFromUntilFieldSupport<\/em>, klasa ta nie jest pochodn\u0105 <em data-start=\"3491\" data-end=\"3498\">Field<\/em> ani <em data-start=\"3503\" data-end=\"3518\">VisualElement<\/em>, lecz udost\u0119pnia metody s\u0142u\u017c\u0105ce do tworzenia odpowiednio skonfigurowanych element\u00f3w.<\/p>\n<p data-start=\"3605\" data-end=\"3724\">Za pomoc\u0105 metody <em data-start=\"3622\" data-end=\"3637\">createField()<\/em> mo\u017cna utworzy\u0107 specjalne pole, kt\u00f3re wewn\u0119trznie sk\u0142ada si\u0119 z nast\u0119puj\u0105cych element\u00f3w:<\/p>\n<ul>\n<li data-start=\"3728\" data-end=\"3860\">pola <em data-start=\"3733\" data-end=\"3747\">CisDateField<\/em>, wy\u015bwietlaj\u0105cego dat\u0119 pocz\u0105tku obowi\u0105zywania dla danej wersji; data zako\u0144czenia obowi\u0105zywania jest wy\u015bwietlana jako podpowied\u017a (<em>ToolTip<\/em>),<\/li>\n<li data-start=\"3863\" data-end=\"3966\">dw\u00f3ch przycisk\u00f3w, za pomoc\u0105 kt\u00f3rych u\u017cytkownik mo\u017ce przegl\u0105da\u0107 wersje (poprzednia \/ nast\u0119pna wersja).<\/li>\n<\/ul>\n<p data-start=\"31\" data-end=\"168\">Klasa pomocnicza udost\u0119pnia wy\u0142\u0105cznie interfejs u\u017cytkownika; \u0142adowanie lub tworzenie wersji musi zosta\u0107 zaimplementowane przez aplikacj\u0119.<\/p>\n<p data-start=\"170\" data-end=\"657\">Konstruktor <em data-start=\"182\" data-end=\"247\">ValidFromFieldSupport(String guid, String path, ActionListener)<\/em> umo\u017cliwia zarejestrowanie obiektu <em data-start=\"282\" data-end=\"298\">ActionListener<\/em>. Ten <em data-start=\"304\" data-end=\"320\">ActionListener<\/em> jest powiadamiany, gdy u\u017cytkownik aktywuje jeden z przycisk\u00f3w. Na podstawie identyfikatora akcji przekazanego w metodzie <em data-start=\"442\" data-end=\"459\">performAction()<\/em> listener mo\u017ce rozpozna\u0107, kt\u00f3ry przycisk zosta\u0142 wybrany przez u\u017cytkownika. Dla tych identyfikator\u00f3w zdefiniowano sta\u0142e <em data-start=\"578\" data-end=\"614\">ValidFromFieldSupport.NEXT_VERSION<\/em> oraz <em data-start=\"620\" data-end=\"656\">ValidFromFieldSupport.PREV_VERSION<\/em>.<\/p>\n<p data-start=\"659\" data-end=\"999\">Za pomoc\u0105 metody <em data-start=\"678\" data-end=\"722\">setValue(com.cisag.pgm.datatype.CisObject) <\/em>klasie pomocniczej mo\u017cna przypisa\u0107 instancj\u0119 czasowo zale\u017cnego obiektu biznesowego. Moment rozpocz\u0119cia obowi\u0105zywania (<em data-start=\"828\" data-end=\"854\">CisObject#getValidFrom()<\/em>) tego obiektu jest przenoszony do pola daty, natomiast moment zako\u0144czenia obowi\u0105zywania (<em data-start=\"929\" data-end=\"956\">CisObject#getValidUntil()<\/em>) jest ustawiany jako podpowied\u017a (<em>ToolTip<\/em>).<\/p>\n<p data-start=\"1001\" data-end=\"1147\">Dwa przyciski utworzonego pola s\u0105 ustawiane jako aktywne (<em data-start=\"1059\" data-end=\"1068\">enabled<\/em>) lub nieaktywne (<em data-start=\"1086\" data-end=\"1096\">disabled<\/em>) w zale\u017cno\u015bci od warto\u015bci daty rozpocz\u0119cia obowi\u0105zywania i daty zako\u0144czenia obowi\u0105zywania.<\/p>\n<h4 data-start=\"1001\" data-end=\"1147\" id=\"listy-i-tabele\" ><span class=\"ez-toc-section\" id=\"Listy_i_tabele-2\"><\/span>Listy i tabele<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"1177\" data-end=\"1219\">Do obs\u0142ugi list i tabel dost\u0119pne s\u0105 klasy:<\/p>\n<ul>\n<li data-start=\"1223\" data-end=\"1249\"><em data-start=\"1223\" data-end=\"1247\">com.cisag.pgm.gui.List<\/em><\/li>\n<li data-start=\"1252\" data-end=\"1279\"><em data-start=\"1252\" data-end=\"1277\">com.cisag.pgm.gui.Table<\/em><\/li>\n<\/ul>\n<p data-start=\"1281\" data-end=\"1355\">(wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"1332\" data-end=\"1353\">Listy i tabele<\/em>).<\/p>\n<p data-start=\"1357\" data-end=\"1515\">Mi\u0119dzy tymi klasami wyst\u0119puj\u0105 zasadnicze r\u00f3\u017cnice dotycz\u0105ce definiowania kolumn oraz budowy wierszy, istnieje jednak r\u00f3wnie\u017c szereg cech wsp\u00f3lnych, takich jak:<\/p>\n<ul>\n<li data-start=\"1519\" data-end=\"1608\">podzia\u0142 na obszar nag\u0142\u00f3wka (<em>Header<\/em>), obszar danych (<em>Body<\/em>) oraz obszar stopki (<em>Footer<\/em>),<\/li>\n<li data-start=\"1611\" data-end=\"1637\">budowa obszaru nag\u0142\u00f3wka,<\/li>\n<li data-start=\"1640\" data-end=\"1691\">wykorzystanie modelu stronicowania (<em data-start=\"1676\" data-end=\"1687\">PageModel<\/em>),<\/li>\n<li data-start=\"1694\" data-end=\"1786\">reprezentacja rekord\u00f3w danych przez instancje <em data-start=\"1740\" data-end=\"1783\">com.cisag.pgm.base.obj.CisListPartMutable<\/em>,<\/li>\n<li data-start=\"1789\" data-end=\"1809\">selekcja rekord\u00f3w,<\/li>\n<li data-start=\"1812\" data-end=\"1842\">eksport danych do pliku CSV.<\/li>\n<\/ul>\n<p data-start=\"1844\" data-end=\"2103\">Wsp\u00f3lne w\u0142a\u015bciwo\u015bci (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"1915\" data-end=\"1941\">Cechy wsp\u00f3lne<\/em>) s\u0105 zaimplementowane w klasie <em data-start=\"1972\" data-end=\"1978\">List<\/em>. Klasa <em data-start=\"1986\" data-end=\"1993\">Table<\/em> rozszerza <em data-start=\"2004\" data-end=\"2010\">List<\/em> o specyficzne w\u0142a\u015bciwo\u015bci tabel (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"2094\" data-end=\"2101\">Table<\/em>).<\/p>\n<p data-start=\"2105\" data-end=\"2262\">Istniej\u0105 r\u00f3wnie\u017c pewne w\u0142a\u015bciwo\u015bci zdefiniowane w klasie <em data-start=\"2162\" data-end=\"2168\">List<\/em>, kt\u00f3re nie s\u0105 dost\u0119pne w tabelach (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"2254\" data-end=\"2260\">List<\/em>).<\/p>\n<h5 data-start=\"2105\" data-end=\"2262\" id=\"wspolne-wlasciwosci\" ><span class=\"ez-toc-section\" id=\"Wspolne_wlasciwosci\"><\/span>Wsp\u00f3lne w\u0142a\u015bciwo\u015bci<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"2300\" data-end=\"2358\">Listy i tabele sk\u0142adaj\u0105 si\u0119 maksymalnie z trzech obszar\u00f3w:<\/p>\n<ul>\n<li data-start=\"2362\" data-end=\"2389\">obszar nag\u0142\u00f3wka (<em>Header<\/em>),<\/li>\n<li data-start=\"2392\" data-end=\"2415\">obszar danych (<em>Body<\/em>),<\/li>\n<li data-start=\"2418\" data-end=\"2444\">obszar stopki (<em>Footer<\/em>).<\/li>\n<\/ul>\n<h6 data-start=\"514\" data-end=\"761\" id=\"obszar-naglowka\" ><span class=\"ez-toc-section\" id=\"Obszar_naglowka\"><\/span>Obszar nag\u0142\u00f3wka<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"69\" data-end=\"215\">W obszarze nag\u0142\u00f3wka list i tabel znajduje si\u0119 u g\u00f3ry pasek narz\u0119dzi (<em data-start=\"138\" data-end=\"165\">com.cisag.pgm.gui.Coolbar<\/em>), a poni\u017cej nag\u0142\u00f3wki kolumn wy\u015bwietlanych danych.<\/p>\n<p data-start=\"217\" data-end=\"312\">Pasek narz\u0119dzi zawiera szereg element\u00f3w standardowych i mo\u017ce by\u0107 rozszerzany o elementy w\u0142asne.<\/p>\n<p data-start=\"314\" data-end=\"403\">Za pomoc\u0105 metody <em data-start=\"331\" data-end=\"358\">setHeaderVisible(boolean)<\/em> mo\u017cna sterowa\u0107 widoczno\u015bci\u0105 ca\u0142ego nag\u0142\u00f3wka.<\/p>\n<p data-start=\"405\" data-end=\"520\">Przy u\u017cyciu metod <em data-start=\"423\" data-end=\"443\">addHeaderElement()<\/em> oraz <em data-start=\"449\" data-end=\"468\">addHeaderToggle()<\/em> mo\u017cna dodawa\u0107 do paska narz\u0119dzi dodatkowe elementy.<\/p>\n<p data-start=\"522\" data-end=\"780\">Metoda <em data-start=\"529\" data-end=\"565\">setHeaderExpandable(boolean value)<\/em> umo\u017cliwia skonfigurowanie paska narz\u0119dzi w taki spos\u00f3b, aby przy braku miejsca poszczeg\u00f3lne elementy by\u0142y przenoszone do okna popup. Szczeg\u00f3\u0142owe wyja\u015bnienie tego mechanizmu znajduje si\u0119 w rozdziale <em data-start=\"770\" data-end=\"779\">CoolBar<\/em>.<\/p>\n<p data-start=\"782\" data-end=\"937\">Metoda <em data-start=\"789\" data-end=\"824\">addActionListener(ActionListener)<\/em> pozwala na centraln\u0105 rejestracj\u0119 obiektu <em data-start=\"866\" data-end=\"882\">ActionListener<\/em> dla wszystkich element\u00f3w nale\u017c\u0105cych do paska narz\u0119dzi.<\/p>\n<p data-start=\"939\" data-end=\"954\"><strong>PageButton<\/strong><\/p>\n<p data-start=\"956\" data-end=\"1095\">Do standardowego paska narz\u0119dzi list i tabel nale\u017cy przycisk PageButton (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"1081\" data-end=\"1093\">PageButton<\/em>).<\/p>\n<p data-start=\"1097\" data-end=\"1201\">Widoczno\u015bci\u0105 przycisku<em> PageButton<\/em> mo\u017cna sterowa\u0107 za pomoc\u0105 metody <em data-start=\"1163\" data-end=\"1200\">setPageButtonVisible(boolean value)<\/em>.<\/p>\n<p data-start=\"1203\" data-end=\"1491\">Metoda <em data-start=\"1210\" data-end=\"1249\">setPageButtonListener(ActionListener)<\/em> umo\u017cliwia reagowanie na zdarzenia (<em>Actions<\/em>) generowane przez <em>PageButton<\/em>. W takim przypadku zarejestrowany <em data-start=\"1356\" data-end=\"1372\">ActionListener<\/em> musi przej\u0105\u0107 obs\u0142ug\u0119 przechodzenia do nast\u0119pnej lub poprzedniej strony, tj. sterowanie modelem danych i modelem stron.<\/p>\n<h6 data-start=\"1203\" data-end=\"1491\" id=\"obszar-danych\" ><span class=\"ez-toc-section\" id=\"Obszar_danych\"><\/span>Obszar danych<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"1525\" data-end=\"1674\">W obszarze danych (<em>Body<\/em>) rekordy modelu danych s\u0105 wy\u015bwietlane strona po stronie (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"1658\" data-end=\"1672\">Model strony<\/em>).<\/p>\n<p data-start=\"1676\" data-end=\"1693\"><strong>Model danych<\/strong><\/p>\n<p data-start=\"1695\" data-end=\"1907\">Model danych list i tabel bazuje \u2014 jak opisano w rozdziale <em>Listy i tabele<\/em>\u00a0\u2014 na li\u015bcie rekord\u00f3w, przy czym ka\u017cdy rekord jest reprezentowany przez instancj\u0119 <em data-start=\"1863\" data-end=\"1906\">com.cisag.pgm.base.obj.CisListPartMutable<\/em>.<\/p>\n<p data-start=\"1909\" data-end=\"2208\">Obiekt ten pe\u0142ni funkcj\u0119 og\u00f3lnego kontenera danych. W\u0142a\u015bciwo\u015b\u0107 <em data-start=\"1974\" data-end=\"1980\">data<\/em> mo\u017ce s\u0142u\u017cy\u0107 do przechowywania referencji do dowolnego obiektu. Pozosta\u0142e w\u0142a\u015bciwo\u015bci <em data-start=\"2066\" data-end=\"2086\">CisListPartMutable<\/em> s\u0142u\u017c\u0105 g\u0142\u00f3wnie do zapisywania informacji o stanie rekordu (np. zmieniony, oznaczony jako usuni\u0119ty, zaznaczony itp.).<\/p>\n<p data-start=\"2210\" data-end=\"2660\">Zazwyczaj model danych zawiera jedynie cz\u0119\u015b\u0107 wszystkich istniej\u0105cych rekord\u00f3w, aby ograniczy\u0107 zu\u017cycie pami\u0119ci operacyjnej oraz czas odpowiedzi (czas \u0142adowania). Przyk\u0142adowo w przypadku wynik\u00f3w wyszukiwania do modelu wczytywane i wy\u015bwietlane s\u0105 pocz\u0105tkowo tylko pierwsze <em>n<\/em> znalezionych rekord\u00f3w. Poprzez przewijanie stron u\u017cytkownik mo\u017ce zainicjowa\u0107 do\u0142adowanie kolejnych rekord\u00f3w (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"2646\" data-end=\"2658\">PageButton<\/em>).<\/p>\n<p data-start=\"2662\" data-end=\"2788\">Dodatkowo za pomoc\u0105 metody <em data-start=\"2689\" data-end=\"2714\">setMaximumVirtualRows()<\/em> mo\u017cna zdefiniowa\u0107 g\u00f3rn\u0105 granic\u0119 liczby rekord\u00f3w mo\u017cliwych do za\u0142adowania.<\/p>\n<p data-start=\"2790\" data-end=\"3112\">Dodawanie rekord\u00f3w odbywa si\u0119 przy u\u017cyciu metod <em data-start=\"2838\" data-end=\"2871\">addRow(CisListPartMutable data)<\/em> oraz <em data-start=\"2877\" data-end=\"2926\">insertRow(int aheadOf, CisListPartMutable data)<\/em>, zmiana (zast\u0105pienie) rekordu \u2014 przy u\u017cyciu <em data-start=\"2971\" data-end=\"3004\">setRow(CisListPartMutable data)<\/em>, a usuwanie \u2014 przy u\u017cyciu <em data-start=\"3031\" data-end=\"3054\">removeRow(int rowIdx)<\/em>. Do usuni\u0119cia wszystkich rekord\u00f3w s\u0142u\u017cy metoda <em data-start=\"3102\" data-end=\"3111\">clear()<\/em>.<\/p>\n<p data-start=\"3114\" data-end=\"3426\">Za pomoc\u0105 metody <em data-start=\"3131\" data-end=\"3164\">setAllRowsLoaded(boolean value)<\/em> mo\u017cna poinformowa\u0107 list\u0119\/tabel\u0119, czy model danych jest kompletny, tzn. czy zawiera wszystkie istniej\u0105ce rekordy, czy te\u017c nie ma ju\u017c kolejnych rekord\u00f3w do za\u0142adowania. Informacja ta jest przekazywana do przycisku PageButton, kt\u00f3ry z kolei informuje u\u017cytkownika.<\/p>\n<p data-start=\"3114\" data-end=\"3426\"><section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">W przypadku list i tabel aktualizacja klienta musi zosta\u0107 wywo\u0142ana jawnie za pomoc\u0105 metody <em data-start=\"3536\" data-end=\"3547\">display()<\/em>. Zasada og\u00f3lna brzmi: po ka\u017cdym dost\u0119pie do listy lub tabeli nale\u017cy na zako\u0144czenie wywo\u0142a\u0107 <em data-start=\"3639\" data-end=\"3650\">display()<\/em>, aby model by\u0142 sp\u00f3jny i wszystkie zmiany zosta\u0142y odzwierciedlone po stronie klienta.<\/div><\/section><\/p>\n<p data-start=\"3742\" data-end=\"3755\"><strong>Selekcja<\/strong><\/p>\n<p data-start=\"3757\" data-end=\"3956\">Listy i tabele umo\u017cliwiaj\u0105 u\u017cytkownikowi zaznaczanie rekord\u00f3w. Za pomoc\u0105 metody <em data-start=\"3839\" data-end=\"3859\">setSelectionMode()<\/em> mo\u017cna okre\u015bli\u0107, czy zaznaczony mo\u017ce by\u0107 tylko jeden rekord, czy te\u017c wiele rekord\u00f3w jednocze\u015bnie.<\/p>\n<p data-start=\"3958\" data-end=\"4158\">Aktualn\u0105 selekcj\u0119 mo\u017cna odczyta\u0107 za pomoc\u0105 metod <em data-start=\"4007\" data-end=\"4025\">getSelectedRow()<\/em>, <em data-start=\"4027\" data-end=\"4049\">getSelectedRowList()<\/em> oraz <em data-start=\"4055\" data-end=\"4074\">getSelectedRows()<\/em>, a zmieni\u0107 przy u\u017cyciu metod <em data-start=\"4104\" data-end=\"4132\">setRowSelected(int rowIdx)<\/em> oraz <em data-start=\"4138\" data-end=\"4157\">clearSelections()<\/em>.<\/p>\n<p data-start=\"4160\" data-end=\"4386\">W ustawieniu standardowym selekcja mo\u017ce obejmowa\u0107 wy\u0142\u0105cznie rekordy z bie\u017c\u0105cej strony, tzn. przy ka\u017cdej zmianie strony poprzednia selekcja jest tracona. Ustawienie to mo\u017cna zmieni\u0107 za pomoc\u0105 metody <em data-start=\"4358\" data-end=\"4385\">setPageSelectionEnabled()<\/em>.<\/p>\n<p data-start=\"4160\" data-end=\"4386\"><section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">W listach przy selekcji wielokrotnej cz\u0119sto stosuje si\u0119 inne rozwi\u0105zanie \u2014 w ka\u017cdej linii umieszczany jest dodatkowy <em>CheckBox<\/em>.<\/div><\/section><\/p>\n<p data-start=\"4533\" data-end=\"4822\">Opr\u00f3cz zaznaczania wierszy obs\u0142ugiwana jest r\u00f3wnie\u017c tzw. <em>OpenAction<\/em>. Akcja zarejestrowana przy u\u017cyciu <em data-start=\"4637\" data-end=\"4662\">setOpenAction(Action a)<\/em> jest wywo\u0142ywana, gdy u\u017cytkownik otworzy wiersz za pomoc\u0105 klawisza [<strong>ENTER<\/strong>] lub \u2014 w zale\u017cno\u015bci od ustawie\u0144 u\u017cytkownika \u2014 pojedynczego albo podw\u00f3jnego klikni\u0119cia.<\/p>\n<p data-start=\"4829\" data-end=\"4848\"><strong>Layout<\/strong><\/p>\n<p data-start=\"4850\" data-end=\"5005\">Za pomoc\u0105 metod <em data-start=\"4866\" data-end=\"4888\">setVisibleRowCount()<\/em> oraz <em data-start=\"4894\" data-end=\"4922\">setPreferredHeightPolicy()<\/em> mo\u017cna okre\u015bli\u0107, ile miejsca lista\/tabela powinna zajmowa\u0107 w nadrz\u0119dnym kontenerze.<\/p>\n<h6 data-start=\"4850\" data-end=\"5005\" id=\"model-stron\" ><span class=\"ez-toc-section\" id=\"Model_stron\"><\/span>Model stron<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<article class=\"text-token-text-primary w-full focus:outline-none [--shadow-height:45px] has-data-writing-block:pointer-events-none has-data-writing-block:-mt-(--shadow-height) has-data-writing-block:pt-(--shadow-height) [&amp;:has([data-writing-block])&gt;*]:pointer-events-auto scroll-mt-(--header-height)\" dir=\"auto\" tabindex=\"-1\" data-turn-id=\"7a83014d-12ea-4580-a5db-81dc275cc1f6\" data-testid=\"conversation-turn-51\" data-scroll-anchor=\"false\" data-turn=\"user\"><\/article>\n<article class=\"text-token-text-primary w-full focus:outline-none [--shadow-height:45px] has-data-writing-block:pointer-events-none has-data-writing-block:-mt-(--shadow-height) has-data-writing-block:pt-(--shadow-height) [&amp;:has([data-writing-block])&gt;*]:pointer-events-auto scroll-mt-[calc(var(--header-height)+min(200px,max(70px,20svh)))]\" dir=\"auto\" tabindex=\"-1\" data-turn-id=\"request-WEB:f8eba8b4-a29c-4f9e-ac07-3e6f89e952fe-25\" data-testid=\"conversation-turn-52\" data-scroll-anchor=\"true\" data-turn=\"assistant\">\n<div class=\"text-base my-auto mx-auto pb-10 [--thread-content-margin:--spacing(4)] @w-sm\/main:[--thread-content-margin:--spacing(6)] @w-lg\/main:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)\">\n<div class=\"[--thread-content-max-width:40rem] @w-lg\/main:[--thread-content-max-width:48rem] mx-auto max-w-(--thread-content-max-width) flex-1 group\/turn-messages focus-visible:outline-hidden relative flex w-full min-w-0 flex-col agent-turn\" tabindex=\"-1\">\n<div class=\"flex max-w-full flex-col grow\">\n<div class=\"min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&amp;]:mt-1\" dir=\"auto\" data-message-author-role=\"assistant\" data-message-id=\"3195f347-574a-4e7c-b382-d665c98b76bf\" data-message-model-slug=\"gpt-5-2\">\n<div class=\"flex w-full flex-col gap-1 empty:hidden first:pt-[1px]\">\n<div class=\"markdown prose dark:prose-invert w-full wrap-break-word dark markdown-new-styling\">\n<p data-start=\"0\" data-end=\"147\">Wy\u015bwietlanie rekord\u00f3w odbywa si\u0119 strona po stronie, tzn. spo\u015br\u00f3d <em>n<\/em> (za\u0142adowanych) rekord\u00f3w na kliencie prezentowanych jest ka\u017cdorazowo tylko <em>m<\/em>.<\/p>\n<p data-start=\"149\" data-end=\"295\">Poprzez przewijanie stron (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"228\" data-end=\"240\">PageButton<\/em>) wy\u015bwietlane s\u0105 nast\u0119pne lub poprzednie <em>m<\/em> rekord\u00f3w.<\/p>\n<p data-start=\"297\" data-end=\"620\">Warto\u015b\u0107 <em>m<\/em> okre\u015blana jest jako <em>Page-Size<\/em> i mo\u017ce zosta\u0107 zdefiniowana w konstruktorze list i tabel lub za pomoc\u0105 metody <em data-start=\"418\" data-end=\"442\">setPageSize(int value)<\/em>. Optymalnie warto\u015b\u0107 ta powinna by\u0107 dobrana tak, aby lista lub tabela w pe\u0142ni wykorzystywa\u0142a dost\u0119pny obszar wy\u015bwietlania, lecz jeszcze bez konieczno\u015bci u\u017cycia paska przewijania.<\/p>\n<p data-start=\"622\" data-end=\"982\">Zaleca si\u0119, o ile to mo\u017cliwe, ca\u0142kowite wy\u0142\u0105czenie przewijania pionowego za pomoc\u0105 metody<br data-start=\"712\" data-end=\"715\" \/><em data-start=\"715\" data-end=\"769\">setVerticalScrollBarPolicy(VERTICAL_SCROLLBAR_NEVER)<\/em>. W takim przypadku optymalna <em>Page-Size<\/em> jest automatycznie obliczana i aktualizowana przez list\u0119\/tabel\u0119. Warto\u015b\u0107 przekazana w konstruktorze ma wtedy znaczenie drugorz\u0119dne, jednak powinna wynosi\u0107 co najmniej 1.<\/p>\n<p data-start=\"984\" data-end=\"1041\">Dodatkowo listy i tabele udost\u0119pniaj\u0105 nast\u0119puj\u0105ce metody:<\/p>\n<ul>\n<li data-start=\"1045\" data-end=\"1081\"><em data-start=\"1045\" data-end=\"1079\">int getCurrentVisibleRowCount();<\/em><\/li>\n<li data-start=\"1084\" data-end=\"1136\"><em data-start=\"1084\" data-end=\"1134\">setCurrentVisibleRowCountChangeAction(Action a);<\/em><\/li>\n<\/ul>\n<p data-start=\"1138\" data-end=\"1255\">Pierwsza metoda zwraca aktualn\u0105 liczb\u0119 widocznych wierszy, kt\u00f3r\u0105 nast\u0119pnie mo\u017cna ustawi\u0107 za pomoc\u0105 <em data-start=\"1237\" data-end=\"1252\">setPageSize()<\/em>.<\/p>\n<p data-start=\"1257\" data-end=\"1591\">Druga metoda umo\u017cliwia zarejestrowanie akcji (<em data-start=\"1303\" data-end=\"1311\">Action<\/em>), kt\u00f3ra jest wywo\u0142ywana zawsze wtedy, gdy zmieni si\u0119 warto\u015b\u0107 <em data-start=\"1373\" data-end=\"1397\">currentVisibleRowCount<\/em>. Za pomoc\u0105 tych dw\u00f3ch metod mo\u017cna r\u00f3wnie\u017c samodzielnie zaimplementowa\u0107 automatyczne dopasowanie <em>Page-Size<\/em>. Obowi\u0105zuje jednak to samo ograniczenie \u2014 wysoko\u015b\u0107 wszystkich wierszy musi by\u0107 sta\u0142a.<\/p>\n<h6 data-start=\"1257\" data-end=\"1591\" id=\"eksport-danych\" ><span class=\"ez-toc-section\" id=\"Eksport_danych\"><\/span>Eksport danych<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"1626\" data-end=\"1768\">Zar\u00f3wno lista, jak i tabela posiadaj\u0105 og\u00f3ln\u0105 implementacj\u0119 eksportu danych. Wszystkie ju\u017c za\u0142adowane rekordy s\u0105 eksportowane jako plik <em>CSV<\/em>.<\/p>\n<p data-start=\"1770\" data-end=\"2007\">Eksport danych opiera si\u0119 bezpo\u015brednio na elementach wizualnych (<em data-start=\"1835\" data-end=\"1851\">VisualElements<\/em>) u\u017cywanych w wierszu. Ka\u017cdy <em data-start=\"1880\" data-end=\"1895\">VisualElement<\/em> okre\u015bla poprzez warto\u015b\u0107 zwracan\u0105 przez metod\u0119 <em data-start=\"1942\" data-end=\"1966\">getDataColumnSupport()<\/em>, w jaki spos\u00f3b ma zosta\u0107 wyeksportowany:<\/p>\n<ul>\n<li data-start=\"2011\" data-end=\"2136\">je\u017celi metoda zwraca <em data-start=\"2032\" data-end=\"2038\">null<\/em>, element jest ignorowany (chyba \u017ce jest kontenerem \u2014 w\u00f3wczas jest przeszukiwany rekurencyjnie),<\/li>\n<li data-start=\"2139\" data-end=\"2207\">poprzez <em>Column-ID<\/em> element wizualny jest przypisywany do kolumny,<\/li>\n<li data-start=\"2210\" data-end=\"2274\">element wizualny mo\u017ce podzieli\u0107 swoje dane na kilka podkolumn,<\/li>\n<li data-start=\"2277\" data-end=\"2338\">dla ka\u017cdej podkolumny mo\u017cna odczyta\u0107 warto\u015b\u0107 oraz nag\u0142\u00f3wek.<\/li>\n<\/ul>\n<p data-start=\"2340\" data-end=\"2615\">Wszystkie klasy pochodne od <em data-start=\"2368\" data-end=\"2393\">com.cisag.pgm.gui.Field<\/em> posiadaj\u0105 odpowiedni\u0105 implementacj\u0119 standardow\u0105. Zwraca ona GUID pola jako <em>Column-ID<\/em>. Pozosta\u0142e w\u0142a\u015bciwo\u015bci zale\u017c\u0105 od konkretnego typu pola. Nag\u0142\u00f3wek (r\u00f3wnie\u017c dla podkolumn) zawsze bazuje na<em> Label<\/em> z <em data-start=\"2597\" data-end=\"2614\">DataDescription<\/em>.<\/p>\n<p data-start=\"2617\" data-end=\"2880\">Podczas tworzenia list lub tabel nale\u017cy zatem zadba\u0107 o to, aby wszystkie u\u017cywane pola posiada\u0142y jednoznaczny GUID oraz sensown\u0105 <em data-start=\"2746\" data-end=\"2763\">DataDescription<\/em>. W przeciwnym razie pola te mog\u0105 nie zosta\u0107 uwzgl\u0119dnione w eksporcie danych lub zosta\u0107 wyeksportowane nieprawid\u0142owo.<\/p>\n<h5 data-start=\"2617\" data-end=\"2880\" id=\"list\" ><span class=\"ez-toc-section\" id=\"List\"><\/span>List<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"0\" data-end=\"54\">Stosowanie list wymaga wykonania nast\u0119puj\u0105cych krok\u00f3w:<\/p>\n<ul>\n<li data-start=\"58\" data-end=\"88\">utworzenie instancji <em data-start=\"79\" data-end=\"85\">List<\/em>,<\/li>\n<li data-start=\"91\" data-end=\"197\">implementacja <em data-start=\"105\" data-end=\"122\">ListViewCreator<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"176\" data-end=\"193\">ListViewCreator<\/em>),<\/li>\n<li data-start=\"200\" data-end=\"310\">implementacja jednego lub kilku <em data-start=\"232\" data-end=\"242\">ListView<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"296\" data-end=\"306\">ListView<\/em>),<\/li>\n<li data-start=\"313\" data-end=\"376\">udost\u0119pnienie jednego lub kilku widok\u00f3w dla nag\u0142\u00f3wk\u00f3w kolumn,<\/li>\n<li data-start=\"379\" data-end=\"427\">zdefiniowanie wsp\u00f3lnych kolumn dla <em data-start=\"414\" data-end=\"424\">ListView<\/em>,<\/li>\n<li data-start=\"430\" data-end=\"478\">(opcjonalnie) udost\u0119pnienie widoku dla stopki,<\/li>\n<li data-start=\"481\" data-end=\"551\">(opcjonalnie) wykorzystanie <em data-start=\"509\" data-end=\"523\">MetaCheckBox<\/em> do selekcji wielokrotnej.<\/li>\n<\/ul>\n<p data-section-id=\"1hlm1on\" data-start=\"558\" data-end=\"576\"><strong>Tworzenie list<\/strong><\/p>\n<p data-start=\"578\" data-end=\"704\">Utworzenie listy odbywa si\u0119 za pomoc\u0105 konstruktora <em data-start=\"631\" data-end=\"703\">List(String guid, int size, boolean editable, ListViewCreator creator)<\/em>.<\/p>\n<p data-start=\"706\" data-end=\"1000\">Parametr <em>guid<\/em> przypisuje li\u015bcie (<em data-start=\"741\" data-end=\"756\">VisualElement<\/em>) identyfikator GUID. Parametr <em>size<\/em> okre\u015bla (pocz\u0105tkow\u0105) wielko\u015b\u0107 strony listy. Parametr <em>editable<\/em> definiuje, czy lista jest list\u0105 edytowaln\u0105, czy tzw. list\u0105 wyj\u015bciow\u0105. Parametr <em>creator<\/em>\u00a0przekazuje li\u015bcie fabryk\u0119 do tworzenia <em data-start=\"989\" data-end=\"999\">ListView<\/em>.<\/p>\n<p data-start=\"1002\" data-end=\"1124\">W razie potrzeby <em data-start=\"1019\" data-end=\"1036\">ListViewCreator<\/em> mo\u017ce zosta\u0107 ustawiony p\u00f3\u017aniej za pomoc\u0105 metody <em data-start=\"1086\" data-end=\"1123\">setListViewCreator(ListViewCreator)<\/em>.<\/p>\n<p data-section-id=\"ajci8k\" data-start=\"1131\" data-end=\"1150\"><strong>Nag\u0142\u00f3wki kolumn<\/strong><\/p>\n<p data-start=\"1152\" data-end=\"1423\">Poniewa\u017c wizualizacja rekord\u00f3w odbywa si\u0119 przez <em data-start=\"1200\" data-end=\"1210\">ListView<\/em>, lista nie mo\u017ce samodzielnie udost\u0119pnia\u0107 odpowiadaj\u0105cych im nag\u0142\u00f3wk\u00f3w kolumn. Udost\u0119pnia jednak miejsce oraz odpowiednie metody umo\u017cliwiaj\u0105ce wstawienie w\u0142asnych widok\u00f3w jako nag\u0142\u00f3wk\u00f3w kolumn w obszarze nag\u0142\u00f3wka.<\/p>\n<p data-start=\"1425\" data-end=\"1523\">Struktura u\u017cywanych <em data-start=\"1445\" data-end=\"1455\">ListView<\/em> powinna zosta\u0107 odwzorowana przez jeden lub kilka wierszy (widok\u00f3w).<\/p>\n<p data-start=\"1525\" data-end=\"1564\">Do dodawania tych widok\u00f3w s\u0142u\u017c\u0105 metody:<\/p>\n<ul>\n<li data-start=\"1568\" data-end=\"1594\"><em data-start=\"1568\" data-end=\"1592\">addTitleBar(View view)<\/em><\/li>\n<li data-start=\"1597\" data-end=\"1639\"><em data-start=\"1597\" data-end=\"1637\">addTitleBar(View view, int styleLevel)<\/em><\/li>\n<\/ul>\n<p data-start=\"1641\" data-end=\"1740\">Parametr <em>styleLevel<\/em> mo\u017ce zosta\u0107 wykorzystany do nadania nag\u0142\u00f3wkom specjalnych atrybut\u00f3w czcionki.<\/p>\n<p data-start=\"1641\" data-end=\"1740\"><section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">Widoki u\u017cywane jako nag\u0142\u00f3wki powinny \u2014 podobnie jak <em data-start=\"1811\" data-end=\"1821\">ListView<\/em> \u2014 wyr\u00f3wnywa\u0107 swoje elementy wzgl\u0119dem linii prowadz\u0105cych listy, tzn. jako mened\u017cera uk\u0142adu nale\u017cy zastosowa\u0107 <em data-start=\"1930\" data-end=\"1946\">StandardLayout<\/em> (pusty konstruktor).<\/div><\/section><\/p>\n<p data-start=\"1969\" data-end=\"2225\">Je\u017celi do listy za pomoc\u0105 <em data-start=\"1995\" data-end=\"2019\">addTitleBar(View view)<\/em> dodano jeden lub kilka nag\u0142\u00f3wk\u00f3w, na pasku narz\u0119dzi listy automatycznie pojawi si\u0119 dodatkowy element steruj\u0105cy. Za pomoc\u0105 tego <em>ToggleButton<\/em> u\u017cytkownik mo\u017ce w\u0142\u0105cza\u0107 i wy\u0142\u0105cza\u0107 widoczno\u015b\u0107 nag\u0142\u00f3wk\u00f3w kolumn.<\/p>\n<p data-section-id=\"12j68rg\" data-start=\"2232\" data-end=\"2253\"><strong>Szeroko\u015bci kolumn<\/strong><\/p>\n<p data-start=\"2255\" data-end=\"2515\">Aby zawarto\u015b\u0107 wierszy (<em data-start=\"2278\" data-end=\"2288\">ListView<\/em>), nag\u0142\u00f3wk\u00f3w oraz stopki by\u0142a wyr\u00f3wnana wzgl\u0119dem wsp\u00f3lnych linii prowadz\u0105cych, linie prowadz\u0105ce (kolumny) powinny by\u0107 definiowane wy\u0142\u0105cznie na poziomie listy (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"2497\" data-end=\"2513\">StandardLayout<\/em>).<\/p>\n<p data-start=\"2517\" data-end=\"2552\">W tym celu lista udost\u0119pnia metody:<\/p>\n<ul>\n<li data-start=\"2556\" data-end=\"2592\"><em data-start=\"2556\" data-end=\"2590\">setColumnWidths(double[] widths)<\/em><\/li>\n<li data-start=\"2595\" data-end=\"2676\"><em data-start=\"2595\" data-end=\"2674\">setColumnWidths(double[] widths, double[] leftMargins, double[] rightMargins)<\/em><\/li>\n<\/ul>\n<p data-start=\"2678\" data-end=\"2867\">Specyfikacja szeroko\u015bci oraz odst\u0119p\u00f3w odbywa si\u0119 analogicznie do metod <em data-start=\"2749\" data-end=\"2762\">setGuides()<\/em> klasy <em data-start=\"2769\" data-end=\"2793\">VisualElementContainer<\/em>, przy czym szeroko\u015b\u0107 etykiety (<em>Label<\/em>) jest tutaj zawsze ustawiana na 0.<\/p>\n<p data-start=\"2678\" data-end=\"2867\"><section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">Aby zdefiniowane linie prowadz\u0105ce listy by\u0142y rzeczywi\u015bcie wykorzystywane do wyr\u00f3wnania nag\u0142\u00f3wk\u00f3w, <em data-start=\"2984\" data-end=\"2994\">ListView<\/em> oraz stopki, w tych elementach nie mog\u0105 by\u0107 definiowane w\u0142asne linie prowadz\u0105ce (kolumny).<\/div><\/section><\/p>\n<p data-section-id=\"povl7v\" data-start=\"3092\" data-end=\"3109\"><strong>Obszar stopki<\/strong><\/p>\n<p data-start=\"3111\" data-end=\"3232\">Analogicznie jak w przypadku nag\u0142\u00f3wk\u00f3w kolumn, lista udost\u0119pnia miejsce oraz metody do stosowania wierszy stopki lub sum.<\/p>\n<p data-start=\"3234\" data-end=\"3394\">Struktura u\u017cywanych <em data-start=\"3254\" data-end=\"3264\">ListView<\/em> mo\u017ce zosta\u0107 odwzorowana przez jeden lub kilka wierszy (widok\u00f3w). Do dodawania tych widok\u00f3w s\u0142u\u017cy metoda <em data-start=\"3369\" data-end=\"3393\">addTotalBar(View view)<\/em>.<\/p>\n<p data-start=\"3396\" data-end=\"3491\">Wiersze stopki s\u0105 zawsze wy\u015bwietlane na dolnej kraw\u0119dzi listy (nie jako ostatni rekord danych).<\/p>\n<p data-section-id=\"1psv91k\" data-start=\"3498\" data-end=\"3514\"><strong>MetaCheckBox<\/strong><\/p>\n<p data-start=\"3516\" data-end=\"3735\"><em data-start=\"3516\" data-end=\"3530\">MetaCheckBox<\/em> jest przeznaczona do zastosowa\u0144, w kt\u00f3rych wyb\u00f3r rekord\u00f3w odbywa si\u0119 za pomoc\u0105 CheckBox\u00f3w (w <em data-start=\"3624\" data-end=\"3634\">ListView<\/em>), a funkcja <em>Zaznacz wszystkie<\/em> ma by\u0107 realizowana przez dodatkow\u0105 <em>CheckBox<\/em> na pasku narz\u0119dzi listy.<\/p>\n<p data-start=\"3737\" data-end=\"3854\"><em data-start=\"3737\" data-end=\"3751\">MetaCheckBox<\/em> dla paska narz\u0119dzi mo\u017cna utworzy\u0107 za pomoc\u0105 metody <em>*createMetaCheckBox(int column, String view)*<\/em>.<\/p>\n<p data-start=\"3856\" data-end=\"3979\">Parametr <em>column<\/em> okre\u015bla pozycj\u0119 (kolumn\u0119) w <em data-start=\"3902\" data-end=\"3912\">ListView<\/em>, parametr <em>view<\/em> nie pe\u0142ni funkcji i powinien mie\u0107 warto\u015b\u0107 <em>null<\/em>.<\/p>\n<p data-start=\"3981\" data-end=\"4195\"><em>CheckBoxy<\/em> dla poszczeg\u00f3lnych <em data-start=\"4010\" data-end=\"4020\">ListView<\/em> musz\u0105 zosta\u0107 utworzone przy u\u017cyciu metody <em data-start=\"4065\" data-end=\"4103\">createDependentCheckBox(String view) <\/em>i r\u0119cznie dodane do danego <em data-start=\"4133\" data-end=\"4143\">ListView<\/em>. Parametr <em>view<\/em> musi odpowiada\u0107 nazwie <em data-start=\"4184\" data-end=\"4194\">ListView<\/em>.<\/p>\n<h6 data-start=\"3981\" data-end=\"4195\" id=\"liststyle\" ><span class=\"ez-toc-section\" id=\"ListStyle\"><\/span>ListStyle<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"25\" data-end=\"161\">Klasa <em data-start=\"31\" data-end=\"60\">com.cisag.pgm.gui.ListStyle<\/em> definiuje r\u00f3\u017cne w\u0142a\u015bciwo\u015bci wizualizacji dla list oraz <em data-start=\"116\" data-end=\"126\">ListView<\/em>. Do tych w\u0142a\u015bciwo\u015bci nale\u017c\u0105 m.in.:<\/p>\n<ul>\n<li data-start=\"165\" data-end=\"177\">kolor t\u0142a,<\/li>\n<li data-start=\"180\" data-end=\"197\">kolor czcionki,<\/li>\n<li data-start=\"200\" data-end=\"232\">kr\u00f3j, styl i rozmiar czcionki,<\/li>\n<li data-start=\"235\" data-end=\"256\">rodzaj obramowania,<\/li>\n<li data-start=\"259\" data-end=\"300\">spos\u00f3b prezentacji zaznaczonych wpis\u00f3w.<\/li>\n<\/ul>\n<p data-start=\"302\" data-end=\"347\">Obecnie zdefiniowane s\u0105 nast\u0119puj\u0105ce warto\u015bci:<\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff; height: 186px;\">\n<tbody>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>ListStyle<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><strong>Zastosowanie<\/strong><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>DIALOG<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Listy dialogowe<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>OUTPUT<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Listy wyj\u015bciowe<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>SEARCH<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Listy wynik\u00f3w wyszukiwania<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>XOUTPUT<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Rozszerzone listy wyj\u015bciowe (<em data-start=\"553\" data-end=\"571\">ExtendedListView<\/em>)<\/td>\n<\/tr>\n<tr style=\"height: 25px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 25px;\"><em>XINPUT<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 25px;\">Rozszerzone listy dialogowe (<em data-start=\"617\" data-end=\"635\">ExtendedListView<\/em>)<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>XINPUT2<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Rozszerzone listy dialogowe (<em data-start=\"617\" data-end=\"635\">ExtendedListView<\/em>) &#8212; drugi poziom<\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\"><em>XINPUT3<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff; height: 23px;\">Rozszerzone listy dialogowe (<em data-start=\"617\" data-end=\"635\">ExtendedListView<\/em>) &#8212; trzeci poziom<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/article>\n<p data-start=\"801\" data-end=\"966\">Zar\u00f3wno lista (<em data-start=\"816\" data-end=\"840\">com.cisag.pgm.gui.List<\/em>), jak i poszczeg\u00f3lne <em data-start=\"862\" data-end=\"872\">ListView<\/em> posiadaj\u0105 w\u0142a\u015bciwo\u015b\u0107 <em>style<\/em>. W przypadku listy w\u0142a\u015bciwo\u015b\u0107 ta jest ustawiana automatycznie:<\/p>\n<ul>\n<li data-start=\"970\" data-end=\"1013\"><em data-start=\"970\" data-end=\"988\">ListStyle.DIALOG<\/em> dla list edytowalnych,<\/li>\n<li data-start=\"1016\" data-end=\"1063\"><em data-start=\"1016\" data-end=\"1034\">ListStyle.OUTPUT<\/em> dla list nieedytowalnych.<\/li>\n<\/ul>\n<p data-start=\"1065\" data-end=\"1136\">Za pomoc\u0105 metody <em data-start=\"1082\" data-end=\"1094\">setStyle()<\/em> mo\u017cna przypisa\u0107 li\u015bcie inny <em data-start=\"1123\" data-end=\"1134\">ListStyle<\/em>.<\/p>\n<p data-start=\"1138\" data-end=\"1342\">W przypadku <em data-start=\"1150\" data-end=\"1160\">ListView<\/em> w\u0142a\u015bciwo\u015b\u0107 <em>style<\/em> mo\u017ce zosta\u0107 ustawiona w konstruktorze lub za pomoc\u0105 metody <em data-start=\"1239\" data-end=\"1251\">setStyle()<\/em>. Je\u017celi nie zostanie ustawiona jawnie, wykorzystywana jest warto\u015b\u0107 zdefiniowana dla listy.<\/p>\n<h6 data-start=\"1138\" data-end=\"1342\" id=\"listviewcreator\" ><span class=\"ez-toc-section\" id=\"ListViewCreator\"><\/span>ListViewCreator<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"1380\" data-end=\"1615\">Obiekty <em data-start=\"1388\" data-end=\"1398\">ListView<\/em> u\u017cywane przez list\u0119 nie s\u0105 tworzone bezpo\u015brednio przez list\u0119, lecz musz\u0105 zosta\u0107 udost\u0119pnione przez aplikacj\u0119. W tym celu aplikacja musi zaimplementowa\u0107 odpowiedni\u0105 fabryk\u0119 i przekaza\u0107 j\u0105 li\u015bcie (np. w konstruktorze).<\/p>\n<p data-start=\"1617\" data-end=\"1728\">Interfejs <em data-start=\"1627\" data-end=\"1662\">com.cisag.pgm.gui.ListViewCreator<\/em> okre\u015bla API, kt\u00f3re musi zosta\u0107 zaimplementowane przez t\u0119 fabryk\u0119:<\/p>\n<p data-start=\"1617\" data-end=\"1728\"><em><span class=\"\u037cv\">public<\/span> <span class=\"\u037c11\">ListView<\/span> <span class=\"\u037c11\">createView<\/span>(<span class=\"\u037c11\">String<\/span> <span class=\"\u037c11\">viewName<\/span>);<\/em><\/p>\n<p data-start=\"1788\" data-end=\"1997\">Lista wywo\u0142uje t\u0119 metod\u0119 zawsze wtedy, gdy do wizualizacji rekordu (reprezentowanego przez instancj\u0119 <em data-start=\"1889\" data-end=\"1932\">com.cisag.pgm.base.obj.CisListPartMutable<\/em>) potrzebuje odpowiedniej instancji <em data-start=\"1968\" data-end=\"1996\">com.cisag.pgm.gui.ListView<\/em>.<\/p>\n<p data-start=\"1999\" data-end=\"2378\">Podczas wywo\u0142ania metody lista przekazuje do fabryki w\u0142a\u015bciwo\u015b\u0107 <em>viewName<\/em> z odpowiadaj\u0105cego rekordu (<em data-start=\"2101\" data-end=\"2121\">CisListPartMutable<\/em>). W razie potrzeby fabryka mo\u017ce na podstawie tego parametru zdecydowa\u0107, w jaki spos\u00f3b utworzy\u0107 lub skonfigurowa\u0107 instancj\u0119 <em data-start=\"2245\" data-end=\"2255\">ListView<\/em>. Wymaga to, aby rekordy dodawane przy u\u017cyciu <em data-start=\"2301\" data-end=\"2311\">addRow()<\/em> lub <em data-start=\"2316\" data-end=\"2329\">insertRow()<\/em> posiada\u0142y odpowiednio skonfigurowane viewName.<\/p>\n<p data-start=\"2380\" data-end=\"2725\">Lista \u017c\u0105da instancji <em data-start=\"2401\" data-end=\"2411\">ListView<\/em> wy\u0142\u0105cznie dla rekord\u00f3w aktualnie wy\u015bwietlanej strony, a nie dla wszystkich za\u0142adowanych rekord\u00f3w modelu. W miar\u0119 mo\u017cliwo\u015bci ju\u017c utworzone instancje s\u0105 ponownie wykorzystywane (<em>recycled<\/em>) dla kolejnych stron, a nie tworzone na nowo. Ponowne u\u017cycie jest jednak mo\u017cliwe wy\u0142\u0105cznie przy identycznej warto\u015bci <em>viewName<\/em>.<\/p>\n<h6 data-start=\"2380\" data-end=\"2725\" id=\"listview\" ><span class=\"ez-toc-section\" id=\"ListView\"><\/span>ListView<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"24\" data-end=\"111\">Abstrakcyjna klasa <em data-start=\"43\" data-end=\"71\">com.cisag.pgm.gui.ListView<\/em> s\u0142u\u017cy do wizualizacji rekord\u00f3w z listy.<\/p>\n<p data-start=\"113\" data-end=\"290\">Lista deleguje wizualizacj\u0119 rekord\u00f3w do tzw. <em data-start=\"158\" data-end=\"168\">ListView<\/em>. Zadaniem tych <em data-start=\"184\" data-end=\"194\">ListView<\/em> jest tworzenie odpowiednich element\u00f3w UI oraz wymiana danych pomi\u0119dzy rekordem a elementami UI.<\/p>\n<p data-start=\"292\" data-end=\"484\"><em data-start=\"292\" data-end=\"302\">ListView<\/em> nie s\u0105 powi\u0105zane z konkretn\u0105 instancj\u0105 rekordu, lecz z okre\u015blonym typem rekordu. Jedna instancja implementacji <em data-start=\"414\" data-end=\"424\">ListView<\/em> mo\u017ce (kolejno) wizualizowa\u0107 r\u00f3\u017cne rekordy tego samego typu.<\/p>\n<p data-start=\"486\" data-end=\"605\">Abstrakcyjny interfejs <em data-start=\"509\" data-end=\"537\">com.cisag.pgm.gui.ListView<\/em> definiuje API, kt\u00f3re musi zosta\u0107 zaimplementowane przez <em data-start=\"594\" data-end=\"604\">ListView<\/em>:<\/p>\n<p data-start=\"486\" data-end=\"605\"><em><span class=\"\u037cv\">abstract<\/span> <span class=\"\u037cv\">void<\/span> <span class=\"\u037c11\">dataToUi<\/span>(<span class=\"\u037c11\">CisListPartMutable<\/span> <span class=\"\u037c11\">row<\/span>);<\/em><br \/>\n<em><span class=\"\u037cv\">void<\/span> <span class=\"\u037c11\">dataFromUi<\/span>(<span class=\"\u037c11\">CisListPartMutable<\/span> <span class=\"\u037c11\">row<\/span>);<\/em><\/p>\n<p data-start=\"486\" data-end=\"605\">Nadpisanie drugiej (pustej) metody nie jest konieczne, je\u017celi lista jest wy\u0142\u0105cznie list\u0105 wyj\u015bciow\u0105, tzn. nie jest wymagane mapowanie wsteczne danych wprowadzonych przez u\u017cytkownika do rekord\u00f3w.<\/p>\n<p data-start=\"911\" data-end=\"928\"><strong><em data-start=\"916\" data-end=\"928\">dataToUi()<\/em><\/strong><\/p>\n<p data-start=\"930\" data-end=\"1144\">Lista wywo\u0142uje metod\u0119 <em data-start=\"952\" data-end=\"962\">dataToUi<\/em> zawsze wtedy, gdy powi\u0105zany rekord ma zosta\u0107 wy\u015bwietlony lub zaktualizowany w wierszu bie\u017c\u0105cej strony. W przypadku wielu rekord\u00f3w wywo\u0142anie nast\u0119puje oddzielnie dla ka\u017cdego wiersza.<\/p>\n<p data-start=\"1146\" data-end=\"1568\">Zadaniem implementacji jest rozdzielenie danych z przekazanej instancji <em data-start=\"1218\" data-end=\"1238\">CisListPartMutable<\/em> na elementy UI <em data-start=\"1254\" data-end=\"1264\">ListView<\/em>. Zakres tych danych zale\u017cy od konkretnej aplikacji. Cz\u0119sto w\u0142a\u015bciwo\u015b\u0107 <em data-start=\"1335\" data-end=\"1341\">data<\/em> obiektu <em data-start=\"1350\" data-end=\"1370\">CisListPartMutable<\/em> jest wykorzystywana do przechowywania referencji do instancji obiektu biznesowego. W takim przypadku warto\u015bci atrybut\u00f3w obiektu biznesowego powinny zosta\u0107 przeniesione do odpowiednich element\u00f3w UI.<\/p>\n<p data-start=\"1570\" data-end=\"1751\">Elementy UI <em data-start=\"1582\" data-end=\"1592\">ListView<\/em> s\u0105 zazwyczaj tworzone podczas jego instancjowania, tzn. w konstruktorze lub przez fabryk\u0119 (<em data-start=\"1684\" data-end=\"1701\">ListViewCreator<\/em>), a nast\u0119pnie dodawane do <em data-start=\"1728\" data-end=\"1738\">ListView<\/em> (kontenera).<\/p>\n<p data-start=\"1758\" data-end=\"1777\"><strong><em data-start=\"1763\" data-end=\"1777\">dataFromUi()<\/em><\/strong><\/p>\n<p data-start=\"1779\" data-end=\"2000\">Lista wywo\u0142uje metod\u0119 <em data-start=\"1801\" data-end=\"1813\">dataFromUi<\/em> zawsze wtedy, gdy dane wprowadzone przez u\u017cytkownika w wierszu maj\u0105 zosta\u0107 zapisane w powi\u0105zanym rekordzie. W przypadku wielu rekord\u00f3w wywo\u0142anie nast\u0119puje oddzielnie dla ka\u017cdego wiersza.<\/p>\n<p data-start=\"2002\" data-end=\"2177\">Zadaniem implementacji jest odczytanie aktualnych danych z element\u00f3w UI i zapisanie ich w przekazanej instancji <em data-start=\"2114\" data-end=\"2134\">CisListPartMutable<\/em>. Jest to funkcja odwrotna do <em data-start=\"2166\" data-end=\"2176\">dataToUi<\/em>.<\/p>\n<p data-section-id=\"pvx1yr\" data-start=\"2184\" data-end=\"2199\"><strong><em data-start=\"2188\" data-end=\"2199\">ListStyle<\/em><\/strong><\/p>\n<p data-start=\"2201\" data-end=\"2473\">Wygl\u0105d (kolory, obramowania itp.) jest okre\u015blany na podstawie przypisanego <em data-start=\"2276\" data-end=\"2287\">ListStyle<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"2341\" data-end=\"2352\">ListStyle<\/em>). Ka\u017cdej instancji <em data-start=\"2372\" data-end=\"2382\">ListView<\/em> mo\u017cna przypisa\u0107 w\u0142asny <em data-start=\"2406\" data-end=\"2417\">ListStyle<\/em>. Zazwyczaj jednak przejmowany jest <em data-start=\"2453\" data-end=\"2464\">ListStyle<\/em> z listy.<\/p>\n<h6 data-start=\"2201\" data-end=\"2473\" id=\"extendedlistview\" ><span class=\"ez-toc-section\" id=\"ExtendedListView\"><\/span>ExtendedListView<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"32\" data-end=\"248\">Klasa <em data-start=\"38\" data-end=\"74\">com.cisag.pgm.gui.ExtendedListView<\/em> rozszerza <em data-start=\"85\" data-end=\"95\">ListView<\/em> o nag\u0142\u00f3wek wiersza (<em>row header<\/em>), wymagany np. w listach dialogowych (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w artykule <em data-start=\"208\" data-end=\"230\">Comarch ERP Enterprise Styleguide<\/em>) lub w listach.<\/p>\n<p data-start=\"250\" data-end=\"427\">Udost\u0119pniane s\u0105 jednak wy\u0142\u0105cznie miejsce, uk\u0142ad oraz odpowiednie metody dost\u0119pu do nag\u0142\u00f3wka wiersza (Header) i obszaru danych. Konkretn\u0105 zawarto\u015b\u0107 musz\u0105 zapewni\u0107 klasy pochodne.<\/p>\n<p data-start=\"429\" data-end=\"641\">Je\u017celi w nag\u0142\u00f3wku wiersza ma by\u0107 wy\u015bwietlany status rekordu (<em data-start=\"490\" data-end=\"510\">CisListPartMutable<\/em>), jako pomoc implementacyjn\u0105 mo\u017cna wykorzysta\u0107 klas\u0119 <em data-start=\"564\" data-end=\"575\">RowHeader<\/em> i doda\u0107 j\u0105 do nag\u0142\u00f3wka za pomoc\u0105 metody <em data-start=\"616\" data-end=\"640\">addHeaderPaneElement()<\/em>.<\/p>\n<h6 data-start=\"429\" data-end=\"641\" id=\"rowheader\" ><span class=\"ez-toc-section\" id=\"RowHeader\"><\/span>RowHeader<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"0\" data-end=\"285\">Klasa <em data-start=\"6\" data-end=\"35\">com.cisag.pgm.gui.RowHeader<\/em> jest u\u017cywana do wizualizacji statusu wy\u015bwietlanego rekordu w nag\u0142\u00f3wku wiersza (<em>row header<\/em>) list i tabel. W przypadku tabel odbywa si\u0119 to automatycznie, natomiast w przypadku list nale\u017cy odpowiednio zaimplementowa\u0107 <em data-start=\"251\" data-end=\"261\">ListView<\/em> lub <em data-start=\"266\" data-end=\"284\">ExtendedListView<\/em>.<\/p>\n<p data-start=\"287\" data-end=\"609\">Klasa <em data-start=\"293\" data-end=\"304\">RowHeader<\/em> rozszerza klas\u0119 <em data-start=\"321\" data-end=\"346\">com.cisag.pgm.gui.Label<\/em> o metod\u0119<br data-start=\"355\" data-end=\"358\" \/><em data-start=\"358\" data-end=\"419\">setRowStatus(com.cisag.pgm.base.obj.CisListPartMutable row)<\/em>. Wywo\u0142anie tej metody powoduje, \u017ce \u2013 w zale\u017cno\u015bci od statusu przekazanego rekordu \u2013 etykieta zostaje opatrzona odpowiednim symbolem (ikon\u0105). Analizowane s\u0105 przy tym nast\u0119puj\u0105ce w\u0142a\u015bciwo\u015bci:<\/p>\n<ul>\n<li data-start=\"613\" data-end=\"642\"><em data-start=\"613\" data-end=\"622\">deleted<\/em><\/li>\n<li data-start=\"645\" data-end=\"677\"><em data-start=\"645\" data-end=\"655\">selected<\/em><\/li>\n<li data-start=\"680\" data-end=\"719\"><em data-start=\"680\" data-end=\"692\">persistent<\/em><\/li>\n<li data-start=\"722\" data-end=\"756\"><em data-start=\"722\" data-end=\"731\">changed<\/em><\/li>\n<\/ul>\n<p>Zazwyczaj klasa <em data-start=\"774\" data-end=\"785\">RowHeader<\/em> jest u\u017cywana w podklasach <em data-start=\"812\" data-end=\"830\">ExtendedListView<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"845\" data-end=\"863\">ExtendedListView<\/em>). Obiekt <em data-start=\"873\" data-end=\"884\">RowHeader<\/em> dodaje si\u0119 do obszaru nag\u0142\u00f3wka <em data-start=\"916\" data-end=\"934\">ExtendedListView<\/em> za pomoc\u0105 metody <em data-start=\"952\" data-end=\"976\">addHeaderPaneElement()<\/em>, a nast\u0119pnie w metodzie <em data-start=\"1001\" data-end=\"1013\">dataToUi()<\/em> wywo\u0142uje si\u0119 metod\u0119 <em data-start=\"1034\" data-end=\"1050\">setRowStatus()<\/em>, aby wizualizowa\u0107 status rekordu za pomoc\u0105 obiektu <em data-start=\"1102\" data-end=\"1113\">RowHeader<\/em>.<\/p>\n<h5 id=\"tabela\" ><span class=\"ez-toc-section\" id=\"Tabela\"><\/span>Tabela<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"1139\" data-end=\"1277\">Klasa <em data-start=\"1145\" data-end=\"1170\">com.cisag.pgm.gui.Table<\/em> jest pochodn\u0105 klasy <em data-start=\"1191\" data-end=\"1215\">com.cisag.pgm.gui.List<\/em> i dziedziczy po niej w szczeg\u00f3lno\u015bci stronicowy model danych.<\/p>\n<p data-start=\"1279\" data-end=\"1320\">U\u017cycie tabel wymaga nast\u0119puj\u0105cych krok\u00f3w:<\/p>\n<ul>\n<li data-start=\"1324\" data-end=\"1354\">utworzenie instancji <em data-start=\"1345\" data-end=\"1352\">Table<\/em><\/li>\n<li data-start=\"1357\" data-end=\"1386\">zdefiniowanie kolumn tabeli<\/li>\n<li data-start=\"1389\" data-end=\"1461\">zaimplementowanie <em data-start=\"1407\" data-end=\"1425\">TableDataManager<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"1440\" data-end=\"1458\">TableDataManager<\/em>)<\/li>\n<\/ul>\n<p><strong>Tworzenie tabel<\/strong><\/p>\n<p data-start=\"1583\" data-end=\"1626\">Tabel\u0119 tworzy si\u0119 za pomoc\u0105 konstruktora:<\/p>\n<p data-start=\"1628\" data-end=\"1702\"><em data-start=\"1628\" data-end=\"1702\">Table(String guid, int size, boolean editable, TableDataManager manager)<\/em><\/p>\n<ol>\n<li data-start=\"1707\" data-end=\"1780\">Parametr <em data-start=\"1716\" data-end=\"1722\">guid<\/em> przypisuje tabeli (<em data-start=\"1742\" data-end=\"1757\">VisualElement<\/em>) identyfikator GUID.<\/li>\n<li data-start=\"1784\" data-end=\"1846\">Parametr <em data-start=\"1793\" data-end=\"1799\">size<\/em> okre\u015bla (pocz\u0105tkowy\u00b2) rozmiar strony tabeli.<\/li>\n<li data-start=\"1850\" data-end=\"1948\">Parametr <em data-start=\"1859\" data-end=\"1869\">editable<\/em> okre\u015bla, czy tabela jest tabel\u0105 edytowaln\u0105, czy wy\u0142\u0105cznie tabel\u0105 wyj\u015bciow\u0105\u00b3.<\/li>\n<li data-start=\"1952\" data-end=\"2140\">Parametr <em data-start=\"1961\" data-end=\"1970\">manager<\/em> przekazuje do tabeli tzw. <em data-start=\"1997\" data-end=\"2015\">TableDataManager<\/em>. W razie potrzeby <em data-start=\"2034\" data-end=\"2052\">TableDataManager<\/em> mo\u017cna r\u00f3wnie\u017c ustawi\u0107 p\u00f3\u017aniej za pomoc\u0105 metody <em data-start=\"2100\" data-end=\"2139\">setTableDataManager(TableDataManager)<\/em>.<\/li>\n<\/ol>\n<p><strong>Definiowanie kolumn tabeli<\/strong><\/p>\n<p data-start=\"2598\" data-end=\"2964\">W przeciwie\u0144stwie do listy, gdzie wizualizacja i mapowanie mi\u0119dzy rekordami a elementami UI s\u0105 w pe\u0142ni delegowane do <em data-start=\"2715\" data-end=\"2725\">ListView<\/em>, w tabeli zastosowano inne podej\u015bcie. Uwzgl\u0119dniono fakt, \u017ce dla wszystkich rekord\u00f3w liczba i typ kolumn s\u0105 identyczne. Dzi\u0119ki temu definicja element\u00f3w UI nie musi by\u0107 wykonywana dla ka\u017cdego wiersza osobno, lecz tylko raz dla ca\u0142ej tabeli.<\/p>\n<p data-start=\"2966\" data-end=\"2992\">Dla ka\u017cdej kolumny nale\u017cy:<\/p>\n<ul>\n<li data-start=\"2996\" data-end=\"3034\">utworzy\u0107 odpowiednie pole (<em data-start=\"3023\" data-end=\"3030\">Field<\/em>),<\/li>\n<li data-start=\"3037\" data-end=\"3056\">skonfigurowa\u0107 je,<\/li>\n<li data-start=\"3059\" data-end=\"3128\">doda\u0107 do tabeli za pomoc\u0105 metody <em data-start=\"3092\" data-end=\"3125\">addColumn(int idx, Field field)<\/em>.<\/li>\n<\/ul>\n<p data-start=\"3130\" data-end=\"3165\">Pola te pe\u0142ni\u0105 nast\u0119puj\u0105ce funkcje:<\/p>\n<ul>\n<li data-start=\"3169\" data-end=\"3268\">na podstawie metadanych pola wyprowadzane s\u0105 nag\u0142\u00f3wek kolumny, <em data-start=\"3232\" data-end=\"3241\">ToolTip<\/em>, pomoc bezpo\u015brednia itd.<\/li>\n<li data-start=\"3271\" data-end=\"3369\">s\u0142u\u017c\u0105 jako prototyp lub fabryka p\u00f3l u\u017cywanych w konkretnych kom\u00f3rkach tabeli (edytor\u00f3w kom\u00f3rek)<\/li>\n<li data-start=\"3372\" data-end=\"3462\">realizuj\u0105 mapowanie mi\u0119dzy rekordem a kom\u00f3rkami tabeli (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"3441\" data-end=\"3459\">TableDataManager<\/em>)<\/li>\n<\/ul>\n<p data-start=\"3576\" data-end=\"3846\">W obszarze nag\u0142\u00f3wka wiersza (<em>row header<\/em>) mo\u017cna w podobny spos\u00f3b doda\u0107 dodatkow\u0105 kolumn\u0119, np. do numerowania wierszy (numery pozycji), za pomoc\u0105 <em>*addRowNumber(Field field)*<\/em>.<br data-start=\"3749\" data-end=\"3752\" \/>Widoczno\u015b\u0107 nag\u0142\u00f3wk\u00f3w wierszy mo\u017cna w\u0142\u0105cza\u0107 i wy\u0142\u0105cza\u0107 metod\u0105 <em data-start=\"3813\" data-end=\"3843\">setRowHeaderVisible(boolean)<\/em>.<\/p>\n<p data-start=\"3848\" data-end=\"3895\">Widoczno\u015b\u0107 kolumn mo\u017cna kontrolowa\u0107 metodami:<\/p>\n<ul>\n<li data-start=\"3898\" data-end=\"3944\"><em data-start=\"3898\" data-end=\"3942\">setColumnVisible(int idx, boolean visible)<\/em><\/li>\n<li data-start=\"3947\" data-end=\"3975\"><em data-start=\"3947\" data-end=\"3973\">isColumnVisible(int idx)<\/em><\/li>\n<\/ul>\n<p><strong>Przewijanie poziome<\/strong><\/p>\n<p data-start=\"4119\" data-end=\"4294\">Domy\u015blnie tabela automatycznie dopasowuje szeroko\u015bci kolumn do dost\u0119pnej \u0142\u0105cznej szeroko\u015bci. W przypadku tabel z du\u017c\u0105 liczb\u0105 kolumn takie podej\u015bcie nie zawsze jest po\u017c\u0105dane.<\/p>\n<p data-start=\"4296\" data-end=\"4606\">Za pomoc\u0105 metody <em data-start=\"4313\" data-end=\"4345\">setHorizontalScrollBarPolicy()<\/em> mo\u017cna skonfigurowa\u0107 tabel\u0119 tak, aby przewijanie odbywa\u0142o si\u0119 kolumnami. W takim przypadku istnieje r\u00f3wnie\u017c mo\u017cliwo\u015b\u0107 zablokowania wybranych kolumn przy lewej kraw\u0119dzi za pomoc\u0105 metod <em data-start=\"4529\" data-end=\"4542\">fixColumn()<\/em> lub <em data-start=\"4547\" data-end=\"4561\">fixColumns()<\/em>, dzi\u0119ki czemu pozostaj\u0105 one zawsze widoczne.<\/p>\n<h6 data-start=\"4296\" data-end=\"4606\" id=\"tabledatamanager\" ><span class=\"ez-toc-section\" id=\"TableDataManager\"><\/span>TableDataManager<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"4643\" data-end=\"4808\">Rekordy w tabeli s\u0105 reprezentowane przez instancje <em data-start=\"4694\" data-end=\"4737\">com.cisag.pgm.base.obj.CisListPartMutable<\/em>, natomiast kolumny tabeli przez instancje <em data-start=\"4780\" data-end=\"4805\">com.cisag.pgm.gui.Field<\/em>.<\/p>\n<p data-start=\"4810\" data-end=\"4983\">Mapowanie rekordu na odpowiednie pola tabela deleguje do tzw. <em data-start=\"4872\" data-end=\"4890\">TableDataManager<\/em>. Musi on zosta\u0107 zaimplementowany w aplikacji i przekazany do tabeli (np. przez konstruktor).<\/p>\n<p data-start=\"4985\" data-end=\"5076\">Interfejs <em data-start=\"4995\" data-end=\"5031\">com.cisag.pgm.gui.TableDataManager<\/em> definiuje API, kt\u00f3re nale\u017cy zaimplementowa\u0107:<\/p>\n<p data-start=\"4985\" data-end=\"5076\"><em><span style=\"color: initial;\">void dataToTable(CisListPartMutable row);<\/span><\/em><\/p>\n<div class=\"relative w-full my-4\">\n<div class=\"\">\n<div class=\"relative\">\n<div class=\"h-full min-h-0 min-w-0\">\n<div class=\"h-full min-h-0 min-w-0\">\n<div class=\"border corner-superellipse\/1.1 border-token-border-light bg-token-bg-elevated-secondary rounded-3xl\">\n<div class=\"pointer-events-none absolute inset-x-4 top-12 bottom-4\">\n<div class=\"pointer-events-none sticky z-40 shrink-0 z-1!\">\n<div class=\"sticky bg-token-border-light\"><em>void dataFromTable(CisListPartMutable row);<\/em><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p data-start=\"4850\" data-end=\"5005\">Implementacja drugiej metody mo\u017ce pozosta\u0107 pusta, je\u015bli tabela jest wy\u0142\u0105cznie tabel\u0105 wyj\u015bciow\u0105 i nie jest wymagane odwrotne mapowanie danych wprowadzonych przez u\u017cytkownika na rekordy.<\/p>\n<p data-start=\"4850\" data-end=\"5005\"><strong>dataToTable()<\/strong><\/p>\n<p data-start=\"5384\" data-end=\"5591\">Tabela wywo\u0142uje metod\u0119 <em data-start=\"5407\" data-end=\"5420\">dataToTable<\/em> zawsze wtedy, gdy rekord ma zosta\u0107 wy\u015bwietlony lub zaktualizowany w wierszu bie\u017c\u0105cej strony. W przypadku wielu rekord\u00f3w metoda jest wywo\u0142ywana osobno dla ka\u017cdego wiersza.<\/p>\n<p data-start=\"5593\" data-end=\"5990\">Zadaniem implementacji jest rozdzielenie danych z przekazanej instancji <em data-start=\"5665\" data-end=\"5685\">CisListPartMutable<\/em> na zdefiniowane kolumny. Zakres tych danych zale\u017cy od konkretnej aplikacji. Cz\u0119sto w\u0142a\u015bciwo\u015b\u0107 <em data-start=\"5780\" data-end=\"5786\">data<\/em> obiektu <em data-start=\"5795\" data-end=\"5815\">CisListPartMutable<\/em> jest u\u017cywana do przechowywania referencji do instancji obiektu biznesowego. W takim przypadku warto\u015bci atrybut\u00f3w obiektu biznesowego s\u0105 przypisywane do zdefiniowanych kolumn.<\/p>\n<p data-start=\"5992\" data-end=\"6185\">Przez zdefiniowane kolumny rozumie si\u0119 pola dodane do tabeli za pomoc\u0105 <em data-start=\"6065\" data-end=\"6098\">addColumn(int idx, Field field)<\/em>. Przekazanie warto\u015bci odbywa si\u0119 poprzez metody odpowiedniego pola (np. <em data-start=\"6171\" data-end=\"6183\">setValue()<\/em>).<\/p>\n<p data-start=\"6187\" data-end=\"6389\">Opr\u00f3cz samej warto\u015bci mo\u017cna r\u00f3wnie\u017c dostosowa\u0107 stan pola (<em data-start=\"6245\" data-end=\"6254\">enabled<\/em>, <em data-start=\"6256\" data-end=\"6266\">editable<\/em> itd.). Warunkiem jest dost\u0119p implementacji <em data-start=\"6310\" data-end=\"6328\">TableDataManager<\/em> do instancji <em data-start=\"6342\" data-end=\"6349\">Field<\/em> zarejestrowanych przez <em data-start=\"6373\" data-end=\"6386\">addColumn()<\/em>.<\/p>\n<p data-start=\"6391\" data-end=\"6569\">Z tego wzgl\u0119du w aplikacjach Semiramis interfejs <em data-start=\"6440\" data-end=\"6458\">TableDataManager<\/em> jest zazwyczaj implementowany bezpo\u015brednio w klasie aplikacji, a pola definiowane s\u0105 jako zmienne instancyjne.<\/p>\n<p data-start=\"6571\" data-end=\"6795\">Po wywo\u0142aniu <em data-start=\"6584\" data-end=\"6597\">dataToTable<\/em> tabela przejmuje warto\u015bci z p\u00f3l do w\u0142a\u015bciwych kom\u00f3rek tabeli. Proces ten powtarza si\u0119 wiersz po wierszu, co oznacza, \u017ce warto\u015bci w polach s\u0105 zawsze wa\u017cne tylko dla aktualnie przetwarzanego wiersza.<\/p>\n<p data-start=\"6571\" data-end=\"6795\"><strong>dataFromTable()<\/strong><\/p>\n<p data-start=\"6824\" data-end=\"7059\">Tabela wywo\u0142uje metod\u0119 <em data-start=\"6847\" data-end=\"6862\">dataFromTable<\/em> zawsze wtedy, gdy warto\u015bci kom\u00f3rek (wprowadzone przez u\u017cytkownika) maj\u0105 zosta\u0107 zapisane w odpowiadaj\u0105cym im rekordzie. W przypadku wielu rekord\u00f3w metoda jest wywo\u0142ywana osobno dla ka\u017cdego wiersza.<\/p>\n<p data-start=\"7061\" data-end=\"7213\">Zadaniem implementacji jest odczytanie aktualnych warto\u015bci p\u00f3l (zdefiniowanych kolumn) i zapisanie ich w przekazanej instancji <em data-start=\"7190\" data-end=\"7210\">CisListPartMutable<\/em>.<\/p>\n<p data-start=\"7215\" data-end=\"7263\">Jest to zatem funkcja odwrotna do <em data-start=\"7249\" data-end=\"7262\">dataToTable<\/em>.<\/p>\n<p data-start=\"7265\" data-end=\"7403\" data-is-last-node=\"\" data-is-only-node=\"\">Tabela automatycznie zapewnia, \u017ce w momencie wywo\u0142ania metody aktualne warto\u015bci kom\u00f3rek danego wiersza znajduj\u0105 si\u0119 w instancjach <em data-start=\"7395\" data-end=\"7402\">Field<\/em>.<\/p>\n<h5 data-start=\"7265\" data-end=\"7403\" id=\"pagebutton\" ><span class=\"ez-toc-section\" id=\"PageButton\"><\/span>PageButton<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"22\" data-end=\"92\">Tak zwany <em data-start=\"32\" data-end=\"44\">PageButton<\/em> wy\u015bwietla u\u017cytkownikowi nast\u0119puj\u0105ce informacje:<\/p>\n<ul>\n<li data-start=\"96\" data-end=\"120\">numer aktualnej strony<\/li>\n<li data-start=\"123\" data-end=\"159\">\u0142\u0105czn\u0105 liczb\u0119 (za\u0142adowanych) stron<\/li>\n<li data-start=\"162\" data-end=\"209\">liczb\u0119 za\u0142adowanych rekord\u00f3w (jako <em data-start=\"197\" data-end=\"206\">ToolTip<\/em>)<\/li>\n<li data-start=\"212\" data-end=\"287\">informacj\u0119 o kolejnych (jeszcze nieza\u0142adowanych) stronach\/rekordach (<em>+<\/em>)<\/li>\n<\/ul>\n<p data-start=\"289\" data-end=\"488\">Za pomoc\u0105 dw\u00f3ch przycisk\u00f3w <em data-start=\"316\" data-end=\"328\">PageButton<\/em> umo\u017cliwia przechodzenie mi\u0119dzy stronami (<em data-start=\"370\" data-end=\"380\">nast\u0119pna<\/em> oraz <em data-start=\"386\" data-end=\"398\">poprzednia<\/em> strona). Wprowadzenie numeru strony pozwala na bezpo\u015brednie przej\u015bcie do wybranej strony.<\/p>\n<p data-start=\"490\" data-end=\"638\"><em data-start=\"490\" data-end=\"502\">PageButton<\/em> jest tworzony automatycznie przez list\u0119 (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"564\" data-end=\"570\">List<\/em>) lub tabel\u0119 (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"604\" data-end=\"611\">Table<\/em>) i wstawiany do nag\u0142\u00f3wka.<\/p>\n<p data-start=\"640\" data-end=\"878\">Metoda <em data-start=\"647\" data-end=\"664\">getPageButton()<\/em> udost\u0119pnia obiekt <em data-start=\"683\" data-end=\"695\">PageButton<\/em> aplikacji. Jest to wymagane np. w przypadku rejestracji <em data-start=\"752\" data-end=\"768\">ActionListener<\/em> za pomoc\u0105 metody <em data-start=\"786\" data-end=\"799\">setLoader()<\/em>, aby w metodzie <em data-start=\"816\" data-end=\"833\">performAction()<\/em> mo\u017cliwe by\u0142o do\u0142adowanie kolejnych rekord\u00f3w.<\/p>\n<p data-start=\"640\" data-end=\"878\">Za pomoc\u0105 metody <em data-start=\"985\" data-end=\"999\">setPage(int)<\/em> mo\u017cna wy\u015bwietli\u0107 okre\u015blon\u0105 stron\u0119. Metoda <em data-start=\"1042\" data-end=\"1053\">getPage()<\/em> zwraca numer aktualnej strony, a <em data-start=\"1087\" data-end=\"1099\">getCount()<\/em> \u2013 \u0142\u0105czn\u0105 liczb\u0119 dost\u0119pnych wierszy.<\/p>\n<h4 data-start=\"640\" data-end=\"878\" id=\"specjalne-kontenery\" ><span class=\"ez-toc-section\" id=\"Specjalne_kontenery\"><\/span>Specjalne kontenery<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<h5 data-start=\"640\" data-end=\"878\" id=\"coolbar\" ><span class=\"ez-toc-section\" id=\"CoolBar\"><\/span>CoolBar<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"1189\" data-end=\"1321\">Klasa <em data-start=\"1195\" data-end=\"1222\">com.cisag.pgm.gui.CoolBar<\/em> s\u0142u\u017cy do wy\u015bwietlania pask\u00f3w narz\u0119dzi, stosowanych np. w oknie aplikacji lub w listach i tabelach.<\/p>\n<p data-start=\"1323\" data-end=\"1642\">Do konstruktora przekazywana jest sta\u0142a typu <em data-start=\"1368\" data-end=\"1373\">int<\/em>, okre\u015blaj\u0105ca typ przycisk\u00f3w, kt\u00f3re maj\u0105 znajdowa\u0107 si\u0119 na pasku narz\u0119dzi. Typ ten (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"1467\" data-end=\"1475\">Button<\/em>) jest u\u017cywany podczas tworzenia nowych przycisk\u00f3w przez <em data-start=\"1532\" data-end=\"1541\">CoolBar<\/em> (na podstawie obiektu <em data-start=\"1564\" data-end=\"1572\">Action<\/em>). Warto\u015bci\u0105 domy\u015bln\u0105 (pusty konstruktor) jest <em data-start=\"1619\" data-end=\"1641\">Button.HEADER_BUTTON<\/em>.<\/p>\n<p data-start=\"1644\" data-end=\"1792\">Konstruktor umo\u017cliwia r\u00f3wnie\u017c rejestracj\u0119 <em data-start=\"1686\" data-end=\"1702\">ActionListener<\/em>, kt\u00f3ry zostanie powiadomiony o wywo\u0142aniu akcji przez jedno z podelement\u00f3w (np. przycisk).<\/p>\n<p data-start=\"1794\" data-end=\"1903\">Pasek <em data-start=\"1800\" data-end=\"1809\">CoolBar<\/em> jest wype\u0142niany przyciskami lub przyciskami prze\u0142\u0105czaj\u0105cymi (<em data-start=\"1871\" data-end=\"1885\">ToggleButton<\/em>) za pomoc\u0105 metod:<\/p>\n<ul>\n<li data-start=\"1907\" data-end=\"1929\"><em data-start=\"1907\" data-end=\"1927\">add(Action action)<\/em><\/li>\n<li data-start=\"1932\" data-end=\"1964\"><em data-start=\"1932\" data-end=\"1962\">add(Action action, int side)<\/em><\/li>\n<li data-start=\"1967\" data-end=\"2005\"><em data-start=\"1967\" data-end=\"2003\">addToggle(Action action, int side)<\/em><\/li>\n<\/ul>\n<p data-start=\"2007\" data-end=\"2098\">Na podstawie przekazanego obiektu <em data-start=\"2041\" data-end=\"2049\">Action<\/em> automatycznie tworzony jest odpowiedni przycisk.<\/p>\n<p data-start=\"2100\" data-end=\"2251\">Bez podania parametru <em data-start=\"2122\" data-end=\"2128\">side<\/em> przyciski s\u0105 wstawiane kolejno od lewej do prawej, przy czym ostatnio dodany element trafia na koniec po prawej stronie.<\/p>\n<p data-start=\"2253\" data-end=\"2460\">Je\u017celi jako parametr zostanie przekazane <em data-start=\"2294\" data-end=\"2309\">CoolBar.RIGHT<\/em>, rozmieszczanie odbywa si\u0119 odwrotnie \u2013 od prawej do lewej. Parametr <em data-start=\"2378\" data-end=\"2401\">CoolBar.RIGHT_TO_LEFT<\/em> powoduje umieszczenie elementu skrajnie po prawej stronie.<\/p>\n<p data-start=\"2462\" data-end=\"2555\">W celu wizualnego podzia\u0142u mo\u017cna wstawi\u0107 separator za pomoc\u0105 metody <em data-start=\"2530\" data-end=\"2554\">addSeparator(int side)<\/em>.<\/p>\n<p data-start=\"2557\" data-end=\"2733\">Dost\u0119pne s\u0105 metody <em data-start=\"2576\" data-end=\"2586\">remove()<\/em>, umo\u017cliwiaj\u0105ce usuni\u0119cie przycisku z paska narz\u0119dzi \u2013 r\u00f3wnie\u017c w tym przypadku przycisk jest identyfikowany przez odpowiadaj\u0105cy mu obiekt <em data-start=\"2724\" data-end=\"2732\">Action<\/em>.<\/p>\n<p data-start=\"2735\" data-end=\"2917\">Klasa <em data-start=\"2741\" data-end=\"2750\">CoolBar<\/em> posiada w\u0142a\u015bciwo\u015b\u0107 <em data-start=\"2770\" data-end=\"2782\">expandable<\/em>, kt\u00f3r\u0105 mo\u017cna zmieni\u0107 metod\u0105 <em data-start=\"2811\" data-end=\"2841\">setExpandable(boolean value)<\/em> oraz odczyta\u0107 metod\u0105 <em data-start=\"2863\" data-end=\"2879\">isExpandable()<\/em>. Domy\u015blnie ustawiona jest na <em data-start=\"2909\" data-end=\"2916\">false<\/em>.<\/p>\n<p data-start=\"2919\" data-end=\"3175\">W\u0142a\u015bciwo\u015b\u0107 <em data-start=\"2930\" data-end=\"2942\">expandable<\/em> oznacza, \u017ce przyciski, kt\u00f3re z powodu braku miejsca nie mog\u0105 zosta\u0107 wy\u015bwietlone na pasku narz\u0119dzi, s\u0105 przenoszone do okna typu popup. Aby otworzy\u0107 to okno, na skrajnym prawym ko\u0144cu paska dodawany jest przycisk z odpowiedni\u0105 ikon\u0105.<\/p>\n<p data-start=\"3177\" data-end=\"3380\"><em data-start=\"3177\" data-end=\"3186\">CoolBar<\/em> samodzielnie zarz\u0105dza tworzeniem i usuwaniem okna popup oraz przycisku, a tak\u017ce automatycznie dostosowuje zawarto\u015b\u0107 okna pop-up, np. przy zmianie rozmiaru okna aplikacji lub d\u0142ugo\u015bci paska narz\u0119dzi.<\/p>\n<h5 data-start=\"3177\" data-end=\"3380\" id=\"buttonbar\" ><span class=\"ez-toc-section\" id=\"ButtonBar\"><\/span>ButtonBar<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"3408\" data-end=\"3572\">Klasa <em data-start=\"3414\" data-end=\"3425\">ButtonBar<\/em> jest wykorzystywana g\u0142\u00f3wnie w dialogach, gdzie w dolnej cz\u0119\u015bci okna udost\u0119pnia przyciski s\u0142u\u017c\u0105ce do zatwierdzania danych, anulowania operacji itp.<\/p>\n<p data-start=\"3574\" data-end=\"3720\">Najprostszym sposobem dodania przycisk\u00f3w jest u\u017cycie ich identyfikator\u00f3w (<em data-start=\"3648\" data-end=\"3653\">int<\/em>). Odpowiednie identyfikatory s\u0105 \u0142\u0105czone operacj\u0105 OR (bitow\u0105), np.: <em data-start=\"3722\" data-end=\"3755\">ButtonBar.OK | ButtonBar.CANCEL <\/em>i przekazywane do konstruktora.<\/p>\n<p data-start=\"3792\" data-end=\"3816\">Dost\u0119pne identyfikatory:<\/p>\n<ul>\n<li data-start=\"3820\" data-end=\"3856\"><em data-start=\"3820\" data-end=\"3834\">ButtonBar.OK<\/em>, <em data-start=\"3836\" data-end=\"3854\">ButtonBar.CANCEL<\/em><\/li>\n<li data-start=\"3859\" data-end=\"3898\"><em data-start=\"3859\" data-end=\"3877\">ButtonBar.ACCEPT<\/em>, <em data-start=\"3879\" data-end=\"3896\">ButtonBar.CLOSE<\/em><\/li>\n<li data-start=\"3901\" data-end=\"3938\"><em data-start=\"3901\" data-end=\"3919\">ButtonBar.UPDATE<\/em>, <em data-start=\"3921\" data-end=\"3936\">ButtonBar.RUN<\/em><\/li>\n<li data-start=\"3941\" data-end=\"3983\"><em data-start=\"3941\" data-end=\"3961\">ButtonBar.VALIDATE<\/em>, <em data-start=\"3963\" data-end=\"3981\">ButtonBar.DELETE<\/em><\/li>\n<li data-start=\"3986\" data-end=\"4004\"><em data-start=\"3986\" data-end=\"4002\">ButtonBar.NONE<\/em><\/li>\n<\/ul>\n<p data-start=\"4006\" data-end=\"4177\">Instancje <em data-start=\"4016\" data-end=\"4024\">Action<\/em> powi\u0105zane z tymi wewn\u0119trznymi implementacjami przycisk\u00f3w mo\u017cna pobra\u0107 za pomoc\u0105 odpowiednich metod <em data-start=\"4124\" data-end=\"4131\">get()<\/em>, np. <em data-start=\"4137\" data-end=\"4152\">getOKButton()<\/em> lub <em data-start=\"4157\" data-end=\"4176\">getCancelButton()<\/em>.<\/p>\n<p data-start=\"4179\" data-end=\"4250\">Klasa oferuje r\u00f3wnie\u017c metody dodawania przycisk\u00f3w w standardowy spos\u00f3b:<\/p>\n<ul>\n<li data-start=\"4254\" data-end=\"4276\"><em data-start=\"4254\" data-end=\"4274\">add(Action action)<\/em><\/li>\n<li data-start=\"4279\" data-end=\"4311\"><em data-start=\"4279\" data-end=\"4309\">add(Action action, int side)<\/em><\/li>\n<li data-start=\"4314\" data-end=\"4341\"><em data-start=\"4314\" data-end=\"4339\">add(Button b, int side)<\/em><\/li>\n<\/ul>\n<p data-start=\"4343\" data-end=\"4508\">Bez podania parametru <em data-start=\"4365\" data-end=\"4371\">side<\/em> nowe elementy s\u0105 zawsze wstawiane po lewej stronie. Aby umie\u015bci\u0107 przycisk po prawej stronie, nale\u017cy przekaza\u0107 warto\u015b\u0107 <em data-start=\"4490\" data-end=\"4507\">ButtonBar.RIGHT<\/em>.<\/p>\n<p data-start=\"4510\" data-end=\"4629\">W konstruktorze mo\u017cna zarejestrowa\u0107 obiekt <em data-start=\"4553\" data-end=\"4569\">ActionListener<\/em>, kt\u00f3ry b\u0119dzie powiadamiany przy ka\u017cdym wywo\u0142aniu przycisku.<\/p>\n<p data-start=\"4631\" data-end=\"4963\">Zdefiniowanie tzw. przycisku domy\u015blnego za pomoc\u0105 <em data-start=\"4681\" data-end=\"4705\">setDefault(int button)<\/em> okre\u015bla, kt\u00f3ry przycisk reaguje na naci\u015bni\u0119cie klawisza [<strong>ENTER<\/strong>]. Jako parametr przekazywany jest identyfikator <em data-start=\"4815\" data-end=\"4823\">Action<\/em>. Wizualnie przycisk domy\u015blny jest oznaczony ciemniejsz\u0105 ramk\u0105. Domy\u015blnie funkcj\u0119 t\u0119 pe\u0142ni przycisk [<strong>OK<\/strong>], je\u017celi znajduje si\u0119 w <em data-start=\"4951\" data-end=\"4962\">ButtonBar<\/em>.<\/p>\n<p data-start=\"4965\" data-end=\"5020\">Metoda <em data-start=\"4972\" data-end=\"4985\">removeAll()<\/em> usuwa wszystkie przyciski z paska.<\/p>\n<p data-start=\"5022\" data-end=\"5141\">W rozdziale <em>Wykorzystanie dialog\u00f3w<\/em> znajduje si\u0119 przyk\u0142ad zastosowania klasy <em data-start=\"5099\" data-end=\"5110\">ButtonBar<\/em> z przyciskami [<strong>OK<\/strong>] i [<strong>Anuluj<\/strong>].<\/p>\n<h5 data-start=\"5022\" data-end=\"5141\" id=\"menu\" ><span class=\"ez-toc-section\" id=\"Menu\"><\/span>Menu<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"0\" data-end=\"153\">Klasa <em data-start=\"6\" data-end=\"30\">com.cisag.pgm.gui.Menu<\/em> s\u0142u\u017cy do tworzenia menu rozwijanych (<em data-start=\"68\" data-end=\"79\">Drop-Down<\/em>), typowo wykorzystywanych w paskach menu (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"142\" data-end=\"151\">MenuBar<\/em>).<\/p>\n<p data-start=\"155\" data-end=\"295\">Menu rozwijane sk\u0142ada si\u0119 z przycisku (tytu\u0142u) oraz okna popup z list\u0105 pozycji menu (<em data-start=\"240\" data-end=\"251\">MenuItems<\/em>), kt\u00f3re otwiera si\u0119 po aktywacji przycisku.<\/p>\n<p data-start=\"297\" data-end=\"728\">Klasa posiada pusty konstruktor oraz konstruktory o sygnaturze <em data-start=\"360\" data-end=\"379\">Menu(String path)<\/em> oraz <em data-start=\"385\" data-end=\"406\">Menu(Action action)<\/em>. Tekst w tytule menu jest pobierany ze wskazanej \u015bcie\u017cki lub z obiektu <em data-start=\"478\" data-end=\"486\">Action<\/em> za pomoc\u0105 <em data-start=\"497\" data-end=\"515\">action.getText()<\/em>. W przypadku przekazania obiektu <em data-start=\"549\" data-end=\"557\">Action<\/em>, teksty <em data-start=\"566\" data-end=\"575\">ToolTip<\/em> oraz pomocy bezpo\u015bredniej s\u0105 r\u00f3wnie\u017c inicjalizowane na podstawie tego obiektu. Metoda <em data-start=\"662\" data-end=\"675\">getAction()<\/em> zwraca obiekt <em data-start=\"690\" data-end=\"698\">Action<\/em> zdefiniowany w konstruktorze.<\/p>\n<p data-start=\"730\" data-end=\"798\">Po utworzeniu instancji obiektu tytu\u0142 mo\u017cna ustawi\u0107 za pomoc\u0105 metod:<\/p>\n<ul>\n<li data-start=\"802\" data-end=\"826\"><em data-start=\"802\" data-end=\"824\">setText(String text)<\/em><\/li>\n<li data-start=\"829\" data-end=\"858\"><em data-start=\"829\" data-end=\"856\">setTitleFrom(String path)<\/em><\/li>\n<li data-start=\"861\" data-end=\"911\"><em data-start=\"861\" data-end=\"909\">setTitleFrom(String path, String[] parameters)<\/em><\/li>\n<\/ul>\n<p data-start=\"913\" data-end=\"979\">Wype\u0142nianie menu popup odbywa si\u0119 za pomoc\u0105 r\u00f3\u017cnych metod <em data-start=\"971\" data-end=\"978\">add()<\/em>.<\/p>\n<p data-start=\"981\" data-end=\"1203\">Metoda <em data-start=\"988\" data-end=\"1008\">add(Action action)<\/em> dodaje pozycj\u0119 zachowuj\u0105c\u0105 si\u0119 jak przycisk, reprezentowan\u0105 przez ikon\u0119 i tekst. Przekazany obiekt <em data-start=\"1108\" data-end=\"1116\">Action<\/em> jest wywo\u0142ywany po wybraniu pozycji (klikni\u0119cie myszy lub naci\u015bni\u0119cie klawisza [<strong>ENTER<\/strong>]). Metoda <em data-start=\"1212\" data-end=\"1244\">addTextMenuItem(Action action)<\/em> dodaje przycisk zawieraj\u0105cy wy\u0142\u0105cznie tekst. Metoda <em data-start=\"1299\" data-end=\"1335\">addCheckBoxMenuItem(Action action)<\/em> umo\u017cliwia dodanie pozycji menu o charakterze pola wyboru (CheckBox). Metoda <em data-start=\"1414\" data-end=\"1430\">addSeparator()<\/em> wstawia poziom\u0105 lini\u0119 oddzielaj\u0105c\u0105.<\/p>\n<p data-start=\"1468\" data-end=\"1552\">Za pomoc\u0105 <em data-start=\"1478\" data-end=\"1512\">insert(int index, Action action)<\/em> mo\u017cna doda\u0107 pozycj\u0119 w wybranym miejscu. Pozycje menu popup mo\u017cna usuwa\u0107 metodami <em data-start=\"1595\" data-end=\"1612\">remove(int pos)<\/em> oraz <em data-start=\"1618\" data-end=\"1631\">removeAll()<\/em>.<\/p>\n<p data-start=\"1634\" data-end=\"1800\" data-is-last-node=\"\" data-is-only-node=\"\">Metoda <em data-start=\"1641\" data-end=\"1658\">getSubactions()<\/em> zwraca list\u0119 wszystkich dodanych obiekt\u00f3w <em data-start=\"1701\" data-end=\"1709\">Action<\/em>. Metoda <em data-start=\"1720\" data-end=\"1740\">getAction(int pos)<\/em> zwraca obiekt <em data-start=\"1755\" data-end=\"1763\">Action<\/em> znajduj\u0105cy si\u0119 na wskazanej pozycji.<\/p>\n<h5 data-start=\"1634\" data-end=\"1800\" id=\"menubar\" ><span class=\"ez-toc-section\" id=\"MenuBar\"><\/span>MenuBar<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"13\" data-end=\"88\">Paski menu mog\u0105 by\u0107 tworzone za pomoc\u0105 klasy <em data-start=\"58\" data-end=\"85\">com.cisag.pgm.gui.MenuBar<\/em>.<\/p>\n<p data-start=\"90\" data-end=\"228\" data-is-last-node=\"\" data-is-only-node=\"\">Typowe aplikacje Comarch ERP Enterprise nie posiadaj\u0105 jednak w\u0142asnego paska menu, poniewa\u017c centralny pasek menu jest udost\u0119pniany przez okno aplikacji.<\/p>\n<p data-start=\"0\" data-end=\"213\">Menu rozwijane dodaje si\u0119 za pomoc\u0105 metody <em data-start=\"43\" data-end=\"63\">addMenu(Menu menu)<\/em>, przy czym ka\u017cde menu jest reprezentowane przez instancj\u0119 <em data-start=\"122\" data-end=\"146\">com.cisag.pgm.gui.Menu<\/em>. Metoda <em data-start=\"155\" data-end=\"167\">getMenus()<\/em> zwraca tablic\u0119 aktualnie zdefiniowanych menu.<\/p>\n<p data-start=\"215\" data-end=\"430\">Za pomoc\u0105 metod <em data-start=\"233\" data-end=\"270\">addActionListener(ActionListener l)<\/em> oraz <em data-start=\"278\" data-end=\"318\">removeActionListener(ActionListener l) <\/em>realizowana jest centralna rejestracja lub wyrejestrowanie <em data-start=\"380\" data-end=\"396\">ActionListener<\/em> jednocze\u015bnie dla wszystkich menu.<\/p>\n<h5 data-start=\"215\" data-end=\"430\" id=\"messagegroupview\" ><span class=\"ez-toc-section\" id=\"MessageGroupView\"><\/span>MessageGroupView<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"465\" data-end=\"591\">Klasa <em data-start=\"471\" data-end=\"507\">com.cisag.pgm.gui.MessageGroupView<\/em> rozszerza klas\u0119 <em data-start=\"524\" data-end=\"548\">com.cisag.pgm.gui.View<\/em> o specjalne wsparcie dla grup komunikat\u00f3w.<\/p>\n<p data-start=\"593\" data-end=\"811\">Klasa ta jest wykorzystywana g\u0142\u00f3wnie w sytuacjach, gdy walidacje nie s\u0105 wykonywane na poziomie ca\u0142ej aplikacji, lecz np. na poziomie poszczeg\u00f3lnych widok\u00f3w. Typowym przyk\u0142adem s\u0105 wiersze list (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"799\" data-end=\"809\">ListView<\/em>).<\/p>\n<h4 data-start=\"593\" data-end=\"811\" id=\"specjalne-elementy\" ><span class=\"ez-toc-section\" id=\"Specjalne_elementy\"><\/span>Specjalne elementy<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<h5 data-start=\"593\" data-end=\"811\" id=\"tree\" ><span class=\"ez-toc-section\" id=\"Tree\"><\/span>Tree<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"861\" data-end=\"936\">Klasa <em data-start=\"867\" data-end=\"891\">com.cisag.pgm.gui.Tree<\/em> s\u0142u\u017cy do wizualizacji struktur drzewiastych.<\/p>\n<p data-start=\"938\" data-end=\"1187\">Na poni\u017cszej ilustracji przedstawiono u\u017cycie klasy <em data-start=\"989\" data-end=\"995\">Tree<\/em> na przyk\u0142adzie katalogu aplikacji Comarch ERP Enterprise. Pokazana struktura jest jednopoziomowa, poniewa\u017c pod w\u0119z\u0142em katalogu znajduj\u0105 si\u0119 wy\u0142\u0105cznie elementy li\u015bciowe, bez kolejnych w\u0119z\u0142\u00f3w podrz\u0119dnych.<\/p>\n<p data-start=\"1189\" data-end=\"1258\" data-is-last-node=\"\" data-is-only-node=\"\">Zasadniczo drzewo umo\u017cliwia tworzenie struktur o dowolnej g\u0142\u0119boko\u015bci.<\/p>\n<p data-start=\"0\" data-end=\"210\">Konstruktor <em data-start=\"12\" data-end=\"127\">Tree(String guid, TreeNode root, Action action, TreeViewCreator creator, EditableTreeViewCreator editableCreator)<\/em> okre\u015bla, jakie obiekty s\u0105 wymagane do utworzenia i inicjalizacji struktury drzewa.<\/p>\n<p data-start=\"212\" data-end=\"598\">Podobnie jak w przypadku wi\u0119kszo\u015bci element\u00f3w, nale\u017cy poda\u0107 identyfikator GUID. Jako element <em data-start=\"305\" data-end=\"311\">root<\/em> nale\u017cy przekaza\u0107 instancj\u0119 <em data-start=\"339\" data-end=\"367\">com.cisag.pgm.gui.TreeNode<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"382\" data-end=\"392\">TreeNode<\/em>), kt\u00f3ra mo\u017ce ju\u017c zawiera\u0107 ca\u0142\u0105 struktur\u0119 drzewa. Na podstawie tego obiektu tworzony jest wewn\u0119trzny model danych drzewa. Je\u017celi nie zostanie przekazany w\u0119ze\u0142 <em data-start=\"551\" data-end=\"557\">root<\/em>, konstruktor utworzy pusty model drzewa.<\/p>\n<p data-start=\"600\" data-end=\"958\">Za pomoc\u0105 parametru <em data-start=\"620\" data-end=\"628\">action<\/em> mo\u017cna zarejestrowa\u0107 instancj\u0119 <em data-start=\"659\" data-end=\"685\">com.cisag.pgm.gui.Action<\/em>, kt\u00f3rej <em data-start=\"694\" data-end=\"710\">ActionListener<\/em> ma zosta\u0107 powiadomiony, gdy u\u017cytkownik aktywuje (otworzy) element. Zdarzenie to, okre\u015blane r\u00f3wnie\u017c jako <em data-start=\"817\" data-end=\"829\">OpenAction<\/em>, mo\u017ce zosta\u0107 wywo\u0142ane klawiszem [<strong>ENTER<\/strong>] lub \u2013 w zale\u017cno\u015bci od ustawie\u0144 u\u017cytkownika \u2013 pojedynczym b\u0105d\u017a podw\u00f3jnym klikni\u0119ciem myszy.<\/p>\n<p data-start=\"960\" data-end=\"1291\">Za pomoc\u0105 parametru <em data-start=\"980\" data-end=\"989\">creator<\/em> mo\u017cna przekaza\u0107 fabryk\u0119 (<em data-start=\"1015\" data-end=\"1050\">com.cisag.pgm.gui.TreeViewCreator<\/em>) s\u0142u\u017c\u0105c\u0105 do tworzenia specjalnie dostosowanych instancji <em data-start=\"1108\" data-end=\"1136\">com.cisag.pgm.gui.TreeView<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"1151\" data-end=\"1161\">TreeView<\/em>). Je\u017celi taka fabryka nie zostanie podana, w\u0119z\u0142y drzewa s\u0105 wizualizowane za pomoc\u0105 generowanych standardowo instancji <em data-start=\"1280\" data-end=\"1290\">TreeView<\/em>.<\/p>\n<p data-start=\"1293\" data-end=\"1607\">Je\u017celi w\u0119z\u0142y drzewa maj\u0105 by\u0107 bezpo\u015brednio edytowalne, nale\u017cy za pomoc\u0105 parametru <em data-start=\"1374\" data-end=\"1391\">editableCreator<\/em> przekaza\u0107 odpowiedni\u0105 fabryk\u0119 (<em data-start=\"1423\" data-end=\"1466\">com.cisag.pgm.gui.EditableTreeViewCreator<\/em>). Jej zadaniem jest tworzenie odpowiednio skonfigurowanych instancji <em data-start=\"1536\" data-end=\"1572\">com.cisag.pgm.gui.EditableTreeView<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"1587\" data-end=\"1605\">EditableTreeView<\/em>).<\/p>\n<p data-start=\"1609\" data-end=\"1959\">Metody <em data-start=\"1616\" data-end=\"1640\">addNode(TreeNode node)<\/em> oraz <em data-start=\"1646\" data-end=\"1687\">addNode(TreeNode parent, TreeNode node)<\/em> rozszerzaj\u0105 struktur\u0119 drzewa o kolejne elementy, przypisuj\u0105c w\u0119z\u0142y do ich w\u0119z\u0142a nadrz\u0119dnego. W\u0119ze\u0142 nadrz\u0119dny pochodzi z <em data-start=\"1808\" data-end=\"1826\">node.getParent()<\/em> lub jest przekazywany jawnie. Je\u017celi nie mo\u017cna zidentyfikowa\u0107 w\u0119z\u0142a nadrz\u0119dnego, obiekt <em data-start=\"1915\" data-end=\"1925\">TreeNode<\/em> zostaje dodany do w\u0119z\u0142a <em data-start=\"1950\" data-end=\"1956\">root<\/em>.<\/p>\n<p data-start=\"1961\" data-end=\"2162\">Funkcja <em data-start=\"1969\" data-end=\"2014\">insertNode(TreeNode aheadOf, TreeNode node)<\/em> wstawia nowy element (<em data-start=\"2037\" data-end=\"2043\">node<\/em>) bezpo\u015brednio przed wskazanym w\u0119z\u0142em lub elementem li\u015bciowym <em data-start=\"2105\" data-end=\"2114\">aheadOf<\/em>. Oba elementy maj\u0105 w\u00f3wczas tego samego rodzica.<\/p>\n<p data-start=\"2164\" data-end=\"2403\">Nowy w\u0119ze\u0142 <em data-start=\"2175\" data-end=\"2181\">root<\/em> mo\u017cna ustawi\u0107 za pomoc\u0105 <em data-start=\"2206\" data-end=\"2230\">setRoot(TreeNode node)<\/em> lub <em data-start=\"2235\" data-end=\"2257\">setRoot(String data)<\/em>. W drugim przypadku obiekt <em data-start=\"2285\" data-end=\"2295\">TreeNode<\/em> tworzony jest automatycznie na podstawie parametru <em data-start=\"2347\" data-end=\"2353\">data<\/em>. Metoda <em data-start=\"2362\" data-end=\"2373\">getRoot()<\/em> zwraca aktualny w\u0119ze\u0142 g\u0142\u00f3wny.<\/p>\n<p data-start=\"2405\" data-end=\"2609\">Metoda <em data-start=\"2412\" data-end=\"2439\">removeNode(TreeNode node)<\/em> usuwa wskazany w\u0119ze\u0142, <em data-start=\"2462\" data-end=\"2495\">removeChildren(TreeNode parent)<\/em> usuwa wszystkie w\u0119z\u0142y podrz\u0119dne danego elementu nadrz\u0119dnego, natomiast <em data-start=\"2567\" data-end=\"2580\">removeAll()<\/em> usuwa ca\u0142\u0105 struktur\u0119 drzewa.<\/p>\n<p data-start=\"2611\" data-end=\"2692\">Metoda <em data-start=\"2618\" data-end=\"2641\">findNode(byte[] guid)<\/em> umo\u017cliwia wyszukanie w\u0119z\u0142a na podstawie jego GUID.<\/p>\n<p data-start=\"2694\" data-end=\"2988\">Rozwijanie i zwijanie w\u0119z\u0142\u00f3w drzewa (folder\u00f3w) odbywa si\u0119 z poziomu u\u017cytkownika poprzez klikni\u0119cie lewym przyciskiem myszy \u2013 w zale\u017cno\u015bci od ustawie\u0144 mo\u017ce to by\u0107 pojedyncze lub podw\u00f3jne klikni\u0119cie. Z poziomu klawiatury s\u0142u\u017c\u0105 do tego klawisze strza\u0142ek w prawo (rozwini\u0119cie) i w lewo (zwini\u0119cie).<\/p>\n<p data-start=\"2990\" data-end=\"3028\">Po stronie serwera dost\u0119pne s\u0105 metody:<\/p>\n<ul>\n<li data-start=\"3032\" data-end=\"3061\"><em data-start=\"3032\" data-end=\"3059\">expandNode(TreeNode node)<\/em><\/li>\n<li data-start=\"3064\" data-end=\"3095\"><em data-start=\"3064\" data-end=\"3093\">collapseNode(TreeNode node)<\/em><\/li>\n<li data-start=\"3098\" data-end=\"3113\"><em data-start=\"3098\" data-end=\"3111\">expandAll()<\/em><\/li>\n<li data-start=\"3116\" data-end=\"3133\"><em data-start=\"3116\" data-end=\"3131\">collapseAll()<\/em><\/li>\n<\/ul>\n<p data-start=\"3135\" data-end=\"3233\">Stan w\u0119z\u0142a mo\u017cna sprawdzi\u0107 metodami <em data-start=\"3171\" data-end=\"3198\">isExpanded(TreeNode node)<\/em> oraz <em data-start=\"3204\" data-end=\"3232\">isCollapsed(TreeNode node)<\/em>.<\/p>\n<p data-start=\"3235\" data-end=\"3414\">Metody <em data-start=\"3242\" data-end=\"3269\">setExpandAction(Action a)<\/em> oraz <em data-start=\"3275\" data-end=\"3304\">setCollapseAction(Action a)<\/em> umo\u017cliwiaj\u0105 rejestracj\u0119 akcji, kt\u00f3rych <em data-start=\"3344\" data-end=\"3360\">ActionListener<\/em> b\u0119d\u0105 powiadamiane przy rozwijaniu lub zwijaniu w\u0119z\u0142a.<\/p>\n<p data-start=\"3416\" data-end=\"3649\">Funkcja <em data-start=\"3424\" data-end=\"3449\">editNode(TreeNode node)<\/em> prze\u0142\u0105cza wskazany w\u0119ze\u0142 w tryb edycji, o ile \u2013 jak opisano wy\u017cej \u2013 zarejestrowano <em data-start=\"3533\" data-end=\"3558\">EditableTreeViewCreator<\/em> jako fabryk\u0119 dla obiekt\u00f3w <em data-start=\"3585\" data-end=\"3603\">EditableTreeView<\/em>. W ten spos\u00f3b mo\u017cna zmieni\u0107 oznaczenie w\u0119z\u0142a.<\/p>\n<p data-start=\"3651\" data-end=\"3805\">Widok drzewa umo\u017cliwia wyb\u00f3r pojedynczy (ustawienie domy\u015blne) lub wielokrotny, kt\u00f3ry mo\u017cna ustawi\u0107 metod\u0105 <em data-start=\"3757\" data-end=\"3785\">setSelectionMode(int mode)<\/em>, przekazuj\u0105c sta\u0142e:<\/p>\n<ul>\n<li data-start=\"3809\" data-end=\"3834\"><em data-start=\"3809\" data-end=\"3832\">Tree.SINGLE_SELECTION<\/em><\/li>\n<li data-start=\"3837\" data-end=\"3864\"><em data-start=\"3837\" data-end=\"3862\">Tree.MULTIPLE_SELECTION<\/em><\/li>\n<\/ul>\n<p data-start=\"3866\" data-end=\"4103\">Aktualnie zaznaczone w\u0119z\u0142y mo\u017cna pobra\u0107 metodami <em data-start=\"3915\" data-end=\"3934\">getSelectedNode()<\/em> oraz <em data-start=\"3940\" data-end=\"3960\">getSelectedNodes()<\/em>. Metoda <em data-start=\"3969\" data-end=\"3996\">isSelected(TreeNode node)<\/em> pozwala sprawdzi\u0107, czy dany w\u0119ze\u0142 nale\u017cy do zaznaczenia. Metoda <em data-start=\"4061\" data-end=\"4079\">clearSelection()<\/em> usuwa ca\u0142e zaznaczenie.<\/p>\n<p data-start=\"4105\" data-end=\"4426\">Mo\u017cliwe jest r\u00f3wnie\u017c zarejestrowanie akcji za pomoc\u0105 <em data-start=\"4158\" data-end=\"4188\">setSelectionAction(Action a)<\/em>, kt\u00f3rej <em data-start=\"4197\" data-end=\"4213\">ActionListener<\/em> b\u0119d\u0105 powiadamiane przy ka\u017cdej zmianie zaznaczenia. Za pomoc\u0105 <em data-start=\"4275\" data-end=\"4295\">action.getSource()<\/em> oraz <em data-start=\"4301\" data-end=\"4320\">action.getState()<\/em> w metodzie <em data-start=\"4332\" data-end=\"4349\">performAction()<\/em> mo\u017cna odczyta\u0107 aktualnie zaznaczony w\u0119ze\u0142 lub powi\u0105zany z nim obiekt danych.<\/p>\n<p data-start=\"4428\" data-end=\"4497\">Poni\u017csze metody dotycz\u0105 prezentacji drzewa w interfejsie u\u017cytkownika.<\/p>\n<p data-start=\"4499\" data-end=\"4666\">Metoda <em data-start=\"4506\" data-end=\"4537\">setRootVisible(boolean value)<\/em> okre\u015bla, czy w\u0119ze\u0142 g\u0142\u00f3wny ma by\u0107 wy\u015bwietlany (domy\u015blnie <em data-start=\"4594\" data-end=\"4600\">true<\/em>). W przypadku warto\u015bci <em data-start=\"4624\" data-end=\"4631\">false<\/em> widoczne s\u0105 tylko w\u0119z\u0142y podrz\u0119dne.<\/p>\n<p data-start=\"4668\" data-end=\"4859\">Metoda <em data-start=\"4675\" data-end=\"4716\">setTopHandlesDisplayMode(boolean value)<\/em> umo\u017cliwia wy\u015bwietlenie przy w\u0119z\u0142ach dodatkowego symbolu wskazuj\u0105cego, czy w\u0119ze\u0142 jest zwini\u0119ty lub rozwini\u0119ty oraz czy zawiera w\u0119z\u0142y podrz\u0119dne.<\/p>\n<p data-start=\"4861\" data-end=\"5021\">Metoda <em data-start=\"4868\" data-end=\"4902\">setVisibleRowCount(int newCount)<\/em> okre\u015bla preferowan\u0105 wysoko\u015b\u0107 drzewa (w\u0142a\u015bciwo\u015b\u0107 <em data-start=\"4951\" data-end=\"4968\">preferredHeight<\/em>) poprzez podanie liczby widocznych wierszy (w\u0119z\u0142\u00f3w).<\/p>\n<p data-start=\"5023\" data-end=\"5179\">Drzewo obs\u0142uguje zar\u00f3wno przewijanie poziome, jak i pionowe, udost\u0119pniaj\u0105c odpowiednie metody konfiguracyjne (np. <em data-start=\"5137\" data-end=\"5177\">setVerticalScrollBarPolicy(int policy)<\/em>).<\/p>\n<p data-start=\"5023\" data-end=\"5179\"><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">W aktualnej wersji klasa <em data-start=\"5219\" data-end=\"5225\">Tree<\/em> dziedziczy po <em data-start=\"5240\" data-end=\"5264\">VisualElementContainer<\/em> (zamiast po <em data-start=\"5277\" data-end=\"5292\">VisualElement<\/em>). W\u0142a\u015bciwo\u015bci i metody odziedziczone z <em data-start=\"5332\" data-end=\"5356\">VisualElementContainer<\/em> nie s\u0105 jednak obs\u0142ugiwane przez klas\u0119 <em data-start=\"5395\" data-end=\"5401\">Tree<\/em> i nie mog\u0105 by\u0107 wykorzystywane.<\/div><\/section><\/p>\n<h6 data-start=\"5023\" data-end=\"5179\" id=\"treenode\" ><span class=\"ez-toc-section\" id=\"TreeNode\"><\/span>TreeNode<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"22\" data-end=\"162\">Elementy (w\u0119z\u0142y) drzewa s\u0105 reprezentowane przez obiekty klasy <em data-start=\"84\" data-end=\"112\">com.cisag.pgm.gui.TreeNode<\/em>. Ich tworzenie odbywa si\u0119 za pomoc\u0105 konstruktora <em data-start=\"164\" data-end=\"253\">TreeNode(String text, String iconName, Object dataObject, String viewName, byte[] guid)<\/em><\/p>\n<p data-start=\"255\" data-end=\"454\">Parametr <em data-start=\"264\" data-end=\"270\">text<\/em> jest wykorzystywany jako oznaczenie w\u0119z\u0142a.<br data-start=\"313\" data-end=\"316\" \/>Za pomoc\u0105 parametru <em data-start=\"336\" data-end=\"346\">iconName<\/em> mo\u017cna przypisa\u0107 do w\u0119z\u0142a specjaln\u0105 ikon\u0119, przy czym nale\u017cy poda\u0107 \u015bcie\u017ck\u0119 do obiektu ikony z repozytorium.<\/p>\n<p data-start=\"456\" data-end=\"612\">Parametr <em data-start=\"465\" data-end=\"477\">dataObject<\/em> umo\u017cliwia przypisanie do w\u0119z\u0142a dowolnego obiektu. Zazwyczaj jest to obiekt (lub referencja do niego), kt\u00f3ry dany w\u0119ze\u0142 reprezentuje.<\/p>\n<p data-start=\"614\" data-end=\"793\">Parametr <em data-start=\"623\" data-end=\"633\">viewName<\/em> mo\u017ce zosta\u0107 wykorzystany do przekazania fabryce <em data-start=\"682\" data-end=\"692\">TreeView<\/em> (<em data-start=\"694\" data-end=\"711\">TreeViewCreator<\/em>) informacji, w jaki spos\u00f3b powi\u0105zany <em data-start=\"749\" data-end=\"759\">TreeView<\/em> powinien zosta\u0107 skonfigurowany.<\/p>\n<p data-start=\"795\" data-end=\"854\">Parametr <em data-start=\"804\" data-end=\"810\">guid<\/em> s\u0142u\u017cy do jednoznacznej identyfikacji w\u0119z\u0142a.<\/p>\n<p data-start=\"856\" data-end=\"964\">W\u0142a\u015bciwo\u015bci przekazane jako parametry konstruktora s\u0105 dost\u0119pne r\u00f3wnie\u017c poprzez odpowiednie metody <em data-start=\"954\" data-end=\"963\">get\/set<\/em>.<\/p>\n<p data-start=\"966\" data-end=\"1137\">Podpowied\u017a (<em data-start=\"978\" data-end=\"987\">ToolTip<\/em>) mo\u017cna zdefiniowa\u0107 za pomoc\u0105 metody <em data-start=\"1024\" data-end=\"1049\">setTooltip(String text)<\/em>, natomiast identyfikator pomocy kontekstowej \u2013 za pomoc\u0105 <em data-start=\"1107\" data-end=\"1136\">setContextHelpID(String id)<\/em>.<\/p>\n<p data-start=\"1139\" data-end=\"1278\">W\u0119ze\u0142 tworzony przez konstruktor jest domy\u015blnie elementem li\u015bciowym. W\u0142a\u015bciwo\u015b\u0107 t\u0119 mo\u017cna zmieni\u0107 metod\u0105 <em data-start=\"1243\" data-end=\"1277\">setAllowsChildren(boolean allow)<\/em>.<\/p>\n<p data-start=\"1280\" data-end=\"1338\">Aby rozszerzy\u0107 w\u0119ze\u0142 o w\u0119z\u0142y podrz\u0119dne, nale\u017cy u\u017cy\u0107 metod:<\/p>\n<ul>\n<li data-start=\"1342\" data-end=\"1370\"><em data-start=\"1342\" data-end=\"1368\">addChild(TreeNode child)<\/em><\/li>\n<li data-start=\"1373\" data-end=\"1419\"><em data-start=\"1373\" data-end=\"1417\">addChild(TreeNode aheadOf, TreeNode child)<\/em><\/li>\n<\/ul>\n<p data-start=\"1421\" data-end=\"1568\">Podany w\u0119ze\u0142 zostaje dodany jako w\u0119ze\u0142 podrz\u0119dny, a jego referencja <em data-start=\"1489\" data-end=\"1497\">parent<\/em> zostaje odpowiednio ustawiona. Mo\u017cna j\u0105 odczyta\u0107 metod\u0105 <em data-start=\"1554\" data-end=\"1567\">getParent()<\/em>.<\/p>\n<p data-start=\"1570\" data-end=\"1727\">Je\u017celi dodatkowo zostanie przekazany w\u0119ze\u0142 odniesienia w parametrze <em data-start=\"1638\" data-end=\"1647\">aheadOf<\/em>, nowy w\u0119ze\u0142 zostanie wstawiony bezpo\u015brednio przed wskazanym w\u0119z\u0142em odniesienia.<\/p>\n<p data-start=\"1729\" data-end=\"1858\">Metoda <em data-start=\"1736\" data-end=\"1765\">removeChild(TreeNode child)<\/em> usuwa wybrany w\u0119ze\u0142 podrz\u0119dny, natomiast <em data-start=\"1807\" data-end=\"1825\">removeChildren()<\/em> usuwa wszystkie w\u0119z\u0142y podrz\u0119dne.<\/p>\n<p data-start=\"1860\" data-end=\"1911\">Poni\u017csze metody s\u0142u\u017c\u0105 do analizy w\u0119z\u0142a nadrz\u0119dnego:<\/p>\n<ul>\n<li data-start=\"1915\" data-end=\"1989\"><strong><em data-start=\"1915\" data-end=\"1930\">hasChildren()<\/em><\/strong> \u2013 zwraca warto\u015b\u0107 <em data-start=\"1948\" data-end=\"1954\">true<\/em>, je\u017celi istniej\u0105 w\u0119z\u0142y podrz\u0119dne<\/li>\n<li data-start=\"1992\" data-end=\"2069\"><strong><em data-start=\"1992\" data-end=\"2007\">getMaxDepth()<\/em><\/strong> \u2013 zwraca maksymaln\u0105 g\u0142\u0119boko\u015b\u0107 hierarchii w\u0119z\u0142\u00f3w podrz\u0119dnych<\/li>\n<li data-start=\"2072\" data-end=\"2181\"><strong><em data-start=\"2072\" data-end=\"2087\">getChildren()<\/em><\/strong> \u2013 zwraca tablic\u0119 <em data-start=\"2105\" data-end=\"2117\">TreeNode[]<\/em> zawieraj\u0105c\u0105 wszystkie bezpo\u015brednie w\u0119z\u0142y podrz\u0119dne danego w\u0119z\u0142a<\/li>\n<\/ul>\n<p data-start=\"0\" data-end=\"142\">Metoda <em data-start=\"7\" data-end=\"34\">isAncestor(TreeNode node)<\/em> sprawdza, czy wskazany w\u0119ze\u0142 wyst\u0119puje w \u0142a\u0144cuchu w\u0119z\u0142\u00f3w nadrz\u0119dnych lub czy odpowiada bie\u017c\u0105cemu w\u0119z\u0142owi.<\/p>\n<p data-start=\"144\" data-end=\"225\">Metoda <em data-start=\"151\" data-end=\"163\">getLevel()<\/em> analizuje poziom w\u0119z\u0142a w hierarchii wzgl\u0119dem elementu <em data-start=\"218\" data-end=\"224\">root<\/em>.<\/p>\n<p data-start=\"227\" data-end=\"346\">Bezpo\u015brednie s\u0105siednie w\u0119z\u0142y obiektu <em data-start=\"264\" data-end=\"274\">TreeNode<\/em> mo\u017cna uzyska\u0107 za pomoc\u0105 metod <em data-start=\"305\" data-end=\"320\">getNextNode()<\/em> oraz <em data-start=\"326\" data-end=\"345\">getPreviousNode()<\/em>.<\/p>\n<p data-start=\"227\" data-end=\"346\"><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Dodawanie lub usuwanie w\u0119z\u0142\u00f3w powinno odbywa\u0107 si\u0119 zawsze za pomoc\u0105 odpowiednich metod klasy <em data-start=\"453\" data-end=\"459\">Tree<\/em>. Klasa <em data-start=\"467\" data-end=\"477\">TreeNode<\/em> r\u00f3wnie\u017c udost\u0119pnia takie metody, jednak ich u\u017cycie nie powoduje automatycznej aktualizacji widoku drzewa. W takim przypadku, aby od\u015bwie\u017cy\u0107 widok, nale\u017ca\u0142oby np. ponownie przypisa\u0107 w\u0119ze\u0142 g\u0142\u00f3wny (<em data-start=\"672\" data-end=\"678\">root<\/em>) do obiektu <em data-start=\"691\" data-end=\"697\">Tree<\/em>.<\/div><\/section><\/p>\n<h6 data-start=\"227\" data-end=\"346\" id=\"treeview\" ><span class=\"ez-toc-section\" id=\"TreeView\"><\/span>TreeView<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"727\" data-end=\"939\">Klasa <em data-start=\"733\" data-end=\"761\">com.cisag.pgm.gui.TreeView<\/em> jest wykorzystywana w drzewach do wizualizacji w\u0119z\u0142\u00f3w i element\u00f3w li\u015bciowych. Klasa <em data-start=\"846\" data-end=\"852\">Tree<\/em> nie rysuje element\u00f3w samodzielnie, lecz deleguje to zadanie do instancji <em data-start=\"926\" data-end=\"936\">TreeView<\/em>.<\/p>\n<p data-start=\"941\" data-end=\"1261\"><em data-start=\"941\" data-end=\"951\">TreeView<\/em> pe\u0142ni funkcj\u0119 renderera dla obiektu <em data-start=\"990\" data-end=\"1000\">TreeNode<\/em>. O tym, kt\u00f3ra instancja <em data-start=\"1025\" data-end=\"1035\">TreeView<\/em> zostanie u\u017cyta do renderowania danego <em data-start=\"1074\" data-end=\"1084\">TreeNode<\/em>, decyduje <em data-start=\"1095\" data-end=\"1112\">TreeViewCreator<\/em>, kt\u00f3ry dzia\u0142a jako fabryka instancji <em data-start=\"1150\" data-end=\"1160\">TreeView<\/em>. Takie rozwi\u0105zanie umo\u017cliwia zdefiniowanie indywidualnej prezentacji dla ka\u017cdego obiektu <em data-start=\"1250\" data-end=\"1260\">TreeNode<\/em>.<\/p>\n<p data-start=\"1263\" data-end=\"1463\">Klasa udost\u0119pnia r\u00f3wnie\u017c implementacj\u0119 domy\u015bln\u0105. W jej ramach w\u0119z\u0142y drzewa s\u0105 wizualizowane za pomoc\u0105 ikony i tekstu. Tekst jest pobierany bezpo\u015brednio z obiektu <em data-start=\"1425\" data-end=\"1435\">TreeNode<\/em> poprzez <em data-start=\"1444\" data-end=\"1460\">node.getText()<\/em>.<\/p>\n<p data-start=\"1465\" data-end=\"1682\">Ikona jest okre\u015blana na podstawie <em data-start=\"1499\" data-end=\"1519\">node.getIconName()<\/em>. Je\u017celi dla w\u0119z\u0142a nie zdefiniowano w\u0142asnej ikony, wykorzystywana jest ikona standardowa odpowiednia dla typu i stanu w\u0119z\u0142a (li\u015b\u0107, folder otwarty lub zamkni\u0119ty).<\/p>\n<p data-start=\"1684\" data-end=\"1791\">Implementacja domy\u015blna uwzgl\u0119dnia r\u00f3wnie\u017c wizualizacj\u0119 w\u0119z\u0142\u00f3w zaznaczonych oraz znajduj\u0105cych si\u0119 w fokusie.<\/p>\n<p data-start=\"1793\" data-end=\"2055\">Do konstruktora <em data-start=\"1809\" data-end=\"1831\">TreeView(Tree owner)<\/em> nale\u017cy przekaza\u0107 odpowiedni\u0105 instancj\u0119 <em data-start=\"1871\" data-end=\"1877\">Tree<\/em>. Opcjonalnie mo\u017cna u\u017cy\u0107 konstruktora <em data-start=\"1915\" data-end=\"1951\">TreeView(Tree owner, int nodesize)<\/em>, aby okre\u015bli\u0107 rozmiar czcionki, korzystaj\u0105c ze sta\u0142ych <em data-start=\"2007\" data-end=\"2030\">TreeView.SIZE_DEFAULT<\/em> lub <em data-start=\"2035\" data-end=\"2054\">TreeView.SIZE_7PT<\/em>.<\/p>\n<p data-start=\"2057\" data-end=\"2239\">Konstruktor domy\u015blny (oznaczony jako <em data-start=\"2094\" data-end=\"2105\">protected<\/em>) mo\u017ce by\u0107 wykorzystywany przez podklasy, kt\u00f3re nie potrzebuj\u0105 element\u00f3w UI implementacji domy\u015blnej lub chc\u0105 zapobiec ich tworzeniu.<\/p>\n<p data-start=\"2241\" data-end=\"2374\">Zasadniczo zaleca si\u0119 jednak korzystanie z implementacji domy\u015blnej i ograniczenie si\u0119 w podklasach do nadpisania metody <em data-start=\"2361\" data-end=\"2373\">dataToUi()<\/em>.<\/p>\n<p data-start=\"2376\" data-end=\"2653\">Mapowanie w\u0142a\u015bciwo\u015bci w\u0119z\u0142a na odpowiednie elementy UI (ikona, tekst) odbywa si\u0119 w metodzie <em data-start=\"2468\" data-end=\"2493\">dataToUi(TreeNode node)<\/em>. Podklasy <em data-start=\"2504\" data-end=\"2514\">TreeView<\/em> mog\u0105 nadpisa\u0107 t\u0119 metod\u0119, aby przypisa\u0107 dane do w\u0142asnych element\u00f3w UI i\/lub uwzgl\u0119dni\u0107 dodatkowe w\u0142a\u015bciwo\u015bci w\u0119z\u0142a lub jego obiektu danych.<\/p>\n<p data-start=\"2655\" data-end=\"2939\" data-is-last-node=\"\" data-is-only-node=\"\">Dost\u0119p do element\u00f3w implementacji domy\u015blnej (tekst i ikona) mo\u017cliwy jest poprzez chronione zmienne <em data-start=\"2754\" data-end=\"2761\">label<\/em> oraz <em data-start=\"2767\" data-end=\"2778\">iconField<\/em>. Zaleca si\u0119 wywo\u0142anie na pocz\u0105tku metody <em data-start=\"2820\" data-end=\"2851\">super.dataToUi(TreeNode node)<\/em>, aby kolory, obramowania i czcionki zosta\u0142y ustawione zgodnie z implementacj\u0105 domy\u015bln\u0105.<\/p>\n<h6 data-start=\"2655\" data-end=\"2939\" id=\"editabletreeview\" ><span class=\"ez-toc-section\" id=\"EditableTreeView\"><\/span>EditableTreeView<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"30\" data-end=\"183\">Klasa <em data-start=\"36\" data-end=\"72\">com.cisag.pgm.gui.EditableTreeView<\/em> jest wykorzystywana w drzewach do edycji w\u0119z\u0142\u00f3w i element\u00f3w li\u015bciowych, w szczeg\u00f3lno\u015bci do edycji nazwy w\u0119z\u0142a.<\/p>\n<p data-start=\"185\" data-end=\"534\">Klasa <em data-start=\"191\" data-end=\"197\">Tree<\/em> nie edytuje element\u00f3w samodzielnie, lecz deleguje to zadanie do instancji <em data-start=\"272\" data-end=\"290\">EditableTreeView<\/em>. <em data-start=\"292\" data-end=\"310\">EditableTreeView<\/em> pe\u0142ni funkcj\u0119 edytora dla obiektu <em data-start=\"347\" data-end=\"357\">TreeNode<\/em>. O tym, kt\u00f3ra instancja <em data-start=\"382\" data-end=\"400\">EditableTreeView<\/em> zostanie u\u017cyta do edycji danego <em data-start=\"433\" data-end=\"443\">TreeNode<\/em>, decyduje <em data-start=\"454\" data-end=\"479\">EditableTreeViewCreator<\/em>, dzia\u0142aj\u0105cy jako fabryka instancji <em data-start=\"515\" data-end=\"533\">EditableTreeView<\/em>.<\/p>\n<p data-start=\"536\" data-end=\"692\">Analogicznie jak w przypadku <em data-start=\"565\" data-end=\"575\">TreeView<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"590\" data-end=\"600\">TreeView<\/em>), konstrukcja ta umo\u017cliwia przypisanie specyficznego edytora do ka\u017cdego obiektu <em data-start=\"681\" data-end=\"691\">TreeNode<\/em>.<\/p>\n<p data-start=\"536\" data-end=\"692\"><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\"><em data-start=\"707\" data-end=\"725\">EditableTreeView<\/em> oraz <em data-start=\"731\" data-end=\"741\">TreeView<\/em> dla danego obiektu <em data-start=\"761\" data-end=\"771\">TreeNode<\/em> powinny by\u0107 ze sob\u0105 sp\u00f3jne, tzn. struktura, rozmiar i pozycja element\u00f3w podrz\u0119dnych powinny by\u0107 identyczne \u2013 z wyj\u0105tkiem elementu wykorzystywanego do edycji.<\/div><\/section><\/p>\n<p data-start=\"931\" data-end=\"1123\">Klasa udost\u0119pnia r\u00f3wnie\u017c implementacj\u0119 domy\u015bln\u0105. R\u00f3\u017cni si\u0119 ona od implementacji <em data-start=\"1011\" data-end=\"1021\">TreeView<\/em> jedynie tym, \u017ce do edycji tekstu u\u017cywane jest pole tekstowe (<em data-start=\"1083\" data-end=\"1094\">TextField<\/em>) zamiast etykiety (<em data-start=\"1114\" data-end=\"1121\">Label<\/em>).<\/p>\n<h5 data-start=\"931\" data-end=\"1123\" id=\"htmlpane\" ><span class=\"ez-toc-section\" id=\"HTMLPane\"><\/span>HTMLPane<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"1150\" data-end=\"1256\">Klasa <em data-start=\"1156\" data-end=\"1184\">com.cisag.pgm.gui.HTMLPane<\/em> mo\u017ce by\u0107 u\u017cywana do integrowania tre\u015bci HTML w interfejsie u\u017cytkownika.<\/p>\n<p data-start=\"1258\" data-end=\"1311\">Jako \u017ar\u00f3d\u0142o tre\u015bci HTML mo\u017cliwe s\u0105 nast\u0119puj\u0105ce opcje:<\/p>\n<ul>\n<li data-start=\"1315\" data-end=\"1336\">prosty tekst HTML<\/li>\n<li data-start=\"1339\" data-end=\"1416\">adres URL, pod kt\u00f3rym dost\u0119pna jest strona HTML, obraz lub dowolny dokument<\/li>\n<li data-start=\"1419\" data-end=\"1463\">instancja <em data-start=\"1429\" data-end=\"1461\">com.cisag.pgm.gui.HTMLDocument<\/em><\/li>\n<li data-start=\"1466\" data-end=\"1511\">instancja <em data-start=\"1476\" data-end=\"1509\">com.cisag.pgm.gui.ImageDocument<\/em><\/li>\n<\/ul>\n<p data-start=\"1513\" data-end=\"1675\">Pierwsza mo\u017cliwo\u015b\u0107 jest odpowiednia, gdy wymagane jest jedynie wy\u015bwietlenie sformatowanego tekstu. Tekst mo\u017cna ustawi\u0107 bezpo\u015brednio metod\u0105 <em data-start=\"1652\" data-end=\"1674\">setText(String text)<\/em>.<\/p>\n<p data-start=\"1677\" data-end=\"1902\">Nale\u017cy zwr\u00f3ci\u0107 uwag\u0119, \u017ce u\u017cywane znaczniki HTML musz\u0105 by\u0107 dozwolone wewn\u0105trz elementu <em>&lt;DIV&gt;<\/em> (np. elementy <em>&lt;HTML&gt;<\/em>, <em>&lt;META&gt;<\/em>, <em>&lt;BODY&gt;<\/em>,\u00a0itd. nie s\u0105 tam dopuszczalne) oraz nie powinny by\u0107 zale\u017cne od konkretnej przegl\u0105darki.<\/p>\n<p data-start=\"1904\" data-end=\"2074\">Sk\u0142adnia element\u00f3w i atrybut\u00f3w musi by\u0107 poprawna, w tym prawid\u0142owe parowanie znacznik\u00f3w otwieraj\u0105cych i zamykaj\u0105cych oraz odpowiednie pomijanie znak\u00f3w specjalnych.<\/p>\n<p data-start=\"2076\" data-end=\"2246\">Nale\u017cy unika\u0107 odwo\u0142a\u0144 do innych dokument\u00f3w (elementy z atrybutami <em data-start=\"2142\" data-end=\"2148\">href<\/em> lub <em data-start=\"2153\" data-end=\"2158\">src<\/em>), jak r\u00f3wnie\u017c stosowania element\u00f3w formularzy (<em data-start=\"2206\" data-end=\"2214\">&lt;FORM&gt;<\/em>, <em data-start=\"2216\" data-end=\"2225\">&lt;INPUT&gt;<\/em> itd.) oraz skrypt\u00f3w.<\/p>\n<p data-start=\"2248\" data-end=\"2371\">Druga mo\u017cliwo\u015b\u0107 jest odpowiednia do osadzania dokument\u00f3w lub obraz\u00f3w. Adresy URL powinny wykorzystywa\u0107 protok\u00f3\u0142 <em>https<\/em>.<\/p>\n<p data-start=\"2373\" data-end=\"2705\">Opcja ta jest typowo wykorzystywana do osadzania dokument\u00f3w z <em data-start=\"2435\" data-end=\"2451\">KnowledgeStore<\/em>. Ustawienie adresu URL powinno odbywa\u0107 si\u0119 za pomoc\u0105 metody <em data-start=\"2512\" data-end=\"2532\">setURL(String url)<\/em>. Nie zaleca si\u0119 ustawiania adresu URL poprzez konstruktor <em data-start=\"2591\" data-end=\"2609\">HTMLPane(String)<\/em>, poniewa\u017c ta sygnatura ma w przysz\u0142o\u015bci zosta\u0107 wykorzystana do przypisania identyfikatora GUID.<\/p>\n<p data-start=\"2707\" data-end=\"3017\">Trzecia i czwarta mo\u017cliwo\u015b\u0107 s\u0105 zasadniczo wariantami drugiej. R\u00f3\u017cnica polega na tym, \u017ce osadzany dokument nie jest referencjonowany przez URL, lecz znajduje si\u0119 w pami\u0119ci operacyjnej jako tablica znak\u00f3w (<em data-start=\"2911\" data-end=\"2919\">char[]<\/em>) lub bajt\u00f3w (<em data-start=\"2933\" data-end=\"2941\">byte[]<\/em>) \u2013 np. gdy zosta\u0142 wygenerowany lub obliczony w trakcie dzia\u0142ania aplikacji.<\/p>\n<p data-start=\"3019\" data-end=\"3224\">Na podstawie tablicy znak\u00f3w lub bajt\u00f3w nale\u017cy najpierw utworzy\u0107 instancj\u0119 <em data-start=\"3093\" data-end=\"3107\">HTMLDocument<\/em> lub <em data-start=\"3112\" data-end=\"3127\">ImageDocument<\/em>, a nast\u0119pnie przekaza\u0107 j\u0105 do <em data-start=\"3157\" data-end=\"3167\">HTMLPane<\/em> za pomoc\u0105 metody <em data-start=\"3185\" data-end=\"3221\">setDocument(HTMLDocument document)<\/em>.<\/p>\n<p data-start=\"3226\" data-end=\"3338\">Klasa <em data-start=\"3232\" data-end=\"3247\">ImageDocument<\/em> powinna by\u0107 u\u017cywana zawsze wtedy, gdy dane reprezentuj\u0105 obraz (<em>*.png, *.gif, .jpg<\/em> itd.).<\/p>\n<p data-start=\"3340\" data-end=\"3408\"><em data-start=\"3340\" data-end=\"3350\">HTMLPane<\/em> obs\u0142uguje w razie potrzeby przewijanie poziome i pionowe.<\/p>\n<h5 data-start=\"4850\" data-end=\"5005\" id=\"htmleditor\" ><span class=\"ez-toc-section\" id=\"HTMLEditor\"><\/span>HTMLEditor<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"0\" data-end=\"102\">Klasa <em>com.cisag.pgm.gui.HTMLEditor<\/em> udost\u0119pnia prosty edytor tekstu dla sformatowanego tekstu (HTML).<\/p>\n<p data-start=\"104\" data-end=\"250\">Do edytora nale\u017cy r\u00f3wnie\u017c pasek narz\u0119dzi z typowymi narz\u0119dziami, np. do wyboru kroju czcionki, rozmiaru czcionki, koloru oraz wyr\u00f3wnania tekstu.<\/p>\n<p data-start=\"252\" data-end=\"396\">Za pomoc\u0105 konstruktora <em>HTMLEditor(String guid)<\/em> tworzony jest edytor z paskiem narz\u0119dzi. Metodami<br data-start=\"350\" data-end=\"353\" \/><em>setColorSupported(boolean supported)<\/em> oraz <em>setFontSupported(boolean supported)<\/em> mo\u017cliwe jest ukrycie okre\u015blonych narz\u0119dzi lub element\u00f3w wyboru.<\/p>\n<p data-start=\"918\" data-end=\"1370\">Dodatkowe elementy mo\u017cna wstawi\u0107 do paska narz\u0119dzi za pomoc\u0105 metody <em>addCoolBarElement(VisualElement element, int side)<\/em>. Nale\u017cy przy tym okre\u015bli\u0107, po kt\u00f3rej stronie <em>(Coolbar.LEFT lub Coolbar.RIGHT)<\/em> paska ma zosta\u0107 umieszczony nowy element. W przypadku wstawienia po lewej stronie automatycznie dodawany jest separator w postaci pionowej linii oddzielaj\u0105cej. Metod\u0105 <em>removeCoolBarElement(VisualElement element)<\/em> mo\u017cna ponownie usun\u0105\u0107 wstawiony element.<\/p>\n<p data-start=\"1395\" data-end=\"1631\" data-is-last-node=\"\" data-is-only-node=\"\">Metoda <em>setText(String text)<\/em> umo\u017cliwia definiowanie tre\u015bci po stronie serwera. Dla przekazanego tekstu HTML obowi\u0105zuj\u0105 te same zasady jak dla komponentu <em>HTMLPane<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em>HTMLPane<\/em>). Metoda <em>getText()<\/em> zwraca aktualny tekst HTML edytora.<\/p>\n<h5 data-start=\"1395\" data-end=\"1631\" id=\"popupmenu\" ><span class=\"ez-toc-section\" id=\"PopupMenu\"><\/span>PopupMenu<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"0\" data-end=\"201\">Klasa <em data-start=\"6\" data-end=\"35\">com.cisag.pgm.gui.PopupMenu<\/em> wy\u015bwietla list\u0119 pozycji menu w oknie typu popup. Zazwyczaj takie menu s\u0105 u\u017cywane jako menu kontekstowe i otwierane np. za pomoc\u0105 prawego przycisku myszy.<\/p>\n<p data-start=\"203\" data-end=\"296\">Na poni\u017cszej ilustracji przedstawiono typowe menu kontekstowe dla komponentu <em data-start=\"282\" data-end=\"295\" data-is-only-node=\"\">EntityField<\/em>.<\/p>\n<p data-start=\"203\" data-end=\"296\"><section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">W przypadku komponent\u00f3w <em data-start=\"335\" data-end=\"348\" data-is-only-node=\"\">EntityField<\/em> menu kontekstowe jest udost\u0119pniane automatycznie, tzn. przez system (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"468\" data-end=\"481\">EntityField<\/em>), dlatego jawne tworzenie lub konfigurowanie menu popup nie jest konieczne.<\/div><\/section><\/p>\n<p data-start=\"0\" data-end=\"85\">Instancjonowanie obiektu <em data-start=\"25\" data-end=\"36\">PopupMenu<\/em> odbywa si\u0119 za pomoc\u0105 konstruktora <em data-start=\"71\" data-end=\"84\">PopupMenu()<\/em>.<\/p>\n<p data-start=\"87\" data-end=\"341\">Do dodawania pozycji menu dost\u0119pne s\u0105 r\u00f3\u017cne metody <em data-start=\"138\" data-end=\"145\">add()<\/em>. Zazwyczaj u\u017cywana jest jednak metoda <em data-start=\"184\" data-end=\"204\">add(Action action)<\/em>, kt\u00f3ra na podstawie przekazanej akcji tworzy odpowiedni\u0105 pozycj\u0119 menu i przejmuje z akcji ikon\u0119, tekst, <em>ToolTip<\/em> oraz bezpo\u015bredni\u0105 pomoc.<\/p>\n<p data-start=\"343\" data-end=\"636\">Pozycje menu, kt\u00f3re nie powinny otrzyma\u0107 ikony, mog\u0105 zosta\u0107 dodane do menu za pomoc\u0105 <em data-start=\"428\" data-end=\"460\">addTextMenuItem(Action action)<\/em>. Metoda <em data-start=\"469\" data-end=\"505\">addCheckBoxMenuItem(Action action)<\/em> s\u0142u\u017cy do dodawania pozycji menu ze znakiem wyboru. Linie oddzielaj\u0105ce (separatory) mo\u017cna doda\u0107 metod\u0105 <em data-start=\"619\" data-end=\"635\">addSeparator()<\/em>.<\/p>\n<p data-start=\"638\" data-end=\"920\">Je\u017celi nowe pozycje menu maj\u0105 zosta\u0107 wstawione nie na ko\u0144cu, lecz w okre\u015blonej pozycji, mo\u017cna u\u017cy\u0107 metod <em data-start=\"743\" data-end=\"777\">insert(int index, Action action)<\/em> lub <em data-start=\"782\" data-end=\"810\">insertSeparator(int index)<\/em>. Metoda <em data-start=\"819\" data-end=\"836\">remove(int pos)<\/em> usuwa okre\u015blon\u0105 pozycj\u0119 menu, natomiast <em data-start=\"877\" data-end=\"890\">removeAll()<\/em> usuwa wszystkie pozycje menu.<\/p>\n<p data-start=\"922\" data-end=\"1185\" data-is-last-node=\"\" data-is-only-node=\"\">Instancj\u0119 <em data-start=\"932\" data-end=\"940\">Action<\/em> powi\u0105zan\u0105 z okre\u015blon\u0105 pozycj\u0105 menu mo\u017cna ustali\u0107 za pomoc\u0105 metody <em data-start=\"1007\" data-end=\"1027\">getAction(int pos)<\/em>. Analogicznie metoda <em data-start=\"1049\" data-end=\"1077\">getPosition(Action action)<\/em> zwraca indeks okre\u015blonej akcji. Za pomoc\u0105 <em data-start=\"1120\" data-end=\"1137\">getSubactions()<\/em> mo\u017cna pobra\u0107 wszystkie akcje w postaci tablicy.<\/p>\n<h5 data-start=\"922\" data-end=\"1185\" id=\"glue\" ><span class=\"ez-toc-section\" id=\"Glue\"><\/span>Glue<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"16\" data-end=\"191\"><em data-start=\"16\" data-end=\"22\">Glue<\/em> jest niewidocznym graficznym elementem pomocniczym, kt\u00f3ry s\u0142u\u017cy do wype\u0142niania wolnych przestrzeni w kontenerze, tak aby nie by\u0142y one zajmowane przez inne elementy.<\/p>\n<p data-start=\"193\" data-end=\"550\"><em data-start=\"193\" data-end=\"199\">Glue<\/em> jest stosowany g\u0142\u00f3wnie w kontenerach z <em data-start=\"239\" data-end=\"250\">BoxLayout<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"302\" data-end=\"313\">BoxLayout<\/em>). Je\u017celi w danym kontenerze dost\u0119pne jest wi\u0119cej miejsca, ni\u017c wynika to z <em data-start=\"388\" data-end=\"404\">preferredWidth<\/em> lub <em data-start=\"409\" data-end=\"426\">preferredHeight<\/em>, <em data-start=\"428\" data-end=\"439\">BoxLayout<\/em> rozdziela nadmiarow\u0105 przestrze\u0144 pomi\u0119dzy elementy, o ile ich <em data-start=\"501\" data-end=\"515\">maximumWidth<\/em> lub <em data-start=\"520\" data-end=\"535\">maximumHeight<\/em> na to pozwala.<\/p>\n<p data-start=\"552\" data-end=\"991\">Je\u017celi przestrze\u0144 ma zosta\u0107 utworzona w okre\u015blonym miejscu (np. na lewym brzegu kontenera lub po\u015brodku mi\u0119dzy dwoma elementami), w to miejsce mo\u017cna wstawi\u0107 <em data-start=\"708\" data-end=\"714\">Glue<\/em>. W\u00f3wczas <em data-start=\"724\" data-end=\"730\">Glue<\/em> zajmuje ca\u0142\u0105 dost\u0119pn\u0105 przestrze\u0144, a warto\u015bci <em data-start=\"776\" data-end=\"790\">maximumWidth<\/em> lub <em data-start=\"795\" data-end=\"810\">maximumHeight<\/em> pozosta\u0142ych element\u00f3w s\u0105 ograniczane do ich <em data-start=\"855\" data-end=\"871\">preferredWidth<\/em> lub <em data-start=\"876\" data-end=\"893\">preferredHeight<\/em>, poniewa\u017c w przeciwnym razie wolna przestrze\u0144 zosta\u0142aby rozdzielona r\u00f3wnie\u017c pomi\u0119dzy te elementy.<\/p>\n<p data-start=\"993\" data-end=\"1265\">Dzia\u0142anie <em data-start=\"1003\" data-end=\"1009\">Glue<\/em> wynika wy\u0142\u0105cznie z faktu, \u017ce jego w\u0142a\u015bciwo\u015bci <em data-start=\"1056\" data-end=\"1070\">minimumWidth<\/em>, <em data-start=\"1072\" data-end=\"1087\">minimumHeight<\/em>, <em data-start=\"1089\" data-end=\"1105\">preferredWidth<\/em> i <em data-start=\"1108\" data-end=\"1125\">preferredHeight<\/em> maj\u0105 warto\u015b\u0107 <em>0<\/em>, natomiast przynajmniej jedna z w\u0142a\u015bciwo\u015bci <em data-start=\"1187\" data-end=\"1201\">maximumWidth<\/em> lub <em data-start=\"1206\" data-end=\"1221\">maximumHeight<\/em> ma bardzo du\u017c\u0105 warto\u015b\u0107 (<em data-start=\"1246\" data-end=\"1263\">Short.MAX_VALUE<\/em>).<\/p>\n<p data-start=\"1267\" data-end=\"1696\">Za pomoc\u0105 konstruktora <em data-start=\"1290\" data-end=\"1306\">Glue(int type)<\/em> okre\u015bla si\u0119 kierunek, w kt\u00f3rym element ma si\u0119 rozszerza\u0107. Mo\u017cliwe s\u0105 warto\u015bci <em data-start=\"1385\" data-end=\"1402\">Glue.HORIZONTAL<\/em>, <em data-start=\"1404\" data-end=\"1419\">Glue.VERTICAL<\/em> lub <em data-start=\"1424\" data-end=\"1435\">Glue.BOTH<\/em>. Bez podania tego parametru (konstruktor domy\u015blny) tworzony jest obiekt 2-wymiarowy. <em data-start=\"1521\" data-end=\"1527\">Glue<\/em> stosuje si\u0119 w wi\u0119kszo\u015bci przypadk\u00f3w poziomo. Poniewa\u017c <em data-start=\"1582\" data-end=\"1588\">Glue<\/em> zawsze rozszerza si\u0119 zgodnie z kierunkiem <em data-start=\"1631\" data-end=\"1642\">BoxLayout<\/em>, powinien by\u0107 u\u017cywany wy\u0142\u0105cznie w tym samym kierunku.<\/p>\n<p data-start=\"1698\" data-end=\"1770\">Przyk\u0142ad zastosowania <em data-start=\"1720\" data-end=\"1726\">Glue<\/em> znajduje si\u0119 w rozdziale <em data-start=\"1758\" data-end=\"1769\">BoxLayout<\/em>.<\/p>\n<h5 data-start=\"922\" data-end=\"1185\" id=\"strut\" ><span class=\"ez-toc-section\" id=\"Strut\"><\/span>Strut<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"922\" data-end=\"1185\" data-is-last-node=\"\" data-is-only-node=\"\"><em data-start=\"1794\" data-end=\"1801\">Strut<\/em> jest niewidocznym graficznym elementem pomocniczym o zdefiniowanym rozmiarze w kierunku poziomym lub pionowym.<\/p>\n<p data-start=\"0\" data-end=\"215\">Podobnie jak <em data-start=\"13\" data-end=\"19\">Glue<\/em>, r\u00f3wnie\u017c <em data-start=\"29\" data-end=\"36\">Strut<\/em> jest stosowany g\u0142\u00f3wnie w kontenerach z mened\u017cerem uk\u0142adu <em data-start=\"94\" data-end=\"105\">BoxLayout<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"157\" data-end=\"168\">BoxLayout<\/em>) i mo\u017ce by\u0107 u\u017cywany jako element dystansowy.<\/p>\n<p data-start=\"217\" data-end=\"553\">Dzia\u0142anie <em data-start=\"227\" data-end=\"234\">Strut<\/em> polega na tym, \u017ce w zale\u017cno\u015bci od kierunku w\u0142a\u015bciwo\u015bci <em data-start=\"290\" data-end=\"304\">minimumWidth<\/em>, <em data-start=\"306\" data-end=\"322\">preferredWidth<\/em> oraz <em data-start=\"328\" data-end=\"342\">maximumWidth<\/em> albo w\u0142a\u015bciwo\u015bci <em data-start=\"360\" data-end=\"375\">minimumHeight<\/em>, <em data-start=\"377\" data-end=\"394\">preferredHeight<\/em> i <em data-start=\"397\" data-end=\"412\">maximumHeight<\/em> przyjmuj\u0105 \u017c\u0105dan\u0105 warto\u015b\u0107 odst\u0119pu. W drugim kierunku warto\u015bci minimalne i preferowane wynosz\u0105 <em>0<\/em>, a warto\u015b\u0107 maksymalna to <em data-start=\"535\" data-end=\"552\">Short.MAX_VALUE<\/em>.<\/p>\n<p data-start=\"555\" data-end=\"940\">W konstruktorze <em data-start=\"571\" data-end=\"588\">Strut(int type)<\/em> nale\u017cy okre\u015bli\u0107 \u017c\u0105dany kierunek. Mo\u017cliwe s\u0105 warto\u015bci <em data-start=\"642\" data-end=\"660\">Strut.HORIZONTAL<\/em> lub <em data-start=\"665\" data-end=\"681\">Strut.VERTICAL<\/em>. Kierunek <em data-start=\"692\" data-end=\"699\">Strut<\/em> powinien zawsze odpowiada\u0107 kierunkowi kontenera (tzn. <em data-start=\"754\" data-end=\"765\">BoxLayout<\/em>). Domy\u015bln\u0105 szeroko\u015bci\u0105 lub wysoko\u015bci\u0105 jest 5 pikseli. Je\u017celi potrzebna jest inna szeroko\u015b\u0107 lub wysoko\u015b\u0107, mo\u017cna j\u0105 okre\u015bli\u0107 za pomoc\u0105 konstruktora <em data-start=\"912\" data-end=\"939\">Strut(int type, int size)<\/em>.<\/p>\n<p data-start=\"942\" data-end=\"1015\">Przyk\u0142ad zastosowania <em data-start=\"964\" data-end=\"971\">Strut<\/em> znajduje si\u0119 w rozdziale <em data-start=\"1003\" data-end=\"1014\">BoxLayout<\/em>.<\/p>\n<h4 data-start=\"942\" data-end=\"1015\" id=\"layout-manager\" ><span class=\"ez-toc-section\" id=\"Layout_Manager\"><\/span>Layout Manager<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"1046\" data-end=\"1416\">Rozmieszczenie element\u00f3w odbywa si\u0119 za pomoc\u0105 mened\u017cer\u00f3w uk\u0142adu na poziomie kontener\u00f3w (<em data-start=\"1134\" data-end=\"1149\">VisualElement<\/em>). Ka\u017cdemu kontenerowi w hierarchii kontener\u00f3w nale\u017cy przypisa\u0107 w\u0142asn\u0105 instancj\u0119 mened\u017cera uk\u0142adu, kt\u00f3ra przejmuje zarz\u0105dzanie rozmieszczeniem element\u00f3w w tym kontenerze. Je\u017celi element podrz\u0119dny jest jednocze\u015bnie kontenerem, r\u00f3wnie\u017c wymaga w\u0142asnego mened\u017cera uk\u0142adu.<\/p>\n<p data-start=\"1418\" data-end=\"1490\">W pakiecie <em data-start=\"1429\" data-end=\"1448\">com.cisag.pgm.gui<\/em> dost\u0119pne s\u0105 nast\u0119puj\u0105ce mened\u017cery uk\u0142adu:<\/p>\n<ul>\n<li data-start=\"1494\" data-end=\"1528\"><em data-start=\"1494\" data-end=\"1526\">com.cisag.pgm.gui.BorderLayout<\/em><\/li>\n<li data-start=\"1531\" data-end=\"1562\"><em data-start=\"1531\" data-end=\"1560\">com.cisag.pgm.gui.BoxLayout<\/em><\/li>\n<li data-start=\"1565\" data-end=\"1597\"><em data-start=\"1565\" data-end=\"1595\">com.cisag.pgm.gui.FlowLayout<\/em><\/li>\n<li data-start=\"1600\" data-end=\"1636\"><em data-start=\"1600\" data-end=\"1634\">com.cisag.pgm.gui.StandardLayout<\/em><\/li>\n<li data-start=\"1639\" data-end=\"1667\"><em data-start=\"1639\" data-end=\"1667\" data-is-last-node=\"\">com.cisag.pgm.gui.XYLayout<\/em><\/li>\n<\/ul>\n<p data-start=\"0\" data-end=\"49\">W aplikacjach Comarch ERP Enterprise stosowane s\u0105 g\u0142\u00f3wnie:<\/p>\n<ul>\n<li data-start=\"52\" data-end=\"71\"><em data-start=\"52\" data-end=\"68\">StandardLayout<\/em>,<\/li>\n<li data-start=\"74\" data-end=\"87\"><em data-start=\"74\" data-end=\"85\">BoxLayout<\/em><\/li>\n<li data-start=\"90\" data-end=\"107\"><em data-start=\"90\" data-end=\"104\">BorderLayout<\/em>.<\/li>\n<\/ul>\n<p data-start=\"109\" data-end=\"551\">Ka\u017cdy z wymienionych mened\u017cer\u00f3w uk\u0142adu wykorzystuje typow\u0105 dla siebie strategi\u0119 rozmieszczania element\u00f3w. Strategia ta dotyczy zar\u00f3wno logicznego pozycjonowania, tzn. wzgl\u0119dnego rozmieszczenia element\u00f3w wzgl\u0119dem siebie, jak i faktycznego umiejscowienia oraz rozmieszczenia element\u00f3w. Mened\u017cer uk\u0142adu jest automatycznie dostosowywany przy zmianie rozmiaru okna lub innych w\u0142a\u015bciwo\u015bci istotnych dla uk\u0142adu (np. preferowanego rozmiaru) elementu.<\/p>\n<p data-start=\"553\" data-end=\"675\">Og\u00f3lnie rzecz bior\u0105c, mened\u017cer uk\u0142adu wykorzystuje nast\u0119puj\u0105ce informacje do pozycjonowania i ustalania rozmiaru elementu:<\/p>\n<ul>\n<li data-start=\"679\" data-end=\"708\">aktualny rozmiar kontenera,<\/li>\n<li data-start=\"711\" data-end=\"790\">szeroko\u015b\u0107 obramowania lub marginesy w kontenerze,<\/li>\n<li data-start=\"793\" data-end=\"841\">pozycj\u0119 (indeks) danego elementu w kontenerze,<\/li>\n<li data-start=\"844\" data-end=\"888\"><em data-start=\"844\" data-end=\"857\">Constraints<\/em> u\u017cyte przy metodzie <em data-start=\"878\" data-end=\"885\">add()<\/em>,<\/li>\n<li data-start=\"891\" data-end=\"1019\">w\u0142a\u015bciwo\u015bci <em data-start=\"903\" data-end=\"917\">minimumWidth<\/em> \/ <em data-start=\"920\" data-end=\"935\">minimumHeight<\/em>, <em data-start=\"937\" data-end=\"953\">preferredWidth<\/em> \/ <em data-start=\"956\" data-end=\"973\">preferredHeight<\/em>, <em data-start=\"975\" data-end=\"989\">maximumWidth<\/em> \/ <em data-start=\"992\" data-end=\"1007\">maximumHeight<\/em> elementu,<\/li>\n<li data-start=\"1022\" data-end=\"1073\">w\u0142a\u015bciwo\u015bci <em data-start=\"1034\" data-end=\"1046\">alignmentX<\/em> \/ <em data-start=\"1049\" data-end=\"1061\">alignmentY<\/em> elementu.<\/li>\n<\/ul>\n<p data-start=\"1075\" data-end=\"1322\">W zale\u017cno\u015bci od strategii niekt\u00f3re mened\u017cery uk\u0142adu traktuj\u0105 cz\u0119\u015b\u0107 tych informacji jedynie jako \u017cyczenie, poniewa\u017c ze wzgl\u0119du na ograniczenia innych element\u00f3w nie zawsze mo\u017ce ono zosta\u0107 spe\u0142nione lub mo\u017ce zosta\u0107 spe\u0142nione jedynie w przybli\u017ceniu.<\/p>\n<p data-start=\"1324\" data-end=\"1419\">Niekt\u00f3re mened\u017cery uk\u0142adu posiadaj\u0105 r\u00f3wnie\u017c w\u0142asne w\u0142a\u015bciwo\u015bci, kt\u00f3re maj\u0105 wp\u0142yw na uk\u0142ad, np.:<\/p>\n<ul>\n<li data-start=\"1423\" data-end=\"1453\">kierunek (poziomy, pionowy),<\/li>\n<li data-start=\"1456\" data-end=\"1493\">odst\u0119py mi\u0119dzy elementami,<\/li>\n<li data-start=\"1496\" data-end=\"1522\">odst\u0119p mi\u0119dzy wierszami.<\/li>\n<\/ul>\n<p data-start=\"1524\" data-end=\"1724\" data-is-last-node=\"\" data-is-only-node=\"\"><em data-start=\"1524\" data-end=\"1540\">StandardLayout<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"1592\" data-end=\"1608\">StandardLayout<\/em>) wykorzystuje ponadto (ponad poziomem pojedynczego kontenera) linie prowadz\u0105ce (kolumny) do wyr\u00f3wnywania element\u00f3w.<\/p>\n<p data-start=\"0\" data-end=\"327\">Kolejnym zadaniem mened\u017cera uk\u0142adu jest uwzgl\u0119dnianie w\u0142a\u015bciwo\u015bci <em data-start=\"66\" data-end=\"80\">minimumWidth<\/em> \/ <em data-start=\"83\" data-end=\"98\">minimumHeight<\/em>, <em data-start=\"100\" data-end=\"116\">preferredWidth<\/em> \/ <em data-start=\"119\" data-end=\"136\">preferredHeight<\/em>, <em data-start=\"138\" data-end=\"152\">maximumWidth<\/em> \/ <em data-start=\"155\" data-end=\"170\">maximumHeight<\/em> oraz <em data-start=\"176\" data-end=\"188\">alignmentX<\/em> \/ <em data-start=\"191\" data-end=\"203\">alignmentY<\/em> kontenera. Kontener nie mo\u017ce samodzielnie obliczy\u0107 tych warto\u015bci, poniewa\u017c zale\u017c\u0105 one od strategii danego mened\u017cera uk\u0142adu.<\/p>\n<p data-start=\"329\" data-end=\"479\">Poniewa\u017c dost\u0119pne s\u0105 r\u00f3\u017cne uk\u0142ady, programista aplikacji ma praktycznie nieograniczone mo\u017cliwo\u015bci rozmieszczania element\u00f3w zgodnie z w\u0142asn\u0105 koncepcj\u0105.<\/p>\n<p data-start=\"329\" data-end=\"479\"><em><strong>Constraints<\/strong><\/em><\/p>\n<p data-start=\"498\" data-end=\"1129\"><em data-start=\"498\" data-end=\"511\">Constraints<\/em> dostarczaj\u0105 mened\u017cerowi uk\u0142adu dodatkowych informacji o tym, gdzie lub w jaki spos\u00f3b element ma zosta\u0107 pozycjonowany. To, czy mened\u017cer uk\u0142adu wymaga <em data-start=\"661\" data-end=\"674\">Constraints<\/em> oraz w jakiej postaci musz\u0105 one zosta\u0107 przekazane, zale\u017cy od danego mened\u017cera uk\u0142adu. <em data-start=\"761\" data-end=\"772\">BoxLayout<\/em> i zagnie\u017cd\u017cony <em data-start=\"790\" data-end=\"801\">BoxLayout<\/em> nie wymagaj\u0105 \u017cadnych <em data-start=\"823\" data-end=\"836\">Constraints<\/em>, natomiast <em data-start=\"848\" data-end=\"862\">BorderLayout<\/em> oczekuje okre\u015blenia pozycji w postaci sta\u0142ych <em data-start=\"909\" data-end=\"930\">BorderLayout.CENTER<\/em>, <em data-start=\"932\" data-end=\"952\">BorderLayout.NORTH<\/em> itd. <em data-start=\"958\" data-end=\"974\" data-is-only-node=\"\">StandardLayout<\/em> zazwyczaj wymaga jedynie podania numeru kolumny, dopuszcza jednak r\u00f3wnie\u017c u\u017cycie specjalnego obiektu parametru (<em data-start=\"1087\" data-end=\"1127\">com.cisag.pgm.gui.ReferenceConstraints<\/em>).<\/p>\n<p data-start=\"1131\" data-end=\"1373\">Specyfikacja lub przekazanie <em data-start=\"1160\" data-end=\"1173\">Constraints<\/em> dla elementu nast\u0119puje podczas jego dodawania do kontenera (jako dodatkowy parametr metody <em data-start=\"1265\" data-end=\"1272\">add()<\/em>). Decyduj\u0105ce jest przy tym, aby do kontenera zosta\u0142 wcze\u015bniej przypisany odpowiedni mened\u017cer uk\u0142adu.<\/p>\n<h5 data-start=\"1131\" data-end=\"1373\" id=\"standardlayout\" ><span class=\"ez-toc-section\" id=\"StandardLayout\"><\/span>StandardLayout<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"0\" data-end=\"277\"><em data-start=\"0\" data-end=\"16\">StandardLayout<\/em> (<em data-start=\"18\" data-end=\"52\" data-is-only-node=\"\">com.cisag.pgm.gui.StandardLayout<\/em>) jest, jak sama nazwa wskazuje, najcz\u0119\u015bciej stosowanym mened\u017cerem uk\u0142adu w aplikacjach Comarch ERP Enterprise. Jego strategia uk\u0142adu zosta\u0142a zaprojektowana specjalnie do jedno- i wielokolumnowego rozmieszczania p\u00f3l (wraz z etykietami).<\/p>\n<p data-start=\"279\" data-end=\"717\" data-is-last-node=\"\" data-is-only-node=\"\">W kierunku pionowym mened\u017cer uk\u0142adu pracuje z miar\u0105 wysoko\u015bci wiersza (w\u0142a\u015bciwo\u015b\u0107 <em data-start=\"361\" data-end=\"372\">rowHeight<\/em>), do kt\u00f3rej elementy s\u0105 wyr\u00f3wnywane. Elementom zasadniczo przypisywana jest ich preferowana wysoko\u015b\u0107 (<em data-start=\"475\" data-end=\"492\">preferredHeight<\/em>). Punkt pocz\u0105tkowy nast\u0119pnego wiersza wynika nast\u0119pnie z najwy\u017cszego elementu w bie\u017c\u0105cym wierszu, przy czym ten punkt pocz\u0105tkowy jest dodatkowo dopasowywany do rastra wiersza (najbli\u017csza warto\u015b\u0107 podzielna przez <em data-start=\"704\" data-end=\"715\">rowHeight<\/em>).<\/p>\n<p data-start=\"0\" data-end=\"681\">Wyr\u00f3wnanie poziome odbywa si\u0119 za pomoc\u0105 linii prowadz\u0105cych (guides). Definicja linii prowadz\u0105cych jest stosowana przez wszystkie elementy kierowane przez <em data-start=\"154\" data-end=\"170\">StandardLayout<\/em> i zasadniczo jest niezale\u017cna od kontenera. Linie prowadz\u0105ce nie powinny by\u0107 definiowane dla pojedynczego, logicznie oddzielonego kontenera podrz\u0119dnego. Linie prowadz\u0105ce s\u0105 jednak dost\u0119pne dla ka\u017cdego podkontenera (rekurencyjnie), niezale\u017cnie od tego, czy w tym podkontenerze zdefiniowano w\u0142asny mened\u017cer uk\u0142adu. Nowa definicja linii prowadz\u0105cych ma sens tylko wtedy, gdy podkontener faktycznie wymaga innych linii prowadz\u0105cych ni\u017c te odziedziczone, np. gdy maj\u0105 by\u0107 stosowane podzia\u0142y kolumn od 2. kolumny.<\/p>\n<p data-start=\"0\" data-end=\"681\"><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Przy stosowaniu <em data-start=\"712\" data-end=\"728\">StandardLayout<\/em> nale\u017cy pami\u0119ta\u0107, \u017ce nie wszystkie konstrukcje kontener\u00f3w s\u0105 zwi\u0105zane z definicj\u0105 linii prowadz\u0105cych.<\/div><\/section><\/p>\n<p data-start=\"831\" data-end=\"969\">Definicja linii prowadz\u0105cych odbywa si\u0119 poprzez zdefiniowanie kolumn, przy czym dla ka\u017cdej kolumny mo\u017cna okre\u015bli\u0107 do 6 linii prowadz\u0105cych:<\/p>\n<ul>\n<li data-start=\"973\" data-end=\"991\">pocz\u0105tek kolumny<\/li>\n<li data-start=\"994\" data-end=\"1013\">pocz\u0105tek etykiety<\/li>\n<li data-start=\"1016\" data-end=\"1033\">koniec etykiety<\/li>\n<li data-start=\"1036\" data-end=\"1051\">pocz\u0105tek pola<\/li>\n<li data-start=\"1054\" data-end=\"1067\">koniec pola<\/li>\n<li data-start=\"1070\" data-end=\"1086\">koniec kolumny<\/li>\n<\/ul>\n<p data-start=\"1088\" data-end=\"1491\">Definiowanie kolumn lub linii prowadz\u0105cych powinno zasadniczo nast\u0119powa\u0107 poprzez metod\u0119 <em data-start=\"1176\" data-end=\"1189\">setGuides()<\/em> kontenera <em data-start=\"1200\" data-end=\"1215\">VisualElement<\/em>, gdzie przekazywana jest lista obiekt\u00f3w <em data-start=\"1256\" data-end=\"1273\">ListColumnWidth<\/em>. W najprostszym przypadku wystarczy przekaza\u0107 \u017c\u0105dan\u0105 liczb\u0119 kolumn. Mo\u017cliwe jest jednak r\u00f3wnie\u017c precyzyjne definiowanie szeroko\u015bci poszczeg\u00f3lnych kolumn lub nawet odst\u0119p\u00f3w mi\u0119dzy kolumnami.<\/p>\n<p data-start=\"1088\" data-end=\"1491\">Poni\u017csza ilustracja przedstawia <em data-start=\"32\" data-end=\"42\">GroupBox<\/em> z <em data-start=\"45\" data-end=\"61\">StandardLayout<\/em>. W <em data-start=\"65\" data-end=\"75\">GroupBox<\/em> znajduje si\u0119 jedno pole oraz pole typu <em>Subshell<\/em> z pi\u0119cioma polami. <em data-start=\"145\" data-end=\"155\">Subshell<\/em> r\u00f3wnie\u017c posiada <em data-start=\"172\" data-end=\"188\">StandardLayout<\/em> jako mened\u017cera uk\u0142adu. Pola w <em data-start=\"219\" data-end=\"229\">GroupBox<\/em> oraz w <em data-start=\"237\" data-end=\"247\">Subshell<\/em> (chocia\u017c znajduj\u0105 si\u0119 w r\u00f3\u017cnych kontenerach) s\u0105 wyr\u00f3wnane do tych samych linii prowadz\u0105cych.<\/p>\n<p data-start=\"0\" data-end=\"255\">Do utworzenia instancji <em data-start=\"24\" data-end=\"40\">StandardLayout<\/em> nale\u017cy zawsze u\u017cywa\u0107 wy\u0142\u0105cznie konstruktora domy\u015blnego (bez parametr\u00f3w). Po przypisaniu tej instancji do kontenera (np. za pomoc\u0105 <em data-start=\"171\" data-end=\"184\">setLayout()<\/em>) jako mened\u017cera uk\u0142adu, do kontenera mo\u017cna dodawa\u0107 elementy podrz\u0119dne.<\/p>\n<p data-start=\"257\" data-end=\"468\">W metodzie <em data-start=\"268\" data-end=\"275\">add()<\/em> jako <em data-start=\"281\" data-end=\"294\">Constraints<\/em> nale\u017cy przekaza\u0107 \u017c\u0105dany numer kolumny. Numery kolumn s\u0105 liczone od <em>0<\/em> do <em>n-1<\/em> i przekazywane jako ci\u0105g znak\u00f3w (<em data-start=\"408\" data-end=\"416\">String<\/em>). Poni\u017cszy przyk\u0142ad dodaje pole do drugiej kolumny:<\/p>\n<div class=\"relative w-full my-4\">\n<div class=\"\">\n<div class=\"relative\">\n<div class=\"h-full min-h-0 min-w-0\">\n<div class=\"h-full min-h-0 min-w-0\">\n<div class=\"border border-token-border-light border-radius-3xl corner-superellipse\/1.1 rounded-3xl\">\n<div class=\"h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse\/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback\">\n<div class=\"\">\n<div class=\"relative z-0 flex max-w-full\">\n<div id=\"code-block-viewer\" class=\"q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch \u037cs \u037c16\" dir=\"ltr\">\n<div class=\"cm-scroller\">\n<div class=\"cm-content q9tKkq_readonly\"><em>container.add(field, &#8222;1&#8221;);<\/em><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p data-start=\"506\" data-end=\"721\">Je\u017celi element ma rozci\u0105ga\u0107 si\u0119 na wi\u0119cej ni\u017c jedn\u0105 kolumn\u0119, nale\u017cy jako <em data-start=\"579\" data-end=\"592\">Constraints<\/em> przekaza\u0107 numer kolumny pocz\u0105tkowej i ko\u0144cowej, oddzielone my\u015blnikiem. Poni\u017cszy przyk\u0142ad dodaje pole do pierwszych dw\u00f3ch kolumn:<\/p>\n<div class=\"relative w-full my-4\">\n<div class=\"\">\n<div class=\"relative\">\n<div class=\"h-full min-h-0 min-w-0\">\n<div class=\"h-full min-h-0 min-w-0\">\n<div class=\"border border-token-border-light border-radius-3xl corner-superellipse\/1.1 rounded-3xl\">\n<div class=\"h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse\/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback\">\n<div class=\"\">\n<div class=\"relative z-0 flex max-w-full\">\n<div id=\"code-block-viewer\" class=\"q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch \u037cs \u037c16\" dir=\"ltr\">\n<div class=\"cm-scroller\">\n<div class=\"cm-content q9tKkq_readonly\"><em>container.add(field, &#8222;0-1&#8221;);<\/em><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p data-start=\"761\" data-end=\"811\" data-is-last-node=\"\" data-is-only-node=\"\">Poni\u017csza tabela przedstawia mo\u017cliwe <em data-start=\"797\" data-end=\"810\">Constraints<\/em>:<\/p>\n<table style=\"width: 100%; border-collapse: collapse; border-style: outset; border-color: #000000; background-color: #ffffff;\">\n<tbody>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Constraints<\/strong><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><strong>Dzia\u0142anie<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>i<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Element jest wstawiany do kolumny <em data-start=\"84\" data-end=\"87\">i<\/em>, przy czym obowi\u0105zuje: 0 &lt;= <em data-start=\"116\" data-end=\"119\">i<\/em> &lt; N<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>i-j<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Element jest wstawiany do kolumn od <em data-start=\"170\" data-end=\"173\">i<\/em> do <em data-start=\"177\" data-end=\"180\">j<\/em>, przy czym obowi\u0105zuje: 0 &lt;= <em data-start=\"209\" data-end=\"212\">i<\/em> &lt;= <em data-start=\"216\" data-end=\"219\">j<\/em> &lt; N<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>i-<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Element jest wstawiany do kolumn od <em data-start=\"379\" data-end=\"382\">i<\/em> do N-1, przy czym obowi\u0105zuje: 0 &lt;= <em data-start=\"418\" data-end=\"421\">i<\/em> &lt; N<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>i:k<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Element jest wstawiany do kolumny <em data-start=\"470\" data-end=\"473\">i<\/em> na <em data-start=\"477\" data-end=\"480\">k<\/em> kolumn, tzn. do kolumn od <em data-start=\"507\" data-end=\"510\">i<\/em> do <em data-start=\"514\" data-end=\"521\">i+k-1<\/em>, przy czym obowi\u0105zuje: 0 &lt;= <em data-start=\"550\" data-end=\"553\">i<\/em> &lt;= <em data-start=\"557\" data-end=\"564\">i+k-1<\/em> &lt; N<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\"><em>SPAN_ALL_COLUMNS<\/em><\/td>\n<td style=\"width: 50%; border-style: outset; border-color: #000000; background-color: #ffffff;\">Element rozci\u0105ga si\u0119 na wszystkie kolumny<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p data-start=\"4850\" data-end=\"5005\"><strong><em>Definiowanie kolumn<\/em><\/strong><\/p>\n<p data-start=\"24\" data-end=\"250\">Chocia\u017c <em data-start=\"32\" data-end=\"48\">StandardLayout<\/em> umo\u017cliwia definiowanie linii prowadz\u0105cych za pomoc\u0105 odpowiednich konstruktor\u00f3w, nie nale\u017cy z tej mo\u017cliwo\u015bci korzysta\u0107. Zamiast tego nale\u017cy u\u017cywa\u0107 metod <em data-start=\"201\" data-end=\"214\">setGuides()<\/em> kontenera <em data-start=\"225\" data-end=\"249\">VisualElementContainer<\/em>.<\/p>\n<p data-start=\"252\" data-end=\"451\">Przy u\u017cyciu metody<br data-start=\"270\" data-end=\"273\" \/><em data-start=\"273\" data-end=\"371\">setGuides(double[] labelWidth, double[] fieldWidth, double[] leftMargins, double[] rightMargins)<\/em><br data-start=\"371\" data-end=\"374\" \/>mo\u017cna definiowa\u0107 linie prowadz\u0105ce poprzez okre\u015blenie szeroko\u015bci lub odst\u0119p\u00f3w.<\/p>\n<p data-start=\"453\" data-end=\"841\">Tablica <em data-start=\"461\" data-end=\"473\">labelWidth<\/em> definiuje szeroko\u015bci obszaru etykiet dla kolumn. Tablica <em data-start=\"531\" data-end=\"543\">fieldWidth<\/em> definiuje szeroko\u015bci obszaru p\u00f3l dla kolumn. Warto\u015bci musz\u0105 by\u0107 zawsze podawane jako warto\u015bci wzgl\u0119dne do \u0142\u0105cznej dost\u0119pnej szeroko\u015bci. Je\u017celi przyk\u0142adowo zdefiniowano 2 kolumny, a etykiety maj\u0105 zajmowa\u0107 30% dost\u0119pnej szeroko\u015bci kolumny, obie tablice powinny zosta\u0107 obliczone w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n<div class=\"relative w-full my-4\">\n<div class=\"\">\n<div class=\"relative\">\n<div class=\"h-full min-h-0 min-w-0\">\n<div class=\"h-full min-h-0 min-w-0\">\n<div class=\"border border-token-border-light border-radius-3xl corner-superellipse\/1.1 rounded-3xl\">\n<div class=\"h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse\/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback\">\n<div class=\"\">\n<div class=\"relative z-0 flex max-w-full\">\n<div id=\"code-block-viewer\" class=\"q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch \u037cs \u037c16\" dir=\"ltr\">\n<div class=\"cm-scroller\">\n<div class=\"cm-content q9tKkq_readonly\"><em>double wColumn = 1.0 \/ 2.0; \/\/ two columns<\/em><br \/>\n<em>double wLabel = wColumn * 0.3; \/\/ 30 percent<\/em><br \/>\n<em>double wField = wColumn &#8211; wLabel;<\/em><br \/>\n<em>double[] labelWidth = {wLabel, wLabel};<\/em><br \/>\n<em>double[] fieldWidth = {wField, wField};<\/em><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p data-start=\"1072\" data-end=\"1223\">Suma wszystkich szeroko\u015bci powinna zawsze wynosi\u0107 <em>1<\/em>, przy czym uwzgl\u0119dniane s\u0105 wy\u0142\u0105cznie szeroko\u015bci obszaru etykiet i p\u00f3l, bez odst\u0119p\u00f3w (margines\u00f3w).<\/p>\n<p data-start=\"1225\" data-end=\"1398\" data-is-last-node=\"\" data-is-only-node=\"\">Za pomoc\u0105 tablic <em data-start=\"1242\" data-end=\"1255\">leftMargins<\/em> oraz <em data-start=\"1261\" data-end=\"1275\">rightMargins<\/em> mo\u017cna dodatkowo zdefiniowa\u0107 odst\u0119py po lewej i prawej stronie kolumny. Warto\u015bci w tym przypadku podawane s\u0105 w pikselach.<\/p>\n<p data-start=\"1225\" data-end=\"1398\" data-is-last-node=\"\" data-is-only-node=\"\"><strong>Ustawianie dodatkowych w\u0142a\u015bciwo\u015bci<\/strong><\/p>\n<p data-start=\"40\" data-end=\"376\">W\u0142a\u015bciwo\u015b\u0107 <em data-start=\"51\" data-end=\"81\">stretchElementsToColumnWidth<\/em> ma domy\u015blnie warto\u015b\u0107 <em data-start=\"103\" data-end=\"109\">true<\/em>. Powoduje to, \u017ce wszystkie elementy \u2014 niezale\u017cnie od ich zdefiniowanej maksymalnej szeroko\u015bci (<em data-start=\"205\" data-end=\"224\">getMaximumWidth()<\/em>) \u2014 s\u0105 rozszerzane do szeroko\u015bci kolumny. Je\u017celi w\u0142a\u015bciwo\u015b\u0107 ta zostanie ustawiona na <em data-start=\"309\" data-end=\"316\">false<\/em>, w\u00f3wczas uwzgl\u0119dniane s\u0105 odpowiednie maksymalne szeroko\u015bci.<\/p>\n<p data-start=\"378\" data-end=\"493\">Metoda <em data-start=\"385\" data-end=\"414\">setRowHeight(int rowHeight)<\/em> umo\u017cliwia zdefiniowanie wysoko\u015bci wiersza. Warto\u015b\u0107 domy\u015blna wynosi 20 pikseli.<\/p>\n<p data-start=\"495\" data-end=\"647\">Za pomoc\u0105 metody <em data-start=\"512\" data-end=\"531\">setVGap(int vgap)<\/em> mo\u017cna wstawi\u0107 dodatkowy odst\u0119p mi\u0119dzy wierszami. Metoda <em data-start=\"588\" data-end=\"599\">getVGap()<\/em> zwraca ten odst\u0119p. Warto\u015b\u0107 domy\u015blna wynosi<em> 0<\/em>.<\/p>\n<p data-start=\"649\" data-end=\"737\" data-is-last-node=\"\" data-is-only-node=\"\">Przyk\u0142ad zastosowania <em data-start=\"671\" data-end=\"687\">StandardLayout<\/em> mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"720\" data-end=\"736\">StandardLayout<\/em>.<\/p>\n<h6 data-start=\"649\" data-end=\"737\" id=\"referenceconstraints\" ><span class=\"ez-toc-section\" id=\"ReferenceConstraints\"><\/span>ReferenceConstraints<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"34\" data-end=\"429\">Klasa <em data-start=\"40\" data-end=\"80\">com.cisag.pgm.gui.ReferenceConstraints<\/em> s\u0142u\u017cy jako obiekt <em data-start=\"99\" data-end=\"112\">Constraints<\/em> dla <em data-start=\"117\" data-end=\"133\">StandardLayout<\/em>. Podczas gdy proste <em data-start=\"154\" data-end=\"167\">Constraints<\/em> oparte na ci\u0105gach znak\u00f3w zawsze odnosz\u0105 si\u0119 do jednej lub kilku kolumn, przy u\u017cyciu <em data-start=\"252\" data-end=\"274\">ReferenceConstraints<\/em> mo\u017cna realizowa\u0107 r\u00f3wnie\u017c bardziej z\u0142o\u017cone uk\u0142ady. Dzi\u0119ki temu mo\u017cliwe jest np. umieszczenie 2 p\u00f3l obok siebie w tej samej kolumnie (z odst\u0119pem 2 pikseli):<\/p>\n<div class=\"relative w-full my-4\">\n<div class=\"\">\n<div class=\"relative\">\n<div class=\"h-full min-h-0 min-w-0\">\n<div class=\"h-full min-h-0 min-w-0\">\n<div class=\"border border-token-border-light border-radius-3xl corner-superellipse\/1.1 rounded-3xl\">\n<div class=\"h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse\/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback\">\n<div class=\"\">\n<div class=\"relative z-0 flex max-w-full\">\n<div id=\"code-block-viewer\" class=\"q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch \u037cs \u037c16\" dir=\"ltr\">\n<div class=\"cm-scroller\">\n<div class=\"cm-content q9tKkq_readonly\"><em>container.add(<\/em><br \/>\n<em>new ReferenceConstraints(field,<\/em><br \/>\n<em>ReferenceConstraints.RIGHT_OF,<\/em><br \/>\n<em>2));<\/em><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h5 data-start=\"4850\" data-end=\"5005\" id=\"borderlayout\" ><span class=\"ez-toc-section\" id=\"BorderLayout\"><\/span>BorderLayout<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div class=\"flex h-svh w-screen flex-col\">\n<div class=\"relative z-0 flex min-h-0 w-full flex-1\">\n<div class=\"relative flex min-h-0 w-full flex-1\">\n<div class=\"@container\/main relative flex min-w-0 flex-1 flex-col -translate-y-[calc(env(safe-area-inset-bottom,0px)\/2)] pt-[calc(env(safe-area-inset-bottom,0px)\/2)]\">\n<div class=\"@w-sm\/main:[scrollbar-gutter:stable_both-edges] touch:[scrollbar-width:none] relative flex min-h-0 min-w-0 flex-1 flex-col [scrollbar-gutter:stable] not-print:overflow-x-clip not-print:overflow-y-auto scroll-pt-(--header-height) [--sticky-padding-top:var(--header-height)] has-data-[fixed-header=less-than-xl]:@w-xl\/main:scroll-pt-0 has-data-[fixed-header=less-than-xl]:@w-xl\/main:[--sticky-padding-top:0px] has-data-[fixed-header=less-than-xxl]:@w-2xl\/main:scroll-pt-0 has-data-[fixed-header=less-than-xxl]:@w-2xl\/main:[--sticky-padding-top:0px]\" data-scroll-root=\"\"><main id=\"main\" class=\"min-h-0 flex-1\"><\/p>\n<div id=\"thread\" class=\"group\/thread flex flex-col min-h-full\">\n<div class=\"composer-parent flex flex-1 flex-col focus-visible:outline-0\" role=\"presentation\">\n<div class=\"relative basis-auto flex-col -mb-(--composer-overlap-px) [--composer-overlap-px:28px] grow flex\">\n<div class=\"flex flex-col text-sm pb-25\">\n<article class=\"text-token-text-primary w-full focus:outline-none [--shadow-height:45px] has-data-writing-block:pointer-events-none has-data-writing-block:-mt-(--shadow-height) has-data-writing-block:pt-(--shadow-height) [&amp;:has([data-writing-block])&gt;*]:pointer-events-auto scroll-mt-[calc(var(--header-height)+min(200px,max(70px,20svh)))]\" dir=\"auto\" tabindex=\"-1\" data-turn-id=\"request-WEB:5691dd16-e26b-42ad-99b0-3fd178fb31f6-17\" data-testid=\"conversation-turn-36\" data-scroll-anchor=\"true\" data-turn=\"assistant\">\n<div class=\"text-base my-auto mx-auto pb-10 [--thread-content-margin:--spacing(4)] @w-sm\/main:[--thread-content-margin:--spacing(6)] @w-lg\/main:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)\">\n<div class=\"[--thread-content-max-width:40rem] @w-lg\/main:[--thread-content-max-width:48rem] mx-auto max-w-(--thread-content-max-width) flex-1 group\/turn-messages focus-visible:outline-hidden relative flex w-full min-w-0 flex-col agent-turn\" tabindex=\"-1\">\n<div class=\"flex max-w-full flex-col grow\">\n<div class=\"min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&amp;]:mt-1\" dir=\"auto\" data-message-author-role=\"assistant\" data-message-id=\"e01f0f54-b8a6-4253-98dd-39f78931af8c\" data-message-model-slug=\"gpt-5-2\">\n<div class=\"flex w-full flex-col gap-1 empty:hidden first:pt-[1px]\">\n<div class=\"markdown prose dark:prose-invert w-full wrap-break-word dark markdown-new-styling\">\n<p data-start=\"572\" data-end=\"736\">Klasa <em data-start=\"578\" data-end=\"610\">com.cisag.pgm.gui.BorderLayout<\/em> odpowiada pod wzgl\u0119dem zachowania (strategii uk\u0142adu) klasie <em data-start=\"671\" data-end=\"694\">java.awt.BorderLayout<\/em>. Mened\u017cer uk\u0142adu definiuje pi\u0119\u0107 obszar\u00f3w:<\/p>\n<ul>\n<li data-start=\"740\" data-end=\"761\"><em data-start=\"740\" data-end=\"749\">.CENTER<\/em> (\u015brodek),<\/li>\n<li data-start=\"764\" data-end=\"782\"><em data-start=\"764\" data-end=\"772\">.NORTH<\/em> (g\u00f3ra),<\/li>\n<li data-start=\"785\" data-end=\"803\"><em data-start=\"785\" data-end=\"792\">.EAST<\/em> (prawo),<\/li>\n<li data-start=\"806\" data-end=\"827\"><em data-start=\"806\" data-end=\"814\">.SOUTH<\/em> (d\u00f3\u0142) oraz<\/li>\n<li data-start=\"830\" data-end=\"845\"><em data-start=\"830\" data-end=\"837\">.WEST<\/em> (lewo).<\/li>\n<\/ul>\n<p data-start=\"0\" data-end=\"123\">Przy dodawaniu elementu do kontenera z <em data-start=\"39\" data-end=\"53\">BorderLayout<\/em> nale\u017cy jako <em data-start=\"66\" data-end=\"79\">Constraints<\/em> poda\u0107 odpowiedni obszar docelowy. Przyk\u0142adowo, <em><span style=\"color: initial;\">container.add(element, BorderLayout.CENTER);<\/span><\/em><\/p>\n<p data-start=\"191\" data-end=\"397\"><section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">W jednym obszarze mo\u017ce znajdowa\u0107 si\u0119 maksymalnie jeden element. Je\u017celi do danego obszaru ma zosta\u0107 wstawiony nowy element, poprzedni element musi zosta\u0107 wcze\u015bniej usuni\u0119ty za pomoc\u0105 <em data-start=\"386\" data-end=\"396\">remove()<\/em>.<\/div><\/section><\/p>\n<p data-start=\"399\" data-end=\"558\">Obszary okre\u015blaj\u0105 ju\u017c wzgl\u0119dne pozycjonowanie element\u00f3w wzgl\u0119dem siebie. W zakresie ustalania rozmiaru element\u00f3w <em data-start=\"512\" data-end=\"526\">BorderLayout<\/em> stosuje nast\u0119puj\u0105c\u0105 strategi\u0119:<\/p>\n<ul>\n<li data-start=\"562\" data-end=\"699\">Elementy w <em data-start=\"573\" data-end=\"581\">.NORTH<\/em> i <em data-start=\"584\" data-end=\"592\">.SOUTH<\/em> otrzymuj\u0105 swoj\u0105 preferowan\u0105 wysoko\u015b\u0107 (<em data-start=\"631\" data-end=\"648\">preferredHeight<\/em>), niezale\u017cnie od faktycznie dost\u0119pnej wysoko\u015bci.<\/li>\n<li data-start=\"703\" data-end=\"872\">Elementy w <em data-start=\"714\" data-end=\"722\">.NORTH<\/em> i <em data-start=\"725\" data-end=\"733\">.SOUTH<\/em> otrzymuj\u0105 ca\u0142\u0105 szeroko\u015b\u0107 kontenera, niezale\u017cnie od tego, czy jako minimaln\u0105, preferowan\u0105 lub maksymaln\u0105 szeroko\u015b\u0107 zwracaj\u0105 inn\u0105 warto\u015b\u0107.<\/li>\n<li data-start=\"876\" data-end=\"1012\">Elementy w <em data-start=\"887\" data-end=\"894\">.WEST<\/em> i <em data-start=\"897\" data-end=\"904\">.EAST<\/em> otrzymuj\u0105 swoj\u0105 preferowan\u0105 szeroko\u015b\u0107 (<em data-start=\"944\" data-end=\"960\">preferredWidth<\/em>), niezale\u017cnie od faktycznie dost\u0119pnej szeroko\u015bci.<\/li>\n<li data-start=\"1016\" data-end=\"1296\">Elementy w <em data-start=\"1027\" data-end=\"1034\">.WEST<\/em> i <em data-start=\"1037\" data-end=\"1044\">.EAST<\/em> otrzymuj\u0105 pozosta\u0142\u0105 wysoko\u015b\u0107 kontenera, przy czym najpierw uwzgl\u0119dniany jest obszar zaj\u0119ty przez <em data-start=\"1142\" data-end=\"1150\">.NORTH<\/em> i <em data-start=\"1153\" data-end=\"1161\">.SOUTH<\/em>. Wysoko\u015b\u0107 jest przydzielana niezale\u017cnie od tego, jakie warto\u015bci elementy zwracaj\u0105 jako minimaln\u0105, preferowan\u0105 lub maksymaln\u0105 wysoko\u015b\u0107.<\/li>\n<li data-start=\"1016\" data-end=\"1296\">Element w <em data-start=\"12\" data-end=\"21\">.CENTER<\/em> otrzymuje ca\u0142\u0105 pozosta\u0142\u0105 przestrze\u0144. Niezale\u017cnie od tego, jakie warto\u015bci element zwraca jako minimaln\u0105, preferowan\u0105 lub maksymaln\u0105 szeroko\u015b\u0107\/wysoko\u015b\u0107, zajmuje on dost\u0119pne miejsce.<\/li>\n<\/ul>\n<section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">Poniewa\u017c elementy w <em data-start=\"236\" data-end=\"244\">.NORTH<\/em> i <em data-start=\"247\" data-end=\"255\">.SOUTH<\/em> otrzymuj\u0105 swoj\u0105 <em data-start=\"272\" data-end=\"289\" data-is-only-node=\"\">preferredHeight<\/em> r\u00f3wnie\u017c wtedy, gdy kontener nie dysponuje wystarczaj\u0105c\u0105 wysoko\u015bci\u0105, mo\u017ce doj\u015b\u0107 do nak\u0142adania si\u0119 tych element\u00f3w. Je\u017celi element jest wi\u0119kszy ni\u017c kontener, zostanie przyci\u0119ty (<em>clipped<\/em>) na granicy kontenera. Stosowanie <em data-start=\"512\" data-end=\"526\">BorderLayout<\/em> jest zatem sensowne tylko wtedy, gdy zapewnione jest, \u017ce <em data-start=\"584\" data-end=\"601\">preferredHeight<\/em> element\u00f3w w <em data-start=\"614\" data-end=\"622\">.NORTH<\/em> i <em data-start=\"625\" data-end=\"633\">.SOUTH<\/em> nie przekracza dost\u0119pnej wysoko\u015bci kontenera. Zachowanie to dotyczy analogicznie r\u00f3wnie\u017c obszar\u00f3w <em data-start=\"732\" data-end=\"739\">.WEST<\/em> i <em data-start=\"742\" data-end=\"749\">.EAST<\/em>, przy czym w ich przypadku problem dotyczy szeroko\u015bci, a nie wysoko\u015bci.<\/div><\/section>\n<p data-start=\"823\" data-end=\"1143\">Zazwyczaj nie wszystkie pi\u0119\u0107 obszar\u00f3w jest wype\u0142nionych elementami \u2014 cz\u0119sto u\u017cywany jest tylko jeden (najcz\u0119\u015bciej <em data-start=\"937\" data-end=\"946\">.CENTER<\/em>). W opisanej powy\u017cej strategii uk\u0142adu nic si\u0119 jednak nie zmienia: element, kt\u00f3ry nie istnieje (lub ma <em data-start=\"1049\" data-end=\"1064\">visible=false<\/em>), zachowuje si\u0119 tak, jakby jego preferowana szeroko\u015b\u0107 i wysoko\u015b\u0107 wynosi\u0142y <em>0<\/em>.<\/p>\n<p data-start=\"1145\" data-end=\"1401\">Klasa <em data-start=\"1151\" data-end=\"1165\">BorderLayout<\/em> posiada wy\u0142\u0105cznie konstruktor <em data-start=\"1196\" data-end=\"1212\">BorderLayout()<\/em>. Dost\u0119pne s\u0105 dodatkowo w\u0142a\u015bciwo\u015bci <em data-start=\"1248\" data-end=\"1254\">hgap<\/em> oraz <em data-start=\"1260\" data-end=\"1266\">vgap<\/em>. Za pomoc\u0105 tych w\u0142a\u015bciwo\u015bci mo\u017cna wprowadzi\u0107 dodatkowy odst\u0119p mi\u0119dzy obszarami <em data-start=\"1346\" data-end=\"1354\">.NORTH<\/em>\/<em data-start=\"1355\" data-end=\"1363\">CENTER<\/em>\/<em data-start=\"1364\" data-end=\"1371\">SOUTH<\/em> oraz <em data-start=\"1377\" data-end=\"1384\">.WEST<\/em>\/<em data-start=\"1385\" data-end=\"1393\">CENTER<\/em>\/<em data-start=\"1394\" data-end=\"1400\">EAST<\/em>.<\/p>\n<p data-start=\"1145\" data-end=\"1401\"><section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">Zachowanie <em data-start=\"1427\" data-end=\"1441\">BorderLayout<\/em> mo\u017cna r\u00f3wnie\u017c odtworzy\u0107 przy u\u017cyciu <em data-start=\"1478\" data-end=\"1489\">BoxLayout<\/em>, przy czym strategia uk\u0142adu sterowana jest w szczeg\u00f3lno\u015bci w\u0142a\u015bciwo\u015bciami <em data-start=\"1564\" data-end=\"1580\" data-is-only-node=\"\">preferredWidth<\/em>\/<em data-start=\"1581\" data-end=\"1598\">preferredHeight<\/em> oraz <em data-start=\"1604\" data-end=\"1618\">maximumWidth<\/em>\/<em data-start=\"1619\" data-end=\"1634\">maximumHeight<\/em> element\u00f3w. Odpowiednie ustawienie w\u0142a\u015bciwo\u015bci <em data-start=\"1681\" data-end=\"1695\">minimumWidth<\/em>\/<em data-start=\"1696\" data-end=\"1711\">minimumHeight<\/em> pozwala obej\u015b\u0107 opisane powy\u017cej wady <em data-start=\"1748\" data-end=\"1762\">BorderLayout<\/em>. <em data-start=\"1764\" data-end=\"1775\">BoxLayout<\/em> dzia\u0142a zawsze tylko w jednym kierunku (poziomym lub pionowym). W razie potrzeby mo\u017cliwe jest jednak zagnie\u017cd\u017cenie dw\u00f3ch kontener\u00f3w.<\/div><\/section><\/p>\n<h5 data-start=\"1145\" data-end=\"1401\" id=\"boxlayout\" ><span class=\"ez-toc-section\" id=\"BoxLayout\"><\/span>BoxLayout<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"1145\" data-end=\"1401\">Klasa <em data-start=\"27\" data-end=\"56\">com.cisag.pgm.gui.BoxLayout<\/em> odpowiada pod wzgl\u0119dem zachowania (strategii uk\u0142adu) klasie <em data-start=\"117\" data-end=\"140\">javax.swing.BoxLayout<\/em>. Strategia tego mened\u017cera uk\u0142adu polega na rozmieszczeniu wszystkich element\u00f3w w jednym rz\u0119dzie. Wyr\u00f3wnanie tego rz\u0119du mo\u017ce by\u0107 poziome lub pionowe. Zgodnie z zasad\u0105 klock\u00f3w mo\u017cliwe jest jednak zagnie\u017cd\u017canie kilku <em data-start=\"357\" data-end=\"368\">BoxLayout<\/em> o r\u00f3\u017cnych kierunkach.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/article>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p><\/main><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p data-start=\"0\" data-end=\"291\"><em data-start=\"0\" data-end=\"11\">BoxLayout<\/em> nie wymaga <em data-start=\"23\" data-end=\"36\" data-is-only-node=\"\">Constraints<\/em>, lecz pracuje wy\u0142\u0105cznie na podstawie w\u0142a\u015bciwo\u015bci element\u00f3w (<em data-start=\"97\" data-end=\"111\">minimumWidth<\/em> \/ <em data-start=\"114\" data-end=\"129\">minimumHeight<\/em>, <em data-start=\"131\" data-end=\"147\">preferredWidth<\/em> \/ <em data-start=\"150\" data-end=\"167\">preferredHeight<\/em>, <em data-start=\"169\" data-end=\"183\">maximumWidth<\/em> \/ <em data-start=\"186\" data-end=\"201\">maximumHeight<\/em> oraz <em data-start=\"207\" data-end=\"219\">alignmentX<\/em> \/ <em data-start=\"222\" data-end=\"234\">alignmentY<\/em>), kt\u00f3re s\u0105 interpretowane zgodnie z wybranym kierunkiem.<\/p>\n<p data-start=\"293\" data-end=\"1305\" data-is-last-node=\"\" data-is-only-node=\"\">W wybranym kierunku g\u0142\u00f3wnym elementy s\u0105 rozmieszczane obok siebie (lub jeden pod drugim). Zazwyczaj elementy otrzymuj\u0105 przy tym swoj\u0105 <em data-start=\"427\" data-end=\"443\">preferredWidth<\/em> (lub <em data-start=\"449\" data-end=\"466\">preferredHeight<\/em>). Je\u017celi w kontenerze dost\u0119pne jest wi\u0119cej miejsca, ni\u017c elementy potrzebuj\u0105 zgodnie z ich <em data-start=\"557\" data-end=\"573\">preferredWidth<\/em> (lub <em data-start=\"579\" data-end=\"596\">preferredHeight<\/em>), powi\u0119kszane s\u0105 te elementy, kt\u00f3rych <em data-start=\"635\" data-end=\"649\">maximumWidth<\/em> (lub <em data-start=\"655\" data-end=\"670\">maximumHeight<\/em>) na to pozwala. Je\u017celi miejsce nadal pozostaje wolne, jest ono rozdzielane mi\u0119dzy te elementy proporcjonalnie, z uwzgl\u0119dnieniem ich maksymalnego rozmiaru. Je\u017celi kontener nie jest wystarczaj\u0105co du\u017cy, aby wy\u015bwietli\u0107 wszystkie elementy zgodnie z ich <em data-start=\"919\" data-end=\"935\">preferredWidth<\/em> (lub <em data-start=\"941\" data-end=\"958\">preferredHeight<\/em>), elementy s\u0105 zmniejszane, o ile pozwala na to ich <em data-start=\"1010\" data-end=\"1024\">minimumWidth<\/em> (lub <em data-start=\"1030\" data-end=\"1045\">minimumHeight<\/em>). Je\u017celi trzeba zmniejszy\u0107 kilka element\u00f3w, s\u0105 one zmniejszane proporcjonalnie, z uwzgl\u0119dnieniem ich minimalnego rozmiaru. Je\u017celi element\u00f3w nie da si\u0119 ju\u017c wystarczaj\u0105co zmniejszy\u0107, zostaj\u0105 one ewentualnie przyci\u0119te przez granice kontenera.<\/p>\n<p data-start=\"0\" data-end=\"939\"><em data-start=\"0\" data-end=\"11\">BoxLayout<\/em> rozmieszcza elementy nie tylko w wybranym kierunku g\u0142\u00f3wnym, lecz tak\u017ce w drugim wymiarze. Punkty odniesienia definiowane przez w\u0142a\u015bciwo\u015b\u0107 <em data-start=\"150\" data-end=\"162\">alignmentY<\/em> (lub <em data-start=\"168\" data-end=\"180\" data-is-only-node=\"\">alignmentX<\/em>) okre\u015blaj\u0105 (wzgl\u0119dny) punkt odniesienia elementu w kierunku pionowym (lub poziomym), wzgl\u0119dem kt\u00f3rego nast\u0119puje wyr\u00f3wnanie. W odniesieniu do dopasowania do wysoko\u015bci (lub szeroko\u015bci) kontenera obowi\u0105zuj\u0105 podobne zasady jak dla kierunku g\u0142\u00f3wnego, tzn. element jest powi\u0119kszany lub zmniejszany wy\u0142\u0105cznie w zakresie dopuszczalnym przez <em data-start=\"514\" data-end=\"529\">maximumHeight<\/em> \/ <em data-start=\"532\" data-end=\"547\">minimumHeight<\/em> (lub <em data-start=\"553\" data-end=\"567\">maximumWidth<\/em> \/ <em data-start=\"570\" data-end=\"584\">minimumWidth<\/em>). Fakt, \u017ce element zwraca w <em data-start=\"613\" data-end=\"628\">maximumHeight<\/em> (lub <em data-start=\"634\" data-end=\"648\">maximumWidth<\/em>) warto\u015b\u0107 <em data-start=\"658\" data-end=\"675\">Short.MAX_VALUE<\/em>, nie oznacza automatycznie, \u017ce wype\u0142ni on ca\u0142\u0105 wysoko\u015b\u0107 (lub szeroko\u015b\u0107) kontenera. W tym miejscu r\u00f3wnie\u017c w\u0142a\u015bciwo\u015b\u0107 <em data-start=\"792\" data-end=\"804\">alignmentY<\/em> (lub <em data-start=\"810\" data-end=\"822\">alignmentX<\/em>) odgrywa rol\u0119, poniewa\u017c okre\u015bla wzgl\u0119dne wyr\u00f3wnanie wzgl\u0119dem innych element\u00f3w, mimo \u017ce ich rozmiar zosta\u0142 zmieniony.<\/p>\n<p data-start=\"0\" data-end=\"939\"><section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">Znaczenie w\u0142a\u015bciwo\u015bci <em data-start=\"976\" data-end=\"988\" data-is-only-node=\"\">alignmentY<\/em> (lub <em data-start=\"994\" data-end=\"1006\">alignmentX<\/em>) jest cz\u0119sto b\u0142\u0119dnie interpretowane. Nie okre\u015bla ona sposobu wyr\u00f3wnania element\u00f3w wzgl\u0119dem kontenera, lecz spos\u00f3b wyr\u00f3wnania element\u00f3w wzgl\u0119dem siebie. W\u0142a\u015bciwo\u015b\u0107 <em data-start=\"1170\" data-end=\"1182\">alignmentY<\/em> definiuje wzgl\u0119dny punkt odniesienia mi\u0119dzy g\u00f3rn\u0105 (0.0) a doln\u0105 (1.0) kraw\u0119dzi\u0105 elementu. Analogicznie w\u0142a\u015bciwo\u015b\u0107 <em data-start=\"1297\" data-end=\"1309\">alignmentX<\/em> definiuje wzgl\u0119dny punkt odniesienia mi\u0119dzy lew\u0105 (0.0) a praw\u0105 (1.0) kraw\u0119dzi\u0105 elementu. Wyr\u00f3wnanie odbywa si\u0119 poprzez takie przesuni\u0119cie element\u00f3w wzgl\u0119dem siebie, aby ich punkty odniesienia znalaz\u0142y si\u0119 na jednej linii.<\/div><\/section><\/p>\n<p data-start=\"1533\" data-end=\"1908\" data-is-last-node=\"\" data-is-only-node=\"\">W wi\u0119kszo\u015bci zastosowa\u0144 zaleca si\u0119, aby w\u0142a\u015bciwo\u015b\u0107 <em data-start=\"1584\" data-end=\"1596\">alignmentY<\/em> (lub <em data-start=\"1602\" data-end=\"1614\">alignmentX<\/em>) wszystkich element\u00f3w w kontenerze mia\u0142a t\u0119 sam\u0105 warto\u015b\u0107. Mieszanie r\u00f3\u017cnych warto\u015bci (np. element\u00f3w wyr\u00f3wnanych do lewej i wy\u015brodkowanych) jest co prawda mo\u017cliwe, lecz zazwyczaj nie jest zalecane, poniewa\u017c r\u00f3\u017cne ustawienia element\u00f3w mog\u0105 prowadzi\u0107 do nieoczekiwanych rezultat\u00f3w.<\/p>\n<h5 data-start=\"293\" data-end=\"1305\" id=\"flowlayout\" ><span class=\"ez-toc-section\" id=\"FlowLayout\"><\/span>FlowLayout<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"4850\" data-end=\"5005\">W przypadku klasy <em data-start=\"18\" data-end=\"48\">com.cisag.pgm.gui.FlowLayout<\/em> chodzi o prosty mened\u017cer uk\u0142adu, kt\u00f3ry rozmieszcza elementy kontenera w wierszach. Elementy otrzymuj\u0105 przy tym swoj\u0105 preferowan\u0105 szeroko\u015b\u0107, a mened\u017cer uk\u0142adu automatycznie rozpoczyna nowy wiersz, gdy bie\u017c\u0105cy wiersz jest pe\u0142ny.<\/p>\n<p data-start=\"4850\" data-end=\"5005\">W aplikacjach Comarch ERP Enterprise ten mened\u017cer uk\u0142adu praktycznie nie jest u\u017cywany.<\/p>\n<h5 data-start=\"4850\" data-end=\"5005\" id=\"xylayout-xyconstraints\" ><span class=\"ez-toc-section\" id=\"XYLayout_XYConstraints\"><\/span>XYLayout, XYConstraints<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"0\" data-end=\"318\">Klasa <em data-start=\"6\" data-end=\"34\">com.cisag.pgm.gui.XYLayout<\/em> jest przeznaczona do przypadk\u00f3w, w kt\u00f3rych elementy kontenera s\u0105 rozmieszczane r\u0119cznie. Klasa ta dzia\u0142a podobnie jak <em data-start=\"152\" data-end=\"176\">java.awt.LayoutManager<\/em>, jednak nie stosuje strategii uk\u0142adu, lecz umo\u017cliwia ustawianie wsp\u00f3\u0142rz\u0119dnych oraz rozmiar\u00f3w element\u00f3w okre\u015blonych za pomoc\u0105 <em data-start=\"302\" data-end=\"317\">XYConstraints<\/em>.<\/p>\n<p data-start=\"320\" data-end=\"577\">Tego rodzaju podej\u015bcie nadaje si\u0119 wy\u0142\u0105cznie do zastosowa\u0144 specjalnych, poniewa\u017c uk\u0142ady kontener\u00f3w i element\u00f3w nie dostosowuj\u0105 si\u0119 do rozdzielczo\u015bci ekranu ani do rozmiar\u00f3w czcionek. W aplikacjach Comarch ERP Enterprise\u00a0ten mened\u017cer uk\u0142adu praktycznie nie jest u\u017cywany.<\/p>\n<h4 data-start=\"320\" data-end=\"577\" id=\"komponenty-graficzne\" ><span class=\"ez-toc-section\" id=\"Komponenty_graficzne\"><\/span>Komponenty graficzne<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<h5 data-start=\"320\" data-end=\"577\" id=\"border\" ><span class=\"ez-toc-section\" id=\"Border\"><\/span>Border<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"636\" data-end=\"1061\">Wszystkie elementy (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"706\" data-end=\"721\">VisualElement<\/em>) mog\u0105 by\u0107 wyposa\u017cone w ramk\u0119 (<em data-start=\"752\" data-end=\"785\">VisualElement#setBorder(Border)<\/em>). Niekt\u00f3re elementy, takie jak np. pola, przyciski i <em data-start=\"839\" data-end=\"849\">GroupBox<\/em>, posiadaj\u0105 ju\u017c ramk\u0119 i nie mo\u017cna jej zmieni\u0107 (w celu zapewnienia jednolitego wygl\u0105du). \u015awiadome stosowanie ramek jest w aplikacjach Comarch ERP Enterprise\u00a0u\u017cywane zazwyczaj tylko w listach, aby oddzieli\u0107 wiersze od siebie.<\/p>\n<p data-start=\"1063\" data-end=\"1164\">W pakiecie <em data-start=\"1074\" data-end=\"1093\">com.cisag.pgm.gui<\/em> dost\u0119pne s\u0105 r\u00f3\u017cne implementacje interfejsu <em data-start=\"1137\" data-end=\"1163\">com.cisag.pgm.gui.Border<\/em>:<\/p>\n<ul>\n<li data-start=\"1168\" data-end=\"1204\"><em data-start=\"1168\" data-end=\"1202\">com.cisag.pgm.gui.CompoundBorder<\/em><\/li>\n<li data-start=\"1207\" data-end=\"1244\"><em data-start=\"1207\" data-end=\"1242\">com.cisag.pgm.gui.DecoratedBorder<\/em><\/li>\n<li data-start=\"1247\" data-end=\"1280\"><em data-start=\"1247\" data-end=\"1278\">com.cisag.pgm.gui.EmptyBorder<\/em><\/li>\n<li data-start=\"1283\" data-end=\"1313\"><em data-start=\"1283\" data-end=\"1313\" data-is-last-node=\"\">com.cisag.pgm.gui.LineBorder<\/em><\/li>\n<\/ul>\n<p data-start=\"0\" data-end=\"97\">Poni\u017csze klasy s\u0105 przestarza\u0142e lub nie odpowiadaj\u0105 stylowi Comarch ERP Enterprise i nie powinny by\u0107 u\u017cywane:<\/p>\n<ul>\n<li data-start=\"101\" data-end=\"135\"><em data-start=\"101\" data-end=\"133\">com.cisag.pgm.gui.EtchedBorder<\/em><\/li>\n<li data-start=\"138\" data-end=\"178\"><em data-start=\"138\" data-end=\"176\">com.cisag.pgm.gui.LoweredBevelBorder<\/em><\/li>\n<li data-start=\"181\" data-end=\"220\"><em data-start=\"181\" data-end=\"218\">com.cisag.pgm.gui.RaisedBevelBorder<\/em><\/li>\n<li data-start=\"223\" data-end=\"256\"><em data-start=\"223\" data-end=\"254\">com.cisag.pgm.gui.RidgeBorder<\/em><\/li>\n<\/ul>\n<h6 id=\"lineborder\" ><span class=\"ez-toc-section\" id=\"LineBorder\"><\/span>LineBorder<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Klasa <em data-start=\"294\" data-end=\"324\">com.cisag.pgm.gui.LineBorder<\/em> mo\u017ce by\u0107 u\u017cywana do nadania elementowi jednokolorowej, ci\u0105g\u0142ej linii obramowania. W zale\u017cno\u015bci od wybranego konstruktora mo\u017cna okre\u015bli\u0107 kolor i grubo\u015b\u0107 linii. W razie potrzeby grubo\u015b\u0107 mo\u017cna ustawi\u0107 osobno dla ka\u017cdej z czterech stron. Warto\u015b\u0107 <em>0<\/em> oznacza, \u017ce po danej stronie nie jest rysowana \u017cadna linia.<\/p>\n<h6 id=\"decoratedborder\" ><span class=\"ez-toc-section\" id=\"DecoratedBorder\"><\/span>DecoratedBorder<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p>Klasa <em data-start=\"36\" data-end=\"71\">com.cisag.pgm.gui.DecoratedBorder<\/em> oferuje r\u00f3\u017cne style obramowania. Dodatkowo mo\u017cna wybra\u0107 kolor oraz grubo\u015b\u0107 ramki. Ramka jest stosowana do wszystkich czterech stron elementu. Istnieje mo\u017cliwo\u015b\u0107 z\u0142o\u017cenia ramki z kilku <em data-start=\"256\" data-end=\"273\">DecoratedBorder<\/em> przy u\u017cyciu klasy <em data-start=\"292\" data-end=\"308\">CompoundBorder<\/em>.<\/p>\n<div class=\"flex flex-col text-sm pb-25\">\n<article class=\"text-token-text-primary w-full focus:outline-none [--shadow-height:45px] has-data-writing-block:pointer-events-none has-data-writing-block:-mt-(--shadow-height) has-data-writing-block:pt-(--shadow-height) [&amp;:has([data-writing-block])&gt;*]:pointer-events-auto scroll-mt-[calc(var(--header-height)+min(200px,max(70px,20svh)))]\" dir=\"auto\" tabindex=\"-1\" data-turn-id=\"request-WEB:5691dd16-e26b-42ad-99b0-3fd178fb31f6-28\" data-testid=\"conversation-turn-58\" data-scroll-anchor=\"true\" data-turn=\"assistant\">\n<div class=\"text-base my-auto mx-auto pb-10 [--thread-content-margin:--spacing(4)] @w-sm\/main:[--thread-content-margin:--spacing(6)] @w-lg\/main:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)\">\n<div class=\"[--thread-content-max-width:40rem] @w-lg\/main:[--thread-content-max-width:48rem] mx-auto max-w-(--thread-content-max-width) flex-1 group\/turn-messages focus-visible:outline-hidden relative flex w-full min-w-0 flex-col agent-turn\" tabindex=\"-1\">\n<div class=\"flex max-w-full flex-col grow\">\n<div class=\"min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&amp;]:mt-1\" dir=\"auto\" data-message-author-role=\"assistant\" data-message-id=\"aba82850-9839-40fd-84d8-cb6ac6f6163a\" data-message-model-slug=\"gpt-5-2\">\n<div class=\"flex w-full flex-col gap-1 empty:hidden first:pt-[1px]\">\n<div class=\"markdown prose dark:prose-invert w-full wrap-break-word dark markdown-new-styling\">\n<p data-start=\"0\" data-end=\"136\" data-is-last-node=\"\" data-is-only-node=\"\">Do tworzenia instancji <em data-start=\"23\" data-end=\"40\">DecoratedBorder<\/em> dost\u0119pne s\u0105 \u2014 opr\u00f3cz odpowiednich konstruktor\u00f3w \u2014 r\u00f3wnie\u017c metody statyczne (<em data-start=\"117\" data-end=\"125\">createBorder()*)<\/em>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/article>\n<\/div>\n<h6 data-start=\"4850\" data-end=\"5005\" id=\"compoundborder\" ><span class=\"ez-toc-section\" id=\"CompoundBorder\"><\/span>CompoundBorder<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"4850\" data-end=\"5005\">Za pomoc\u0105 klasy <em data-start=\"45\" data-end=\"79\">com.cisag.pgm.gui.CompoundBorder<\/em> mo\u017cliwe jest z\u0142o\u017cenie ramki z innych ramek. Ka\u017cdej stronie ramki przypisywana jest przy tym instancja <em data-start=\"182\" data-end=\"199\">DecoratedBorder<\/em>. Dzi\u0119ki temu mo\u017cna np. zastosowa\u0107 dla ka\u017cdej strony inny styl, inny kolor i\/lub inn\u0105 grubo\u015b\u0107. Zamiast instancji <em data-start=\"312\" data-end=\"329\">DecoratedBorder<\/em> mo\u017cna r\u00f3wnie\u017c u\u017cy\u0107 warto\u015bci <em data-start=\"358\" data-end=\"364\">null<\/em>. W\u00a0takim przypadku po danej stronie nie zostanie dodane obramowanie.<\/p>\n<h6 data-start=\"4850\" data-end=\"5005\" id=\"emptyborder\" ><span class=\"ez-toc-section\" id=\"EmptyBorder\"><\/span>EmptyBorder<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"4850\" data-end=\"5005\">Klasa <em data-start=\"30\" data-end=\"61\">com.cisag.pgm.gui.EmptyBorder<\/em> zachowuje si\u0119 podobnie jak klasa <em data-start=\"95\" data-end=\"107\">LineBorder<\/em>, z t\u0105 r\u00f3\u017cnic\u0105, \u017ce <em data-start=\"126\" data-end=\"133\">linia<\/em> pozostaje niewidoczna (<em data-start=\"157\" data-end=\"172\">transparentna<\/em>). Dzi\u0119ki temu reprezentowany jest jedynie efekt najbardziej zewn\u0119trznego marginesu elementu (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"310\" data-end=\"331\">VisualElement<\/em>). Ze wzgl\u0119du na przejrzysto\u015b\u0107 w tym celu powinna by\u0107 jednak stosowana metoda <em data-start=\"409\" data-end=\"423\">setMargins()<\/em>.<\/p>\n<h5 data-start=\"4850\" data-end=\"5005\" id=\"color\" ><span class=\"ez-toc-section\" id=\"Color\"><\/span>Color<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"447\" data-end=\"654\">Klasa <em data-start=\"453\" data-end=\"478\">com.cisag.pgm.gui.Color<\/em> s\u0142u\u017cy do reprezentacji warto\u015bci kolor\u00f3w, np. do ustawiania koloru pierwszego planu lub koloru t\u0142a elementu (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale<em data-start=\"631\" data-end=\"652\">\u00a0VisualElement<\/em>).<\/p>\n<p data-start=\"656\" data-end=\"1101\">Dla kolor\u00f3w stosowany jest model barw RGBA, tzn. ka\u017cdy kolor jest okre\u015blony przez cztery komponenty. Trzy z tych komponent\u00f3w odpowiadaj\u0105 trzem podstawowym kolorom (<em data-start=\"820\" data-end=\"825\">red<\/em> \u2013 czerwony, <em data-start=\"838\" data-end=\"845\">green<\/em> \u2013 zielony i <em data-start=\"858\" data-end=\"864\">blue<\/em> \u2013 niebieski). Czwarta komponenta (<em data-start=\"899\" data-end=\"902\">A<\/em> lub <em data-start=\"907\" data-end=\"914\">alpha<\/em>) okre\u015bla nieprzezroczysto\u015b\u0107 lub przezroczysto\u015b\u0107 koloru. Zakres warto\u015bci czterech komponent\u00f3w mie\u015bci si\u0119 mi\u0119dzy 0 a 255 (w\u0142\u0105cznie), przy czym warto\u015b\u0107 255 oznacza 100% nieprzezroczysto\u015bci.<\/p>\n<p data-start=\"1103\" data-end=\"1372\">P\u00f3\u0142przezroczyste kolory nie s\u0105 obecnie obs\u0142ugiwane. Jedynym wyj\u0105tkiem jest <em data-start=\"1178\" data-end=\"1197\">color.TRANSPARENT<\/em>. Za pomoc\u0105 <em data-start=\"1209\" data-end=\"1242\">setBackColor(color.TRANSPARENT)<\/em> mo\u017cna spowodowa\u0107, \u017ce standardowy kolor t\u0142a elementu zostanie usuni\u0119ty, tak aby elementowi zosta\u0142a przypisana barwa t\u0142a kontenera.<\/p>\n<p data-start=\"1374\" data-end=\"1854\">Elementy posiadaj\u0105 w odniesieniu do kolor\u00f3w ustawienie wst\u0119pne, kt\u00f3re mo\u017cna zmieni\u0107 w ustawieniach u\u017cytkownika (sekcja <em data-start=\"1493\" data-end=\"1503\">Internet<\/em>). W ten spos\u00f3b warto\u015bci te automatycznie dopasowuj\u0105 si\u0119 np. do motywu. Jawne ustawianie kolor\u00f3w jest jednak dopuszczalne, je\u017celi chodzi o elementy <em data-start=\"1651\" data-end=\"1664\">Look &amp; Feel<\/em>, takie jak t\u0142o przycisk\u00f3w. W tym celu dost\u0119pnych jest wiele standardowych kolor\u00f3w, np. sta\u0142e <em data-start=\"1758\" data-end=\"1771\">Color.BLACK<\/em>, <em data-start=\"1773\" data-end=\"1786\">Color.WHITE<\/em>, <em data-start=\"1788\" data-end=\"1799\">Color.RED<\/em>, <em data-start=\"1801\" data-end=\"1814\">Color.GREEN<\/em>, <em data-start=\"1816\" data-end=\"1828\">Color.BLUE<\/em> oraz <em data-start=\"1834\" data-end=\"1853\">Color.TRANSPARENT<\/em>.<\/p>\n<p data-start=\"1856\" data-end=\"2012\" data-is-last-node=\"\" data-is-only-node=\"\">Klasa <em data-start=\"1862\" data-end=\"1891\">com.cisag.pgm.gui.UIManager<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"1937\" data-end=\"1955\">UIManager<\/em>) umo\u017cliwia dost\u0119p do kolor\u00f3w zale\u017cnych od <em data-start=\"1998\" data-end=\"2011\">Look &amp; Feel<\/em>.<\/p>\n<h5 data-start=\"1856\" data-end=\"2012\" id=\"font\" ><span class=\"ez-toc-section\" id=\"Font\"><\/span>Font<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"15\" data-end=\"291\">Klasa <em data-start=\"21\" data-end=\"45\">com.cisag.pgm.gui.Font<\/em> s\u0142u\u017cy do reprezentacji czcionek i w\u0142a\u015bciwo\u015bci czcionek. Za pomoc\u0105 metody <em data-start=\"119\" data-end=\"148\">VisualElement.setFont(Font)<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"194\" data-end=\"215\">VisualElement<\/em>) mo\u017cna elementowi przypisa\u0107 okre\u015blon\u0105 czcionk\u0119 lub okre\u015blony styl czcionki.<\/p>\n<p data-start=\"15\" data-end=\"291\"><section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">Podobnie jak w przypadku kolor\u00f3w, framework UI wykorzystuje do definiowania czcionek ustawienia <em data-start=\"404\" data-end=\"417\">Look &amp; Feel<\/em> zale\u017cne od kroju pisma. Tak\u017ce w tym przypadku ustawienia te nie powinny by\u0107 w miar\u0119 mo\u017cliwo\u015bci nadpisywane przez bezpo\u015brednie (niezale\u017cne od u\u017cytkownika) warto\u015bci.<\/div><\/section><\/p>\n<p data-start=\"583\" data-end=\"697\">Klasa <em data-start=\"589\" data-end=\"613\">com.cisag.pgm.gui.Font<\/em> udost\u0119pnia dwie statyczne metody (metody fabryczne) do tworzenia obiekt\u00f3w czcionki:<\/p>\n<ul>\n<li data-start=\"701\" data-end=\"733\"><em data-start=\"701\" data-end=\"731\">getFont(int style, int size)<\/em><\/li>\n<li data-start=\"736\" data-end=\"781\"><em data-start=\"736\" data-end=\"781\">getFont(String family, int style, int size)<\/em><\/li>\n<\/ul>\n<p data-start=\"783\" data-end=\"1059\">Druga metoda nie powinna by\u0107 stosowana, poniewa\u017c jawne okre\u015blenie czcionki mo\u017ce powodowa\u0107 problemy: z jednej strony jest ona nadpisywana przez ustawienia u\u017cytkownika, z drugiej strony po stronie klienta nie mo\u017cna zagwarantowa\u0107, \u017ce wskazana czcionka jest rzeczywi\u015bcie dost\u0119pna.<\/p>\n<p data-start=\"1061\" data-end=\"1312\">Przy pierwszej metodzie nie nale\u017cy okre\u015bla\u0107 mo\u017cliwie najmniejszego rozmiaru czcionki, lecz warto\u015b\u0107 okre\u015blon\u0105 przez <em data-start=\"1176\" data-end=\"1195\">Font.DEFAULT_SIZE<\/em>. W ten spos\u00f3b elementy otrzymuj\u0105 odpowiedni\u0105 warto\u015b\u0107 wynikaj\u0105c\u0105 z ustawie\u0144 <em data-start=\"1271\" data-end=\"1284\">Look &amp; Feel<\/em> lub z ustawie\u0144 u\u017cytkownika.<\/p>\n<p data-start=\"1314\" data-end=\"1670\"><section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">W listach i drzewach wymagany jest zredukowany styl czcionki (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w <em data-start=\"1425\" data-end=\"1447\">Comarch ERP Enterprise Styleguide<\/em>). W tym celu zamiast <em data-start=\"1469\" data-end=\"1493\">getFont(Font.PLAIN, 7)<\/em> nale\u017cy stosowa\u0107 <em data-start=\"1510\" data-end=\"1551\">UIManager.getFont(&#8222;ListStyle.font_7pt&#8221;)<\/em>. W tym przypadku warto\u015bci s\u0105 pobierane z <em data-start=\"1593\" data-end=\"1604\">UIManager<\/em>, jednak nie poprzez klucz absolutny, lecz poprzez klucz wzgl\u0119dny.<\/div><\/section><\/p>\n<p data-start=\"1672\" data-end=\"1751\">Dla wyboru stylu czcionki lub atrybut\u00f3w czcionki dost\u0119pne s\u0105 nast\u0119puj\u0105ce sta\u0142e:<\/p>\n<ul>\n<li data-start=\"1755\" data-end=\"1767\"><em data-start=\"1755\" data-end=\"1767\" data-is-last-node=\"\">Font.PLAIN<\/em><\/li>\n<li data-start=\"2\" data-end=\"15\"><em data-start=\"2\" data-end=\"13\">Font.BOLD<\/em><\/li>\n<li data-start=\"18\" data-end=\"33\"><em data-start=\"18\" data-end=\"31\">Font.ITALIC<\/em><\/li>\n<li data-start=\"36\" data-end=\"54\"><em data-start=\"36\" data-end=\"52\">Font.UNDERLINE<\/em><\/li>\n<li data-start=\"57\" data-end=\"79\"><em data-start=\"57\" data-end=\"77\">Font.STRIKETHROUGH<\/em><\/li>\n<li data-start=\"82\" data-end=\"100\"><em data-start=\"82\" data-end=\"98\">Font.SUBSCRIPT<\/em><\/li>\n<\/ul>\n<p>Sta\u0142e mo\u017cna z regu\u0142y \u0142\u0105czy\u0107 ze sob\u0105 (bitowe OR). Jednoczesne u\u017cycie <em data-start=\"191\" data-end=\"207\">Font.SUBSCRIPT<\/em> i <em data-start=\"210\" data-end=\"228\">Font.SUPERSCRIPT<\/em> nie jest mo\u017cliwe. R\u00f3wnie\u017c <em data-start=\"255\" data-end=\"267\">Font.PLAIN<\/em> nie mo\u017ce by\u0107 stosowane razem z <em data-start=\"299\" data-end=\"310\">Font.BOLD<\/em> lub <em data-start=\"315\" data-end=\"328\">Font.ITALIC<\/em>.<\/p>\n<h5 id=\"insets\" ><span class=\"ez-toc-section\" id=\"Insets\"><\/span>Insets<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"353\" data-end=\"563\">Klasa <em data-start=\"359\" data-end=\"385\">com.cisag.pgm.gui.Insets<\/em> s\u0142u\u017cy do okre\u015blania ramek lub odst\u0119p\u00f3w kraw\u0119dziowych w elementach (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdzia\u0142ach <em data-start=\"499\" data-end=\"517\">Odst\u0119py<\/em>, <em data-start=\"519\" data-end=\"540\">VisualElement<\/em> oraz <em data-start=\"546\" data-end=\"561\">\u00a0Border<\/em>).<\/p>\n<p data-start=\"565\" data-end=\"870\">Odst\u0119py kraw\u0119dziowe mo\u017cna ustawia\u0107 dla wszystkich element\u00f3w (<em data-start=\"626\" data-end=\"659\">com.cisag.pgm.gui.VisualElement<\/em>) za pomoc\u0105 metody <em data-start=\"678\" data-end=\"697\">setMargin(Insets)<\/em> lub odczytywa\u0107 za pomoc\u0105 metody <em data-start=\"730\" data-end=\"743\">getMargin()<\/em>. Wszystkie elementy posiadaj\u0105 domy\u015blne odst\u0119py kraw\u0119dziowe, kt\u00f3re s\u0105 zazwyczaj dostosowane do odpowiedniego rozmiaru czcionki.<\/p>\n<p data-start=\"872\" data-end=\"1074\">Do utworzenia obiektu <em data-start=\"894\" data-end=\"902\">Insets<\/em> mo\u017cna u\u017cy\u0107 konstruktora <em data-start=\"927\" data-end=\"977\">Insets(int top, int left, int bottom, int right)<\/em>. Dla ka\u017cdej z czterech stron nale\u017cy przy tym poda\u0107 \u017c\u0105dan\u0105 warto\u015b\u0107 odst\u0119pu jako liczb\u0119 pikseli.<\/p>\n<p data-start=\"1076\" data-end=\"1342\">Zaleca si\u0119 jednak stosowanie do tworzenia <em data-start=\"1118\" data-end=\"1126\">Insets<\/em> klasy <em data-start=\"1133\" data-end=\"1162\">com.cisag.pgm.gui.UIManager<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"1208\" data-end=\"1226\">UIManager<\/em>), poniewa\u017c uwzgl\u0119dnia ona zar\u00f3wno aktualny <em data-start=\"1270\" data-end=\"1283\">Look &amp; Feel<\/em> (motyw), jak i rozmiar czcionki oraz rozdzielczo\u015b\u0107 ekranu.<\/p>\n<p data-start=\"1344\" data-end=\"1433\">Przyk\u0142adowo poni\u017cszy fragment kodu dostarcza standardowe <em data-start=\"1401\" data-end=\"1409\">Insets<\/em> dla widok\u00f3w kontener\u00f3w:<\/p>\n<p data-start=\"1435\" data-end=\"1505\" data-is-last-node=\"\" data-is-only-node=\"\"><em data-start=\"1435\" data-end=\"1505\" data-is-last-node=\"\">UIManager.getUIManager().getInsets(&#8222;Insets.all&#8221;, VisualElement.this)<\/em><\/p>\n<p data-start=\"4850\" data-end=\"5005\">Dzi\u0119ki podaniu elementu <em data-start=\"24\" data-end=\"35\">UIManager<\/em> mo\u017ce uwzgl\u0119dni\u0107 w\u0142a\u015bciwo\u015bci specyficzne dla elementu, takie jak np. rozmiar czcionki. Parametr &#8222;<em data-start=\"131\" data-end=\"145\">Insets.all&#8221;<\/em>\u00a0s\u0142u\u017cy jako klucz dla \u017c\u0105danego rodzaju <em data-start=\"184\" data-end=\"192\">Insets<\/em> (w tym przypadku: <em data-start=\"211\" data-end=\"246\">na wszystkich czterech stronach<\/em>). Odpowiednie klucze s\u0105 zdefiniowane tak\u017ce dla innych rodzaj\u00f3w <em data-start=\"310\" data-end=\"318\">Insets<\/em>.<\/p>\n<h5 data-start=\"4850\" data-end=\"5005\" id=\"icon\" ><span class=\"ez-toc-section\" id=\"Icon\"><\/span>Icon<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"341\" data-end=\"600\">lasa <em data-start=\"347\" data-end=\"371\">com.cisag.pgm.gui.Icon<\/em> s\u0142u\u017cy do reprezentacji element\u00f3w graficznych, piktogram\u00f3w. Ikony s\u0105 zapisywane w repozytorium i zazwyczaj okre\u015blane za pomoc\u0105 dw\u00f3ch w\u0142a\u015bciwo\u015bci (miejsce zapisu, rozmiar) przekazywanych jako obiekt klasy <em data-start=\"575\" data-end=\"599\">com.cisag.pgm.gui.Icon<\/em>.<\/p>\n<p data-start=\"602\" data-end=\"808\">Wy\u015bwietlanie ikon odbywa si\u0119 poprzez odpowiedni element (np. <em data-start=\"663\" data-end=\"670\">Label<\/em>, <em data-start=\"672\" data-end=\"680\">Button<\/em>, <em data-start=\"682\" data-end=\"693\">IconField<\/em>), kt\u00f3ry przekazuje wymagane informacje (miejsce zapisu, rozmiar) za pomoc\u0105 obiektu klasy <em data-start=\"783\" data-end=\"807\">com.cisag.pgm.gui.Icon<\/em>.<\/p>\n<p data-start=\"810\" data-end=\"1127\">Zazwyczaj instancje <em data-start=\"830\" data-end=\"836\">Icon<\/em> s\u0105 tworzone za pomoc\u0105 statycznej metody <em data-start=\"877\" data-end=\"904\">Icon.getIcon(String path)<\/em> lub <em data-start=\"909\" data-end=\"950\">Icon.getIcon(String path, int w, int h)<\/em> w klasie <em data-start=\"960\" data-end=\"970\">Metadata<\/em> (<em data-start=\"972\" data-end=\"997\">Entwicklungsobjekt Icon<\/em>). Przy u\u017cyciu statycznej metody <em data-start=\"1030\" data-end=\"1071\">Icon.getIcon(String path, int w, int h)<\/em> zapisana wielko\u015b\u0107 w repozytorium mo\u017ce zosta\u0107 nadpisana.<\/p>\n<h5 data-start=\"810\" data-end=\"1127\" id=\"uimanager\" ><span class=\"ez-toc-section\" id=\"UIManager\"><\/span>UIManager<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<div class=\"flex flex-col text-sm pb-25\">\n<article class=\"text-token-text-primary w-full focus:outline-none [--shadow-height:45px] has-data-writing-block:pointer-events-none has-data-writing-block:-mt-(--shadow-height) has-data-writing-block:pt-(--shadow-height) [&amp;:has([data-writing-block])&gt;*]:pointer-events-auto scroll-mt-[calc(var(--header-height)+min(200px,max(70px,20svh)))]\" dir=\"auto\" tabindex=\"-1\" data-turn-id=\"request-WEB:ce6cc0f2-4f38-4e2a-a19b-853d8b517e33-6\" data-testid=\"conversation-turn-14\" data-scroll-anchor=\"true\" data-turn=\"assistant\">\n<div class=\"text-base my-auto mx-auto pb-10 [--thread-content-margin:--spacing(4)] @w-sm\/main:[--thread-content-margin:--spacing(6)] @w-lg\/main:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)\">\n<div class=\"[--thread-content-max-width:40rem] @w-lg\/main:[--thread-content-max-width:48rem] mx-auto max-w-(--thread-content-max-width) flex-1 group\/turn-messages focus-visible:outline-hidden relative flex w-full min-w-0 flex-col agent-turn\" tabindex=\"-1\">\n<div class=\"flex max-w-full flex-col grow\">\n<div class=\"min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&amp;]:mt-1\" dir=\"auto\" data-message-author-role=\"assistant\" data-message-id=\"ce6cc0e6-d7c5-4893-a4c1-86f23e5ace0f\" data-message-model-slug=\"gpt-5-3\">\n<div class=\"flex w-full flex-col gap-1 empty:hidden first:pt-[1px]\">\n<div class=\"markdown prose dark:prose-invert w-full wrap-break-word dark markdown-new-styling\">\n<p data-start=\"20\" data-end=\"437\">Klasa <em data-start=\"26\" data-end=\"55\">com.cisag.pgm.gui.UIManager<\/em> zarz\u0105dza wszystkimi w\u0142a\u015bciwo\u015bciami zale\u017cnymi od aktualnego <em data-start=\"115\" data-end=\"128\">Look &amp; Feel<\/em>, kt\u00f3re s\u0105 wykorzystywane przy tworzeniu element\u00f3w interfejsu u\u017cytkownika. Obejmuj\u0105 one w szczeg\u00f3lno\u015bci ustawienia dotycz\u0105ce kolor\u00f3w, czcionek, ikon, ramek oraz odst\u0119p\u00f3w. Dzi\u0119ki centralnemu zarz\u0105dzaniu zapewniony jest jednolity wygl\u0105d powierzchni, a zmiany (<em data-start=\"386\" data-end=\"400\">Face-lifting<\/em>) mog\u0105 by\u0107 przeprowadzane centralnie.<\/p>\n<p data-start=\"439\" data-end=\"774\"><em data-start=\"439\" data-end=\"450\">UIManager<\/em> jest w du\u017cej mierze wykorzystywany przez same elementy, kt\u00f3re pobieraj\u0105 z niego swoje warto\u015bci (parametry), np. jaki kolor ustawiany jest dla paska tytu\u0142u w przypadku <em data-start=\"618\" data-end=\"629\">UIManager<\/em>, jakie ramki stosowane s\u0105 dla przycisk\u00f3w lub jak du\u017ce odst\u0119py kraw\u0119dziowe ustawione s\u0105 w <em data-start=\"719\" data-end=\"726\">Label<\/em> albo jaki kolor ma zaznaczony element w tabeli.<\/p>\n<p data-start=\"776\" data-end=\"1003\">Ustawienia pobierane za pomoc\u0105 <em data-start=\"807\" data-end=\"818\">UIManager<\/em> nie powinny by\u0107 zmieniane. W przeciwnym razie mog\u0142oby doj\u015b\u0107 zar\u00f3wno do automatycznego dopasowania do ustawie\u0144 u\u017cytkownika lub klienta, jak i do utraty sp\u00f3jno\u015bci interfejsu u\u017cytkownika.<\/p>\n<p data-start=\"1005\" data-end=\"1182\">Je\u017celi jednak zmiana ustawie\u0144 wst\u0119pnych jest konieczna, nale\u017cy stosowa\u0107 warto\u015bci wzgl\u0119dne (odwo\u0142ania do <em data-start=\"1109\" data-end=\"1120\">UIManager<\/em>), zamiast ustala\u0107 sta\u0142e warto\u015bci (np. warto\u015bci RGB, piksele).<\/p>\n<p data-start=\"1184\" data-end=\"1380\" data-is-last-node=\"\" data-is-only-node=\"\"><em data-start=\"1184\" data-end=\"1195\">UIManager<\/em> udost\u0119pnia r\u00f3wnie\u017c aktywn\u0105 tabel\u0119 (<em data-start=\"1231\" data-end=\"1236\">Map<\/em>), w kt\u00f3rej w\u0142a\u015bciwo\u015bci zale\u017cne od <em data-start=\"1271\" data-end=\"1284\">Look &amp; Feel<\/em> s\u0105 zapisywane jako pary klucz-warto\u015b\u0107 (<em data-start=\"1324\" data-end=\"1335\">Key\/Value<\/em>). Do zapyta\u0144 dost\u0119pne s\u0105 nast\u0119puj\u0105ce metody:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<ul>\n<li class=\"z-0 flex min-h-[46px] justify-start\"><em>public Border getBorder(Object key)<\/em><\/li>\n<li class=\"z-0 flex min-h-[46px] justify-start\"><em>public Color getColor(Object key)<\/em><\/li>\n<li class=\"z-0 flex min-h-[46px] justify-start\"><em>public Font getFont(Object key)<\/em><\/li>\n<li class=\"z-0 flex min-h-[46px] justify-start\"><em>public Icon getIcon(Object key)<\/em><\/li>\n<li class=\"z-0 flex min-h-[46px] justify-start\"><em>public Insets getInsets(Object key)<\/em><\/li>\n<li class=\"z-0 flex min-h-[46px] justify-start\"><em>public Insets getInsets(Object key,VisualElement elem)<\/em><\/li>\n<li class=\"z-0 flex min-h-[46px] justify-start\"><em>public int getInt(Object key)<\/em><\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/article>\n<\/div>\n<div class=\"pointer-events-none h-px w-px absolute bottom-0\" aria-hidden=\"true\" data-edge=\"true\">\n<p data-start=\"0\" data-end=\"67\">Jako klucz (<em data-start=\"12\" data-end=\"17\">key<\/em>) zawsze stosowany jest \u0142a\u0144cuch znak\u00f3w (<em data-start=\"57\" data-end=\"65\">String<\/em>).<\/p>\n<p data-start=\"69\" data-end=\"191\">Instancj\u0119 <em data-start=\"79\" data-end=\"90\">UIManager<\/em>, kt\u00f3ra obowi\u0105zuje dla danej aplikacji, mo\u017cna uzyska\u0107 za pomoc\u0105 (statycznej) metody <em data-start=\"174\" data-end=\"190\">getUIManager()<\/em>.<\/p>\n<h6 data-start=\"69\" data-end=\"191\" id=\"kolory\" ><span class=\"ez-toc-section\" id=\"Kolory\"><\/span>Kolory<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"217\" data-end=\"572\">Aby umo\u017cliwi\u0107 stosowanie schemat\u00f3w kolorystycznych zale\u017cnych od u\u017cytkownika (<em data-start=\"294\" data-end=\"302\">Themes<\/em>), UI-framework wykorzystuje palet\u0119 z kolorami logicznymi. Obecnie paleta ta obejmuje \u0142\u0105cznie 21 wpis\u00f3w (15 kolor\u00f3w g\u0142\u00f3wnych i 6 kolor\u00f3w dodatkowych). Wyb\u00f3r schematu kolorystycznego przez u\u017cytkownika powoduje, \u017ce te 21 wpis\u00f3w zostaje przypisanych do konkretnych kolor\u00f3w.<\/p>\n<p data-start=\"574\" data-end=\"744\">Dost\u0119p do aktualnych kolor\u00f3w palety mo\u017cliwy jest za pomoc\u0105 kluczy <em data-start=\"640\" data-end=\"652\">&#8222;primary1&#8221;<\/em>, <em data-start=\"654\" data-end=\"666\">&#8222;primary2&#8221;<\/em>, &#8230;, <em data-start=\"673\" data-end=\"686\">&#8222;primary15&#8221;<\/em> oraz <em data-start=\"692\" data-end=\"706\">&#8222;secondary1&#8221;<\/em>, <em data-start=\"708\" data-end=\"722\">&#8222;secondary2&#8221;<\/em>, &#8230;, <em data-start=\"729\" data-end=\"743\">&#8222;secondary6&#8221;<\/em>. Przyk\u0142adowo: <em data-start=\"760\" data-end=\"807\" data-is-last-node=\"\">UIManager.getUIManager().getColor(&#8222;primary1&#8221;).<\/em><\/p>\n<h4 data-start=\"574\" data-end=\"744\" id=\"komponenty-sterujace\" ><span class=\"ez-toc-section\" id=\"Komponenty_sterujace\"><\/span>Komponenty steruj\u0105ce<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<h5 data-start=\"574\" data-end=\"744\" id=\"action-actionlistener\" ><span class=\"ez-toc-section\" id=\"Action_ActionListener\"><\/span>Action, ActionListener<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"66\" data-end=\"360\">Zazwyczaj aplikacja udost\u0119pnia szereg funkcji, kt\u00f3re u\u017cytkownik mo\u017ce wywo\u0142a\u0107 bezpo\u015brednio, np. za pomoc\u0105 przycisk\u00f3w lub ikon. W Comarch ERP Enterprise funkcje te s\u0105 reprezentowane przez tzw. <em data-start=\"293\" data-end=\"302\">Actions<\/em>. Obiekty <em data-start=\"312\" data-end=\"321\">Actions<\/em> wykonuj\u0105 przy tym nast\u0119puj\u0105ce zadania:<\/p>\n<ul>\n<li data-start=\"364\" data-end=\"393\">identyfikator funkcji (ID)<\/li>\n<li data-start=\"396\" data-end=\"606\">udost\u0119pnienie informacji na potrzeby wizualizacji, w szczeg\u00f3lno\u015bci tekst\u00f3w (etykieta, <em>ToolTip<\/em>, pomoc kontekstowa) oraz ikon. Dane te s\u0105 zazwyczaj przechowywane w repozytoriach.<\/li>\n<li data-start=\"609\" data-end=\"783\">zarz\u0105dzanie (dynamicznymi) stanami. Za pomoc\u0105 stanu <em data-start=\"661\" data-end=\"670\">enabled<\/em> sygnalizowane jest np., \u017ce powi\u0105zana funkcja jest wywo\u0142ywalna, czyli mo\u017ce zosta\u0107 wykonana przez u\u017cytkownika.<\/li>\n<li data-start=\"786\" data-end=\"871\">obiekt mo\u017ce rejestrowa\u0107 zarejestrowane obiekty <em data-start=\"833\" data-end=\"849\">ActionListener<\/em> (\u017ar\u00f3d\u0142o zdarzenia)<\/li>\n<li data-start=\"874\" data-end=\"1023\">obiekt, na podstawie zarejestrowanego zdarzenia, mo\u017ce udost\u0119pnia\u0107 dodatkowe informacje (parametry), kt\u00f3re mog\u0105 by\u0107 odczytywane przez obiekty <em data-start=\"1015\" data-end=\"1022\">Event<\/em><\/li>\n<\/ul>\n<p data-start=\"1025\" data-end=\"1145\">Ponadto <em data-start=\"1033\" data-end=\"1042\">Actions<\/em> s\u0142u\u017c\u0105 do rejestrowania si\u0119 przy elementach dla okre\u015blonych zdarze\u0144 (np. dwuklik, wyb\u00f3r elementu itd.).<\/p>\n<p data-start=\"1147\" data-end=\"1263\">Obiekt <em data-start=\"1154\" data-end=\"1162\">Action<\/em> tworzy si\u0119 np. przy u\u017cyciu konstruktora <em data-start=\"1205\" data-end=\"1262\">Action(int id, String abspath, ActionListener listener)<\/em>.<\/p>\n<p data-start=\"1265\" data-end=\"1519\">Parametr <em data-start=\"1274\" data-end=\"1278\">id<\/em> s\u0142u\u017cy p\u00f3\u017aniejszej identyfikacji akcji (umo\u017cliwia to m.in. metod\u0119 <em data-start=\"1344\" data-end=\"1362\">actionListener()<\/em>). Parametr <em data-start=\"1374\" data-end=\"1383\">abspath<\/em> okre\u015bla bezwzgl\u0119dn\u0105 \u015bcie\u017ck\u0119 do repozytorium, a obiekt <em data-start=\"1438\" data-end=\"1454\">ActionListener<\/em> mo\u017ce zosta\u0107 zarejestrowany ju\u017c w konstruktorze obiektu <em data-start=\"1510\" data-end=\"1518\">Action<\/em>.<\/p>\n<p data-start=\"1265\" data-end=\"1519\"><section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">Samodzielnie nadawane identyfikatory powinny mie\u015bci\u0107 si\u0119 w zakresie od 1 do 999, aby nie dochodzi\u0142o do konflikt\u00f3w ze standardowymi identyfikatorami.<\/div><\/section><\/p>\n<p data-start=\"0\" data-end=\"306\">Dla standardowych <em data-start=\"20\" data-end=\"29\">Actions<\/em>, takich jak np. zapisywanie czy usuwanie, zdefiniowano sta\u0142e jako identyfikatory (np. <em data-start=\"119\" data-end=\"134\">Action.UPLOAD<\/em>, <em data-start=\"136\" data-end=\"151\">Action.DELETE<\/em>, <em data-start=\"153\" data-end=\"168\">Action.UPDATE<\/em>). Dodatkowo dost\u0119pne s\u0105 dla standardowych <em data-start=\"211\" data-end=\"220\">Actions<\/em> r\u00f3\u017cne metody fabryczne (np. <em data-start=\"249\" data-end=\"266\">getLoadAction()<\/em>) oraz metoda <em data-start=\"280\" data-end=\"303\">getLoadAction(int id)<\/em>.<\/p>\n<p data-start=\"308\" data-end=\"542\">Obiekt <em data-start=\"308\" data-end=\"327\">Action<\/em>\u00a0dysponuje w\u0142a\u015bciwo\u015bci\u0105 <em data-start=\"351\" data-end=\"360\">allowed<\/em> oraz w\u0142a\u015bciwo\u015bci\u0105 <em data-start=\"379\" data-end=\"388\">enabled<\/em>, kt\u00f3re informuj\u0105, czy akcja jest mo\u017cliwa lub czy jest aktualnie aktywna. W\u0142a\u015bciwo\u015bci te mo\u017cna zmienia\u0107 lub odczytywa\u0107 za pomoc\u0105 odpowiednich metod <em data-start=\"536\" data-end=\"541\">set<\/em>.<\/p>\n<p data-start=\"544\" data-end=\"695\">W\u0142a\u015bciwo\u015bci <em data-start=\"556\" data-end=\"565\">enabled<\/em> oraz <em data-start=\"571\" data-end=\"580\">allowed<\/em> s\u0105 ze sob\u0105 powi\u0105zane, tzn. akcja jest aktywna (<em data-start=\"628\" data-end=\"637\">enabled<\/em>) tylko wtedy, gdy w\u0142a\u015bciwo\u015b\u0107 <em data-start=\"667\" data-end=\"676\">allowed<\/em> ma warto\u015b\u0107 <em data-start=\"688\" data-end=\"694\">true<\/em>.<\/p>\n<p data-start=\"697\" data-end=\"906\">Interpretacja <em data-start=\"711\" data-end=\"728\">Default-Actions<\/em> zale\u017cy od kontekstu. W menu kontekstowych <em data-start=\"771\" data-end=\"788\">Default-Actions<\/em> s\u0105 oznaczane (poprzez pogrubienie). W <em data-start=\"827\" data-end=\"841\">SmartButtons<\/em> <em data-start=\"842\" data-end=\"858\">Default-Action<\/em> jest powi\u0105zana z g\u0142\u00f3wn\u0105 powierzchni\u0105 przycisku.<\/p>\n<\/div>\n<h5 data-start=\"697\" data-end=\"906\" id=\"actionlist\" ><span class=\"ez-toc-section\" id=\"ActionList\"><\/span>ActionList<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"697\" data-end=\"906\">Klasa <em data-start=\"942\" data-end=\"972\">com.cisag.app.gui.ActionList<\/em> umo\u017cliwia \u0142\u0105czenie wielu <em data-start=\"998\" data-end=\"1007\">Actions<\/em> w jednym obiekcie. Taki obiekt <em data-start=\"1039\" data-end=\"1051\">ActionList<\/em> mo\u017ce zosta\u0107 wykorzystany np. do utworzenia przycisku menu (<em data-start=\"1111\" data-end=\"1123\">MenuButton<\/em>).<\/p>\n<h3 data-start=\"697\" data-end=\"906\" id=\"przyklady-zastosowan\" ><span class=\"ez-toc-section\" id=\"Przyklady_zastosowan\"><\/span>Przyk\u0142ady zastosowa\u0144<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p data-start=\"697\" data-end=\"906\">W tym rozdziale przedstawiono kilka przyk\u0142ad\u00f3w typowych zada\u0144 GUI. W przyk\u0142adach wykorzystywane s\u0105 cz\u0119\u015bciowo klasy i obiekty biznesowe, takie jak rzeczywiste aplikacje Comarch ERP Enterprise, jednak s\u0105 one od nich ca\u0142kowicie niezale\u017cne.<\/p>\n<h4 data-start=\"697\" data-end=\"906\" id=\"zastosowanie-menedzerow-ukladu\" ><span class=\"ez-toc-section\" id=\"Zastosowanie_menedzerow_ukladu\"><\/span>Zastosowanie mened\u017cer\u00f3w uk\u0142adu<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<h5 data-start=\"697\" data-end=\"906\" id=\"standardlayout\" ><span class=\"ez-toc-section\" id=\"StandardLayout-2\"><\/span>StandardLayout<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"333\" data-end=\"914\">Poni\u017cszy przyk\u0142ad pokazuje, jak mo\u017cna zdefiniowa\u0107 wielokolumnowe uk\u0142ady (<em data-start=\"406\" data-end=\"415\">Layouts<\/em>) dla element\u00f3w (p\u00f3l) na ca\u0142kowicie pustej powierzchni. Podstaw\u0105 takiego uk\u0142adu jest mened\u017cer uk\u0142adu <em data-start=\"516\" data-end=\"547\">StandardLayout-Layout-Manager<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"561\" data-end=\"577\">StandardLayout<\/em>). Mened\u017cer ten kieruje si\u0119 liniami prowadz\u0105cymi dla odpowiednich zakres\u00f3w (w tym przypadku osi <em data-start=\"673\" data-end=\"676\">y<\/em>). Po utworzeniu struktury linie prowadz\u0105ce s\u0105 dziedziczone przez nadrz\u0119dny kontener, kt\u00f3ry je definiuje. Je\u015bli elementy maj\u0105 by\u0107 rozmieszczone na kilku kontenerach wed\u0142ug wsp\u00f3lnych linii, linie te powinny zosta\u0107 zdefiniowane tylko raz.<\/p>\n<p data-start=\"957\" data-end=\"1088\">W przyk\u0142adzie linie prowadz\u0105ce dla kolumn s\u0105 zdefiniowane w zewn\u0119trznym kontenerze. Wykorzystanie odbywa si\u0119 poprzez <em data-start=\"1074\" data-end=\"1087\">setGuides()<\/em>.<\/p>\n<p data-start=\"1090\" data-end=\"1116\">Przyk\u0142ad pokazuje ponadto:<\/p>\n<ul>\n<li>przypisywanie element\u00f3w do jednej lub kilku kolumn<\/li>\n<li>wykorzystywanie metadanych do tworzenia p\u00f3l<\/li>\n<li>wykorzystywanie \u015bcie\u017cek wzgl\u0119dnych dla metadanych (\u015bcie\u017cka bazowa na poziomie kontenera)<\/li>\n<li data-start=\"2\" data-end=\"64\">wyb\u00f3r trybu wyboru na poziomie kontenera dla wszystkich p\u00f3l<\/li>\n<li data-start=\"67\" data-end=\"137\">kolejno\u015b\u0107 dotycz\u0105ca tworzenia, dodawania i konfigurowania element\u00f3w<\/li>\n<li data-start=\"140\" data-end=\"166\">wykorzystanie <em data-start=\"154\" data-end=\"165\">Subshelfs<\/em><\/li>\n<\/ul>\n<p><em>&#8230;<\/em><br \/>\n<em>import com.cisag.app.general.gui.ItemField;<\/em><br \/>\n<em>&#8230;<\/em><br \/>\n<em>import com.cisag.pgm.gui.BooleanField;<\/em><br \/>\n<em>import com.cisag.pgm.gui.Shelf;<\/em><br \/>\n<em>import com.cisag.pgm.gui.StandardLayout;<\/em><br \/>\n<em>import com.cisag.pgm.gui.TextField;<\/em><br \/>\n<em>import com.cisag.pgm.gui.ValueSetField;<\/em><br \/>\n<em>import com.cisag.pgm.gui.View;<\/em><br \/>\n<em>&#8230;<\/em><br \/>\n<em>public class ExampleApplication extends CisUiApplication {<\/em><\/p>\n<p><em>&#8230;<\/em><br \/>\n<em>private ItemField number;<\/em><br \/>\n<em>private TextField description;<\/em><br \/>\n<em>private ValueSetField type;<\/em><br \/>\n<em>private ValueSetField materialType;<\/em><br \/>\n<em>private ValueSetField status;<\/em><br \/>\n<em>private TextField ean;<\/em><br \/>\n<em>private BooleanField purchaseItem;<\/em><br \/>\n<em>private BooleanField inventoryItem;<\/em><br \/>\n<em>private BooleanField salesItem;<\/em><br \/>\n<em>private BooleanField productionItem;<\/em><br \/>\n<em>&#8230;<\/em><\/p>\n<p><em>\/**<\/em><br \/>\n<em>* utworzenie obszaru identyfikacyjnego.<\/em><br \/>\n<em>*\/<\/em><br \/>\n<em>protected void createIdentArea() {<\/em><br \/>\n<em>View pane = getIdentPane();<\/em><\/p>\n<p><em>\/\/ zdefiniowanie dwukolumnowego uk\u0142adu dla ca\u0142ego obszaru identyfikacyjnego<\/em><br \/>\n<em>pane.setGuides(2);<\/em><br \/>\n<em>pane.setLayout(new StandardLayout());<\/em><\/p>\n<p><em>\/\/ zdefiniowanie \u015bcie\u017cki bazowej dla metadanych<\/em><br \/>\n<em>pane.setPath(&#8222;com.cisag.app.general.obj.item:&#8221;);<\/em><\/p>\n<p><em>\/\/ wyb\u00f3r trybu wyboru dla wszystkich p\u00f3l<\/em><br \/>\n<em>pane.setSelectionView(true);<\/em><\/p>\n<p><em>\/\/ tworzenie p\u00f3l (\u015bcie\u017cki wzgl\u0119dne dla metadanych)<\/em><br \/>\n<em>number = new ItemField(Guid.AUTOGUID, &#8222;.number&#8221;, true);<\/em><br \/>\n<em>description = new TextField(Guid.AUTOGUID, &#8222;.description&#8221;);<\/em><br \/>\n<em>type = new ValueSetField(Guid.AUTOGUID, &#8222;.type&#8221;);<\/em><br \/>\n<em>materialType = new ValueSetField(Guid.AUTOGUID, &#8222;.materialType&#8221;);<\/em><br \/>\n<em>status = new ValueSetField(Guid.AUTOGUID, &#8222;.status&#8221;);<\/em><br \/>\n<em>ean = new TextField(Guid.AUTOGUID, &#8222;.ean&#8221;);<\/em><br \/>\n<em>purchaseItem = new BooleanField(Guid.AUTOGUID, &#8222;.purchaseItem&#8221;);<\/em><br \/>\n<em>inventoryItem = new BooleanField(Guid.AUTOGUID, &#8222;.inventoryItem&#8221;);<\/em><br \/>\n<em>salesItem = new BooleanField(Guid.AUTOGUID, &#8222;.salesItem&#8221;);<\/em><br \/>\n<em>productionItem= new BooleanField(Guid.AUTOGUID, &#8222;.productionItem&#8221;);<\/em><\/p>\n<p><em>\/\/ dodawanie p\u00f3l<\/em><br \/>\n<em>\/\/ pierwszy wiersz<\/em><br \/>\n<em>pane.add(number, &#8222;0&#8221;); \/\/ kolumna 1<\/em><br \/>\n<em>pane.add(description, &#8222;1&#8221;); \/\/ kolumna 2<\/em><\/p>\n<p><em>\/\/ drugi wiersz<\/em><br \/>\n<em>pane.add(type, &#8222;0&#8221;); \/\/ kolumna 1<\/em><br \/>\n<em>pane.add(materialType, &#8222;1&#8221;); \/\/ kolumna 2<\/em><\/p>\n<p><em>\/\/ utworzenie (sub-)Shelf dla kolejnych p\u00f3l\/wierszy<\/em><br \/>\n<em>Shelf subshelf = new Shelf(Guid.AUTOGUID);<\/em><\/p>\n<p><em>\/\/ StandardLayout jako Default-Action dla struktury Shelf<\/em><br \/>\n<em>subshelf.setLayout(new StandardLayout());<\/em><\/p>\n<p><em>\/\/ dodanie Shelf do kontenera, aby wykorzysta\u0107 wszystkie kolumny<\/em><br \/>\n<em>pane.add(subshelf, StandardLayout.SPAN_ALL_COLUMNS);<\/em><\/p>\n<p><em>\/\/ wyb\u00f3r trybu wyboru r\u00f3wnie\u017c dla wszystkich p\u00f3l struktury Shelf<\/em><br \/>\n<em>subshelf.setSelectionView(true);<\/em><\/p>\n<p><em>\/\/ okre\u015blenie, \u017ce Shelf ma by\u0107 \u201ezwi\u00adni\u0119ty\u201d przy starcie<\/em><br \/>\n<em>subshelf.setCollapsed(true);<\/em><\/p>\n<p><em>\/\/ dodanie poni\u017cszych p\u00f3l\/wierszy do Shelf<\/em><br \/>\n<em>\/\/ trzeci wiersz<\/em><br \/>\n<em>subshelf.add(status, &#8222;0&#8221;);<\/em><br \/>\n<em>subshelf.add(ean, &#8222;1&#8221;);<\/em><\/p>\n<p><em>\/\/ czwarty wiersz<\/em><br \/>\n<em>&#8230;<\/em><\/p>\n<p><em>subshelf.add(purchaseItem, &#8222;0&#8221;);<\/em><br \/>\n<em>subshelf.add(inventoryItem, &#8222;1&#8221;);<\/em><\/p>\n<p><em>\/\/ pi\u0105ty wiersz<\/em><br \/>\n<em>subshelf.add(salesItem, &#8222;0&#8221;);<\/em><br \/>\n<em>subshelf.add(productionItem,&#8221;1&#8243;);<\/em><\/p>\n<p><em>&#8230;<\/em><br \/>\n<em>}<\/em><br \/>\n<em>&#8230;<\/em><br \/>\n<em>}<\/em><\/p>\n<h5 id=\"boxlayout\" ><span class=\"ez-toc-section\" id=\"BoxLayout-2\"><\/span>BoxLayout<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"201\" data-end=\"292\">Przyk\u0142ad przedstawia zastosowanie i spos\u00f3b dzia\u0142ania mened\u017cera uk\u0142adu <em data-start=\"280\" data-end=\"291\">BoxLayout<\/em>.<\/p>\n<p data-start=\"353\" data-end=\"675\" data-is-last-node=\"\" data-is-only-node=\"\">W przyk\u0142adzie wykorzystano dwie instancje <em data-start=\"395\" data-end=\"406\">BoxLayout<\/em>. Pierwsza instancja znajduje si\u0119 w <em data-start=\"442\" data-end=\"456\">Content-Pane<\/em> okna dialogowego i rozmieszcza jego elementy pionowo. W dolnej cz\u0119\u015bci <em data-start=\"527\" data-end=\"541\">Content-Pane<\/em> znajduje si\u0119 <em data-start=\"555\" data-end=\"561\">View<\/em>, kt\u00f3ry zawiera dwa przyciski [<strong data-start=\"592\" data-end=\"598\">OK<\/strong>] i [<strong data-start=\"603\" data-end=\"613\">Anuluj<\/strong>]. Do tego <em data-start=\"624\" data-end=\"630\">View<\/em> przypisano <em data-start=\"642\" data-end=\"653\">BoxLayout<\/em> z orientacj\u0105 poziom\u0105.<\/p>\n<p data-start=\"353\" data-end=\"675\" data-is-last-node=\"\" data-is-only-node=\"\"><section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">W aplikacjach Comarch ERP Enterprise nale\u017cy stosowa\u0107 klas\u0119 <em data-start=\"76\" data-end=\"105\">com.cisag.pgm.gui.ButtonBar<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"119\" data-end=\"130\">ButtonBar<\/em>), je\u015bli w oknie dialogowym ma by\u0107 wy\u015bwietlany jeden lub kilka przycisk\u00f3w. Klasa ta nie tylko zmniejsza nak\u0142ad pracy, ale r\u00f3wnie\u017c zapewnia stosowanie jednolitego sposobu rozmieszczania element\u00f3w uk\u0142adu we wszystkich oknach dialogowych.<\/div><\/section><\/p>\n<p data-start=\"0\" data-end=\"238\">Aby uzyska\u0107 niewielki odst\u0119p mi\u0119dzy elementami, w przyk\u0142adzie wykorzystano <em data-start=\"75\" data-end=\"83\">Struts<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"97\" data-end=\"104\">Strut<\/em>). W podkontenerze z dwoma przyciskami dodatkowo zastosowano (poziomy) <em data-start=\"175\" data-end=\"181\">Glue<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"195\" data-end=\"201\">Glue<\/em>), aby przesun\u0105\u0107 przyciski w prawo.<\/p>\n<p data-start=\"240\" data-end=\"542\">W przypadku <em data-start=\"252\" data-end=\"259\">Label<\/em> oraz pola tekstowego (<em data-start=\"282\" data-end=\"302\">MultiLineTextField<\/em>) konieczna jest zmiana wyr\u00f3wnania poziomego za pomoc\u0105 <em data-start=\"357\" data-end=\"372\">setAlignmentX<\/em> (<em data-start=\"374\" data-end=\"406\">VisualElement.CENTER_ALIGNMENT<\/em>), poniewa\u017c w tym miejscu warto\u015bci domy\u015blne s\u0105 ustawione na <em data-start=\"466\" data-end=\"496\">VisualElement.LEFT_ALIGNMENT<\/em>, co nie jest sp\u00f3jne z pozosta\u0142ymi elementami.<\/p>\n<p data-start=\"544\" data-end=\"830\">Wywo\u0142anie <em data-start=\"554\" data-end=\"588\">setMaximumWidth(Short.MAX_VALUE)<\/em> powoduje, \u017ce <em data-start=\"602\" data-end=\"609\">Label<\/em> i pole tekstowe mog\u0105 zosta\u0107 poszerzone. Dodatkowo, poprzez wywo\u0142anie <em data-start=\"679\" data-end=\"700\">setMinimumHeight(0)<\/em> oraz <em data-start=\"706\" data-end=\"741\">setMaximumHeight(Short.MAX_VALUE)<\/em> dla pola tekstowego okre\u015blono, \u017ce element ten mo\u017ce przyjmowa\u0107 dowoln\u0105 wysoko\u015b\u0107 w pionie.<\/p>\n<p data-start=\"832\" data-end=\"1416\">Dla podkontenera, poprzez <em data-start=\"858\" data-end=\"879\">setMaximumHeight(0)<\/em>, okre\u015blono, \u017ce mo\u017ce on przyjmowa\u0107 jedynie swoj\u0105 preferowan\u0105 wysoko\u015b\u0107 (<em data-start=\"950\" data-end=\"967\">preferredHeight<\/em>). Dla znajduj\u0105cych si\u0119 w nim przycisk\u00f3w za pomoc\u0105 <em data-start=\"1018\" data-end=\"1039\">setMinimumWidth(10)<\/em> zdefiniowano, \u017ce w razie potrzeby mog\u0105 zosta\u0107 zmniejszone do 10 pikseli. Natomiast dla <em data-start=\"1127\" data-end=\"1141\">maximumWidth<\/em> nie ustawiono \u017cadnej warto\u015bci, dzi\u0119ki czemu przyciski nie mog\u0105 zosta\u0107 poszerzone ponad swoj\u0105 preferowan\u0105 szeroko\u015b\u0107. Je\u015bli dost\u0119pna jest wi\u0119ksza ilo\u015b\u0107 miejsca, zostaje ona przydzielona elementowi <em data-start=\"1337\" data-end=\"1343\">Glue<\/em> (niewidocznemu), co powoduje przesuni\u0119cie przycisk\u00f3w do prawej kraw\u0119dzi.<\/p>\n<p><em>&#8230;<\/em><br \/>\n<em>dialog = new Dialog(&#8230;);<\/em><br \/>\n<em>&#8230;<\/em><\/p>\n<p><em>View contentPane = dialog.getContentPane();<\/em><\/p>\n<p><em>contentPane.setLayout(new BoxLayout(BoxLayout.Y_AXIS));<\/em><\/p>\n<p><em>Label prompt = new Label(Guid.AUTOGUID, &#8230;); \/\/ &#8222;Komentarz:&#8221;<\/em><\/p>\n<p><em>\/\/ &#8230;<\/em><br \/>\n<em>contentPane.add(prompt);<\/em><br \/>\n<em>prompt.setAlignmentX(Label.CENTER_ALIGNMENT);<\/em><br \/>\n<em>prompt.setMinimumWidth(0);<\/em><br \/>\n<em>prompt.setMaximumWidth(Short.MAX_VALUE);<\/em><\/p>\n<p><em>contentPane.add(new Strut(Strut.VERTICAL, 5));<\/em><\/p>\n<p><em>MultiLineTextField text = new MultiLineTextField(Guid.AUTOGUID, &#8230;);<\/em><br \/>\n<em>contentPane.add(text);<\/em><br \/>\n<em>text.setLabel(null);<\/em><br \/>\n<em>text.setAlignmentX(MultiLineTextField.CENTER_ALIGNMENT);<\/em><br \/>\n<em>text.setMinimumWidth(0);<\/em><br \/>\n<em>text.setMaximumWidth(Short.MAX_VALUE);<\/em><br \/>\n<em>text.setMinimumHeight(0);<\/em><br \/>\n<em>text.setMaximumHeight(Short.MAX_VALUE);<\/em><\/p>\n<p><em>contentPane.add(new Strut(Strut.VERTICAL, 5));<\/em><\/p>\n<p><em>View buttonPanel = new View(new BoxLayout(BoxLayout.X_AXIS));<\/em><br \/>\n<em>contentPane.add(buttonPanel);<\/em><br \/>\n<em>buttonPanel.setMaximumHeight(0); \/\/ -&gt; preferredHeight<\/em><\/p>\n<p><em>Action okAction = new Action(OK, &#8222;com.cisag.pgm.gui.ButtonBarOK&#8221;, &#8230;);<\/em><br \/>\n<em>okAction.setDefaultAction(true);<\/em><\/p>\n<p><em>Button okButton = new Button(okAction, Button.TEXT_BUTTON);<\/em><br \/>\n<em>buttonPanel.add(okButton);<\/em><br \/>\n<em>okButton.setMinimumWidth(10);<\/em><\/p>\n<p><em>buttonPanel.add(new Strut(Strut.HORIZONTAL, 5));<\/em><\/p>\n<p><em>Action cancelAction = new Action(CANCEL, &#8222;com.cisag.pgm.gui.ButtonBarCancel&#8221;, &#8230;);<\/em><\/p>\n<p><em>Button cancelButton = new Button(cancelAction, Button.TEXT_BUTTON);<\/em><br \/>\n<em>buttonPanel.add(cancelButton);<\/em><br \/>\n<em>cancelButton.setMinimumWidth(10);<\/em><br \/>\n<em>&#8230;<\/em><\/p>\n<h3 id=\"zastosowanie-przyciskow\" ><span class=\"ez-toc-section\" id=\"Zastosowanie_przyciskow\"><\/span>Zastosowanie przycisk\u00f3w<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<h4 id=\"menubutton\" ><span class=\"ez-toc-section\" id=\"MenuButton-2\"><\/span>MenuButton<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<div class=\"flex flex-col text-sm pb-25\">\n<article class=\"text-token-text-primary w-full focus:outline-none [--shadow-height:45px] has-data-writing-block:pointer-events-none has-data-writing-block:-mt-(--shadow-height) has-data-writing-block:pt-(--shadow-height) [&amp;:has([data-writing-block])&gt;*]:pointer-events-auto scroll-mt-[calc(var(--header-height)+min(200px,max(70px,20svh)))]\" dir=\"auto\" tabindex=\"-1\" data-turn-id=\"request-WEB:cdfeb896-8c8b-427a-b413-4b5dd68d1def-9\" data-testid=\"conversation-turn-20\" data-scroll-anchor=\"true\" data-turn=\"assistant\">\n<div class=\"text-base my-auto mx-auto pb-10 [--thread-content-margin:--spacing(4)] @w-sm\/main:[--thread-content-margin:--spacing(6)] @w-lg\/main:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)\">\n<div class=\"[--thread-content-max-width:40rem] @w-lg\/main:[--thread-content-max-width:48rem] mx-auto max-w-(--thread-content-max-width) flex-1 group\/turn-messages focus-visible:outline-hidden relative flex w-full min-w-0 flex-col agent-turn\" tabindex=\"-1\">\n<div class=\"flex max-w-full flex-col grow\">\n<div class=\"min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&amp;]:mt-1\" dir=\"auto\" data-message-author-role=\"assistant\" data-message-id=\"d42cfdef-d065-4476-b86d-9001248e6bfa\" data-message-model-slug=\"gpt-5-3\">\n<div class=\"flex w-full flex-col gap-1 empty:hidden first:pt-[1px]\">\n<div class=\"markdown prose dark:prose-invert w-full wrap-break-word dark markdown-new-styling\">\n<p data-start=\"51\" data-end=\"324\"><em data-start=\"51\" data-end=\"64\">MenuButtons<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"80\" data-end=\"92\">MenuButton<\/em>) s\u0105 zazwyczaj stosowane w listach symboli (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"148\" data-end=\"157\">CoolBar<\/em>).<\/p>\n<p data-start=\"367\" data-end=\"806\">Przyk\u0142ad tworzy najpierw instancj\u0119 <em data-start=\"402\" data-end=\"414\">ActionList<\/em> i dodaje do niej odpowiednie (podrz\u0119dne) <em data-start=\"456\" data-end=\"465\">Actions<\/em>. Obiekt <em data-start=\"474\" data-end=\"486\">ActionList<\/em> jest podklas\u0105 <em data-start=\"501\" data-end=\"509\">Action<\/em> i zawiera ustawienie <em data-start=\"531\" data-end=\"540\">Actions<\/em>, kt\u00f3re jako \u015bcie\u017ck\u0119 podaj\u0105 metadane. Na podstawie <em data-start=\"623\" data-end=\"635\">MenuButton<\/em> okre\u015blane s\u0105 z metadanych: ikona (lub tekst), skr\u00f3t oraz <em>ToolTip<\/em>, a tak\u017ce bezpo\u015brednio dla przycisku g\u0142\u00f3wnego. Z dodanych <em data-start=\"758\" data-end=\"767\">Actions<\/em> generowane s\u0105 wpisy menu <em data-start=\"793\" data-end=\"805\">MenuButton<\/em>.<\/p>\n<p data-start=\"367\" data-end=\"806\"><section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">W przyk\u0142adzie <em data-start=\"839\" data-end=\"851\">MenuButton<\/em> jest tworzony jawnie przy u\u017cyciu <em data-start=\"885\" data-end=\"890\">new<\/em> i dodawany za pomoc\u0105 <em data-start=\"912\" data-end=\"932\">add(VisualElement)<\/em> do <em data-start=\"936\" data-end=\"949\" data-is-only-node=\"\">MainCoolBar<\/em>. W przypadku <em data-start=\"963\" data-end=\"976\">MainCoolBar<\/em> nie jest to konieczne, poniewa\u017c <em data-start=\"1009\" data-end=\"1022\">MainCoolBar<\/em> jest konfigurowany za pomoc\u0105 metadanych (<em data-start=\"1064\" data-end=\"1076\">ActionList<\/em>). Je\u015bli metoda <em data-start=\"1092\" data-end=\"1105\">add(Action)<\/em> zostanie wywo\u0142ana z obiektem <em data-start=\"1135\" data-end=\"1147\">ActionList<\/em>, <em data-start=\"1149\" data-end=\"1161\">MenuButton<\/em> zostanie utworzony po\u015brednio. W przypadku innych list symboli (<em data-start=\"1225\" data-end=\"1238\">gui.CoolBar<\/em>) taki spos\u00f3b nie jest jednak mo\u017cliwy i dlatego zosta\u0142 on zastosowany w tym przyk\u0142adzie.<\/div><\/section><\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"z-0 flex min-h-[46px] justify-start\">\n<p><em>&#8230;<\/em><br \/>\n<em>public class ExampleApplication extends CisUiApplication {<\/em><\/p>\n<p><em>&#8230;<\/em><br \/>\n<em>\/\/ identyfikatory Action<\/em><br \/>\n<em>private static final int CONFIRM = 50;<\/em><br \/>\n<em>private static final int PICK = 51;<\/em><br \/>\n<em>private static final int DELIVER = 52;<\/em><br \/>\n<em>private static final int INVOICE = 53;<\/em><br \/>\n<em>private static final int CASH_INVOICE = 54;<\/em><br \/>\n<em>private static final int PROFORMA_INVOICE = 55;<\/em><br \/>\n<em>private static final int ONHAND_DISTRIBUTION = 56;<\/em><br \/>\n<em>private static final int RELEASE = 60;<\/em><br \/>\n<em>private static final int HOLD = 61;<\/em><\/p>\n<p><em>&#8230;<\/em><br \/>\n<em>\/\/ instancje Action<\/em><br \/>\n<em>private ActionList executeList;<\/em><br \/>\n<em>private Action confirm;<\/em><br \/>\n<em>private Action proformaInvoice;<\/em><br \/>\n<em>private Action onhandDistribution;<\/em><br \/>\n<em>private Action pick;<\/em><br \/>\n<em>private Action deliver;<\/em><br \/>\n<em>private Action invoice;<\/em><br \/>\n<em>private Action cashInvoice;<\/em><br \/>\n<em>private Action release;<\/em><br \/>\n<em>private Action hold;<\/em><\/p>\n<p><em>&#8230;<\/em><\/p>\n<p><em>protected void initCoolBar() {<\/em><br \/>\n<em>MainCoolBar cb = getMainCoolBar();<\/em><\/p>\n<p><em>&#8230;<\/em><br \/>\n<em>\/\/ utworzenie ActionList<\/em><br \/>\n<em>executeList = new ActionList(<\/em><br \/>\n<em>0,<\/em><br \/>\n<em>&#8222;com.cisag.app.sales.order.ui.OrderMaintenanceExecute&#8221;<\/em><br \/>\n<em>);<\/em><\/p>\n<p><em>\/\/ utworzenie Actions (wpisy menu)<\/em><br \/>\n<em>confirm = new Action(<\/em><br \/>\n<em>CONFIRM,<\/em><br \/>\n<em>&#8222;com.cisag.app.sales.order.ui.OrderMaintenanceGenerateConfirm&#8221;,<\/em><br \/>\n<em>this<\/em><br \/>\n<em>);<\/em><\/p>\n<p><em>proformaInvoice = new Action(<\/em><br \/>\n<em>PROFORMA_INVOICE,<\/em><br \/>\n<em>&#8222;com.cisag.app.sales.order.ui.OrderMaintenanceGenerateProformaInvoice&#8221;,<\/em><br \/>\n<em>this<\/em><br \/>\n<em>);<\/em><\/p>\n<\/div>\n<div class=\"mt-3 w-full empty:hidden\">\n<div class=\"text-center\">\n<p><em>onhandDistribution = new Action(ONHAND_DISTRIBUTION,<\/em><br \/>\n<em>&#8222;com.cisag.app.sales.order.ui.OrderMaintenanceGenerateOnhandDistribution&#8221;, this);<\/em><br \/>\n<em>pick = new Action(PICK,<\/em><br \/>\n<em>&#8222;com.cisag.app.sales.order.ui.OrderMaintenanceGeneratePickingOrder&#8221;, this);<\/em><br \/>\n<em>deliver = new Action(DELIVER,<\/em><br \/>\n<em>&#8222;com.cisag.app.sales.order.ui.OrderMaintenanceGenerateShippingOrder&#8221;, this);<\/em><br \/>\n<em>invoice = new Action(INVOICE,<\/em><br \/>\n<em>&#8222;com.cisag.app.sales.order.ui.OrderMaintenanceGenerateInvoice&#8221;, this);<\/em><br \/>\n<em>cashInvoice = new Action(CASH_INVOICE,<\/em><br \/>\n<em>&#8222;com.cisag.app.sales.order.ui.OrderMaintenanceGenerateCashInvoice&#8221;, this);<\/em><br \/>\n<em>release = new Action(RELEASE, &#8222;com.cisag.app.general.order.ui.ReleaseOrder&#8221;, this);<\/em><br \/>\n<em>hold = new Action(HOLD, &#8222;com.cisag.app.general.order.ui.HoldOrder&#8221;, this);<\/em><\/p>\n<p><em>\/\/ dodanie Actions do ActionList<\/em><br \/>\n<em>executeList.add(release);<\/em><br \/>\n<em>executeList.add(confirm);<\/em><br \/>\n<em>executeList.add(proformaInvoice);<\/em><br \/>\n<em>executeList.add(onhandDistribution);<\/em><br \/>\n<em>executeList.add(pick);<\/em><br \/>\n<em>executeList.add(deliver);<\/em><br \/>\n<em>executeList.add(invoice);<\/em><br \/>\n<em>executeList.add(cashInvoice);<\/em><br \/>\n<em>executeList.add(hold);<\/em><\/p>\n<p><em>\/\/ ostatniego wyboru nie zapisywa\u0107 (standard dla MenuButtons)<\/em><br \/>\n<em>executeList.setMemoryActive(false);<\/em><\/p>\n<p><em>\/\/ utworzenie MenuButton dla MainCoolBar (z du\u017cymi ikonami)<\/em><br \/>\n<em>MenuButton mb = new MenuButton(Guid.AUTOGUID, executeList, true);<\/em><\/p>\n<p><em>\/\/ dodanie MenuButton do (Main)CoolBar<\/em><br \/>\n<em>cb.add(mb);<\/em><br \/>\n<em>&#8230;<\/em><br \/>\n<em>}<\/em><br \/>\n<em>&#8230;<\/em><\/p>\n<p><em>public void performAction(Action action) {<\/em><br \/>\n<em>&#8230;<\/em><br \/>\n<em>}<\/em><\/p>\n<p><em>int actionId = action.getId();<\/em><br \/>\n<em>switch (actionId) {<\/em><br \/>\n<em>case CONFIRM:<\/em><br \/>\n<em>\/** @todo implementacja\/wywo\u0142anie &#8222;confirm&#8221; *\/<\/em><br \/>\n<em>break;<\/em><\/p>\n<p><em>case PROFORMA_INVOICE:<\/em><br \/>\n<em>\/** @todo implementacja\/wywo\u0142anie &#8222;proforma_invoice&#8221; *\/<\/em><br \/>\n<em>break;<\/em><\/p>\n<p><em>&#8230;<\/em><br \/>\n<em>}<\/em><br \/>\n<em>&#8230;<\/em><br \/>\n<em>}<\/em><br \/>\n<em>&#8230;<\/em><br \/>\n<em>}<\/em><\/p>\n<h4 id=\"wykorzystanie-okien-dialogowych\" ><span class=\"ez-toc-section\" id=\"Wykorzystanie_okien_dialogowych\"><\/span>Wykorzystanie okien dialogowych<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"319\" data-end=\"629\">W przyk\u0142adzie wykorzystano modalne okno dialogowe do edycji pola danych. Do edycji tekstu, np. w celu otwarcia okna dialogowego edycji, u\u017cywany jest tzw. przycisk <em data-start=\"492\" data-end=\"500\">Dialog<\/em> (patrz <em data-start=\"508\" data-end=\"523\">Dialog-Button<\/em>). Otwarcie takiego okna dialogowego mo\u017ce zosta\u0107 wywo\u0142ane r\u00f3wnie\u017c przez inn\u0105 akcj\u0119 u\u017cytkownika (<em data-start=\"619\" data-end=\"627\">Action<\/em>).<\/p>\n<p data-start=\"716\" data-end=\"964\">W przyk\u0142adzie chodzi o prosty (wielowierszowy) tekst, kt\u00f3ry sam w sobie nie wymaga\u0142by osobnego edytora. W praktyce zaleca si\u0119 jednak stosowanie oddzielnego okna dialogowego do edycji tylko wtedy, gdy przynosi to u\u017cytkownikowi rzeczywist\u0105 korzy\u015b\u0107.<\/p>\n<p data-start=\"716\" data-end=\"964\"><section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">Do wy\u015bwietlania komunikat\u00f3w lub okien dialogowych potwierdzenia nale\u017cy stosowa\u0107 klas\u0119 <em data-start=\"1069\" data-end=\"1107\">com.cisag.pgm.gui.ConfirmationDialog<\/em>.<\/div><\/section><\/p>\n<p data-start=\"243\" data-end=\"567\">Klasa <em data-start=\"249\" data-end=\"261\">TextEditor<\/em> wewn\u0119trznie tworzy instancj\u0119 <em data-start=\"291\" data-end=\"317\">com.cisag.pgm.gui.Dialog<\/em> i wype\u0142nia j\u0105 odpowiednimi elementami interfejsu u\u017cytkownika. Do potwierdzania lub anulowania edycji wykorzystywana jest instancja <em data-start=\"449\" data-end=\"478\">com.cisag.pgm.gui.ButtonBar<\/em> (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"492\" data-end=\"503\">ButtonBar<\/em>). Komunikacja z klas\u0105 odbywa si\u0119 wed\u0142ug nast\u0119puj\u0105cego schematu:<\/p>\n<ul>\n<li data-start=\"571\" data-end=\"865\">utworzenie instancji <em data-start=\"592\" data-end=\"604\">TextEditor<\/em>. Jako <em data-start=\"611\" data-end=\"618\">Owner<\/em> nale\u017cy wskaza\u0107 element, do kt\u00f3rego nale\u017cy okno dialogowe lub z kt\u00f3rego zosta\u0142o ono otwarte. Na podstawie tego elementu okre\u015blane jest z jednej strony nadrz\u0119dne okno, a z drugiej strony s\u0142u\u017cy on jako wskaz\u00f3wka do pozycjonowania okna dialogowego.<\/li>\n<li data-start=\"869\" data-end=\"1021\">za pomoc\u0105 <em data-start=\"879\" data-end=\"898\">setClosedAction()<\/em> mo\u017cna zarejestrowa\u0107 <em data-start=\"919\" data-end=\"927\">Action<\/em>, kt\u00f3ra zostanie wywo\u0142ana po zamkni\u0119ciu okna dialogowego (przez u\u017cytkownika lub programowo)<\/li>\n<li data-start=\"1025\" data-end=\"1114\">za pomoc\u0105 <em data-start=\"1035\" data-end=\"1053\">setValue(String)<\/em> mo\u017cna ustawi\u0107 w <em data-start=\"1070\" data-end=\"1082\">TextEditor<\/em> tekst przeznaczony do edycji<\/li>\n<li data-start=\"1118\" data-end=\"1199\">po zako\u0144czeniu konfiguracji okno dialogowe mo\u017cna wy\u015bwietli\u0107 za pomoc\u0105 <em data-start=\"1188\" data-end=\"1196\">show()<\/em><\/li>\n<li data-start=\"1203\" data-end=\"1389\">po zamkni\u0119ciu okna dialogowego przez u\u017cytkownika przyciskiem [<strong data-start=\"1265\" data-end=\"1271\">OK<\/strong>], [<strong data-start=\"1275\" data-end=\"1285\">Anuluj<\/strong>] lub [<strong data-start=\"1292\" data-end=\"1297\">X<\/strong>] zostaje wywo\u0142ana (je\u015bli zosta\u0142a ustawiona przez <em data-start=\"1347\" data-end=\"1366\">setClosedAction()<\/em>) tzw. <em data-start=\"1373\" data-end=\"1388\">Closed-Action<\/em><\/li>\n<li data-start=\"2\" data-end=\"119\">za pomoc\u0105 <em data-start=\"12\" data-end=\"26\">isApproved()<\/em> mo\u017cna sprawdzi\u0107, czy okno dialogowe zosta\u0142o zamkni\u0119te przyciskiem [<strong data-start=\"94\" data-end=\"100\">OK<\/strong>], czy anulowane<\/li>\n<li data-start=\"123\" data-end=\"216\">w przypadku [<strong data-start=\"136\" data-end=\"142\">OK<\/strong>] (<em data-start=\"145\" data-end=\"155\">approved<\/em>) aktualn\u0105 warto\u015b\u0107 mo\u017cna odczyta\u0107 przy u\u017cyciu <em data-start=\"201\" data-end=\"213\">getValue()<\/em><\/li>\n<li data-start=\"220\" data-end=\"347\">instancja <em data-start=\"230\" data-end=\"242\">TextEditor<\/em> mo\u017ce by\u0107 u\u017cywana wielokrotnie. W takim przypadku dwa pierwsze kroki nie musz\u0105 by\u0107 ponownie wykonywane<\/li>\n<\/ul>\n<section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">W odr\u00f3\u017cnieniu np. od <em data-start=\"387\" data-end=\"404\" data-is-only-node=\"\">java.awt.Dialog<\/em>, metoda <em data-start=\"413\" data-end=\"421\">show()<\/em> (lub <em data-start=\"427\" data-end=\"445\">setVisible(true)<\/em>) r\u00f3wnie\u017c przy modalnych oknach dialogowych nie zwraca sterowania do programu dopiero po zamkni\u0119ciu okna. Program nie oczekuje wi\u0119c na zamkni\u0119cie okna dialogowego. Zamiast tego dost\u0119pna jest <em data-start=\"636\" data-end=\"651\">Closed-Action<\/em>, kt\u00f3ra zostaje wywo\u0142ana po zamkni\u0119ciu okna dialogowego (niezale\u017cnie od sposobu jego zamkni\u0119cia).<\/div><\/section>\n<p><em>public class TextEditor {<\/em><\/p>\n<p><em>private static final int DIALOG_CLOSED = 100;<\/em><\/p>\n<p><em>private Dialog dialog;<\/em><br \/>\n<em>private boolean approved;<\/em><\/p>\n<p><em>private MultiLineTextField textField;<\/em><\/p>\n<p><em>private Action closedAction;<\/em><\/p>\n<p><em>public TextEditor(VisualElement owner) {<\/em><br \/>\n<em>dialog = new Dialog(Dialog.MODAL, owner);<\/em><br \/>\n<em>dialog.setTitleFrom(&#8230;); \/\/ &#8222;Demo Dialog&#8221;<\/em><\/p>\n<p><em>DialogActionListener listener = new DialogActionListener();<\/em><br \/>\n<em>dialog.setClosedAction(new Action(DIALOG_CLOSED, listener));<\/em><\/p>\n<p><em>View contentPane = dialog.getContentPane();<\/em><br \/>\n<em>contentPane.setLayout(new BoxLayout(BoxLayout.Y_AXIS));<\/em><\/p>\n<p><em>Label prompt = new Label(Guid.AUTOGUID, &#8230;); \/\/ &#8222;Opis:&#8221;<\/em><br \/>\n<em>contentPane.add(prompt);<\/em><br \/>\n<em>prompt.setAlignmentX(Label.CENTER_ALIGNMENT);<\/em><\/p>\n<p><em>prompt.setMaximumWidth(Short.MAX_VALUE);<\/em><\/p>\n<p><em>contentPane.add(new Strut(Strut.VERTICAL, 5));<\/em><\/p>\n<p><em>textField = new MultiLineTextField(Guid.AUTOGUID, &#8222;&#8221;);<\/em><br \/>\n<em>contentPane.add(textField);<\/em><br \/>\n<em>textField.setLabel(null);<\/em><br \/>\n<em>textField.setAlignmentX(MultiLineTextField.CENTER_ALIGNMENT);<\/em><br \/>\n<em>textField.setMinimumHeight(0);<\/em><br \/>\n<em>textField.setMaximumWidth(Short.MAX_VALUE);<\/em><br \/>\n<em>textField.setMaximumHeight(Short.MAX_VALUE);<\/em><\/p>\n<p><em>contentPane.add(new Strut(Strut.VERTICAL, 5));<\/em><\/p>\n<p><em>ButtonBar buttonBar = new<\/em><br \/>\n<em>ButtonBar(ButtonBar.OK | ButtonBar.CANCEL, listener);<\/em><br \/>\n<em>contentPane.add(buttonBar);<\/em><br \/>\n<em>buttonBar.setMaximumHeight(0);<\/em><br \/>\n<em>}<\/em><\/p>\n<p><em>public String getValue()<\/em><br \/>\n<em>{<\/em><br \/>\n<em>return textField.getStringValue();<\/em><br \/>\n<em>}<\/em><\/p>\n<p><em>public void setValue(String text)<\/em><br \/>\n<em>{<\/em><br \/>\n<em>textField.setStringValue(text);<\/em><br \/>\n<em>}<\/em><\/p>\n<p><em>public void setClosedAction(Action action)<\/em><br \/>\n<em>{<\/em><br \/>\n<em>closedAction = action;<\/em><br \/>\n<em>}<\/em><\/p>\n<p><em>public void show()<\/em><br \/>\n<em>{<\/em><br \/>\n<em>if (isVisible()) {<\/em><br \/>\n<em>throw new java.lang.IllegalStateException(&#8222;already shown&#8221;);<\/em><br \/>\n<em>}<\/em><br \/>\n<em>approved = false;<\/em><br \/>\n<em>dialog.setVisible(true);<\/em><br \/>\n<em>}<\/em><\/p>\n<p><em>public void approve()<\/em><br \/>\n<em>{<\/em><br \/>\n<em>if (!isVisible()) {<\/em><br \/>\n<em>throw new java.lang.IllegalStateException(&#8222;dialog not shown&#8221;);<\/em><br \/>\n<em>}<\/em><br \/>\n<em>approved = true;<\/em><br \/>\n<em>dialog.setVisible(false);<\/em><br \/>\n<em>}<\/em><\/p>\n<p><em>public void cancel()<\/em><br \/>\n<em>{<\/em><br \/>\n<em>if (!isVisible()) {<\/em><br \/>\n<em>throw new java.lang.IllegalStateException(&#8222;dialog not shown&#8221;);<\/em><br \/>\n<em>}<\/em><br \/>\n<em>approved = false;<\/em><br \/>\n<em>dialog.setVisible(false);<\/em><br \/>\n<em>}<\/em><\/p>\n<p><em>public boolean isVisible()<\/em><br \/>\n<em>{<\/em><br \/>\n<em>return dialog.isVisible();<\/em><br \/>\n<em>}<\/em><\/p>\n<p><em>public boolean isApproved()<\/em><br \/>\n<em>{<\/em><br \/>\n<em>return approved;<\/em><br \/>\n<em>}<\/em><\/p>\n<p><em>private class DialogActionListener implements ActionListener<\/em><br \/>\n<em>{<\/em><br \/>\n<em>public void performAction(Action action)<\/em><br \/>\n<em>{<\/em><br \/>\n<em>int actionId = action.getId();<\/em><br \/>\n<em>System.out.println(&#8222;actionId = &#8221; + actionId);<\/em><br \/>\n<em>if (actionId == ButtonBar.OK) {<\/em><br \/>\n<em>approve();<\/em><br \/>\n<em>}<\/em><br \/>\n<em>else if (actionId == ButtonBar.CANCEL) {<\/em><br \/>\n<em>cancel();<\/em><br \/>\n<em>}<\/em><br \/>\n<em>else if (actionId == DIALOG_CLOSED) {<\/em><br \/>\n<em>if (closedAction != null) {<\/em><br \/>\n<em>closedAction.setState(new Boolean(isApproved()));<\/em><br \/>\n<em>closedAction.fireAction();<\/em><br \/>\n<em>&#8230;<\/em><br \/>\n<em>}<\/em><br \/>\n<em>}<\/em><br \/>\n<em>}<\/em><\/p>\n<p data-start=\"96\" data-end=\"172\">Program aplikacji wykorzystuje dwie <em data-start=\"132\" data-end=\"141\">Actions<\/em> do komunikacji z <em data-start=\"159\" data-end=\"171\">TextEditor<\/em>:<\/p>\n<ul>\n<li data-start=\"176\" data-end=\"286\">pierwsza <em data-start=\"185\" data-end=\"193\">Action<\/em> jest rejestrowana przy polu tekstowym i uruchamia tworzenie lub otwarcie okna dialogowego<\/li>\n<li data-start=\"289\" data-end=\"375\">druga <em data-start=\"295\" data-end=\"303\">Action<\/em> jest rejestrowana przy <em data-start=\"327\" data-end=\"339\">TextEditor<\/em> i uruchamia dalsze przetwarzanie<\/li>\n<\/ul>\n<p data-start=\"377\" data-end=\"556\">Instancja <em data-start=\"387\" data-end=\"399\">TextEditor<\/em> jest tworzona, gdy u\u017cytkownik po raz pierwszy kliknie przycisk <em data-start=\"463\" data-end=\"471\">Dialog<\/em>. Ta sama instancja jest nast\u0119pnie wykorzystywana r\u00f3wnie\u017c przy kolejnych wywo\u0142aniach.<\/p>\n<p data-start=\"377\" data-end=\"556\"><section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">Dop\u00f3ki okno dialogowe nie zosta\u0142o zamkni\u0119te, aplikacja powinna przechowywa\u0107 (w Javie) referencj\u0119 do tego okna, aby modu\u0142 <em>Garbage Collector<\/em> nie zniszczy\u0142 go przedwcze\u015bnie.<\/div><\/section><\/p>\n<p><em>public class ExampleApplication extends CisUiApplication {<\/em><\/p>\n<p><em>&#8230;<\/em><\/p>\n<p><em>private static final int OPEN_DIALOG_ACTION = 200;<\/em><br \/>\n<em>private static final int DIALOG_CLOSED_ACTION = 201;<\/em><\/p>\n<p><em>&#8230;<\/em><\/p>\n<p><em>private MultiLineTextField description;<\/em><br \/>\n<em>private TextEditor editor;<\/em><\/p>\n<p><em>private Action openDialogAction;<\/em><br \/>\n<em>private Action dialogClosedAction;<\/em><\/p>\n<p><em>&#8230;<\/em><\/p>\n<p><em>protected void createWorkArea() {<\/em><br \/>\n<em>&#8230;<\/em><\/p>\n<p><em>description = new MultiLineTextField(Guid.AUTOGUID, &#8230;); \/\/ &#8222;Opis:&#8221;<\/em><br \/>\n<em>pane.add(description, &#8222;0&#8221;);<\/em><\/p>\n<p><em>openDialogAction = new Action(OPEN_DIALOG_ACTION, this);<\/em><br \/>\n<em>description.setLabelPosition(MultiLineTextField.LABEL_LEFT);<\/em><br \/>\n<em>description.setEditable(false);<\/em><br \/>\n<em>&#8230;<\/em><br \/>\n<em>description.setDialogAction(openDialogAction);<\/em><\/p>\n<p><em>&#8230;<\/em><br \/>\n<em>}<\/em><\/p>\n<p><em>&#8230;<\/em><\/p>\n<p><em>public void performAction(Action action) {<\/em><\/p>\n<p><em>switch (action.getId()) {<\/em><br \/>\n<em>&#8230;<\/em><\/p>\n<p><em>case OPEN_DIALOG_ACTION:<\/em><br \/>\n<em>if (editor == null) {<\/em><br \/>\n<em>editor = new TextEditor(description);<\/em><br \/>\n<em>editor.setClosedAction(new Action(DIALOG_CLOSED_ACTION, this));<\/em><br \/>\n<em>}<\/em><\/p>\n<p><em>if (!editor.isVisible()) {<\/em><br \/>\n<em>editor.setValue(description.getStringValue());<\/em><br \/>\n<em>editor.show();<\/em><br \/>\n<em>}<\/em><br \/>\n<em>break;<\/em><\/p>\n<p><em>case DIALOG_CLOSED_ACTION:<\/em><br \/>\n<em>if (editor.isApproved()) {<\/em><br \/>\n<em>description.setStringValue(editor.getValue());<\/em><br \/>\n<em>}<\/em><br \/>\n<em>else {<\/em><br \/>\n<em>\/\/ pomini\u0119to<\/em><br \/>\n<em>}<\/em><br \/>\n<em>break;<\/em><\/p>\n<p><em>&#8230;<\/em><br \/>\n<em>}<\/em><br \/>\n<em>&#8230;<\/em><br \/>\n<em>}<\/em><br \/>\n<em>&#8230;<\/em><br \/>\n<em>}<\/em><\/p>\n<h3 id=\"graficzny-debugger\" ><span class=\"ez-toc-section\" id=\"Graficzny_debugger\"><\/span>Graficzny debugger<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p data-start=\"26\" data-end=\"273\">Graficzny debugger s\u0142u\u017cy jako narz\u0119dzie analityczne dla interfejs\u00f3w u\u017cytkownika utworzonych przy u\u017cyciu frameworka UI. Narz\u0119dzie to umo\u017cliwia przegl\u0105danie oraz modyfikowanie wszystkich element\u00f3w znajduj\u0105cych si\u0119 w oknie, a tak\u017ce ich w\u0142a\u015bciwo\u015bci.<\/p>\n<p data-start=\"275\" data-end=\"725\" data-is-last-node=\"\" data-is-only-node=\"\">Za pomoc\u0105 graficznego debuggera mo\u017cna stosunkowo \u0142atwo znale\u017a\u0107 i usun\u0105\u0107 typowe b\u0142\u0119dy interfejsu u\u017cytkownika, takie jak np. nieprawid\u0142owe mened\u017cery uk\u0142adu, zagnie\u017cd\u017cone <em data-start=\"445\" data-end=\"458\">ScrollPanes<\/em>, niewidoczne elementy czy brakuj\u0105ce opisy danych. Poniewa\u017c wi\u0119kszo\u015b\u0107 w\u0142a\u015bciwo\u015bci mo\u017ce by\u0107 nie tylko wy\u015bwietlana, lecz tak\u017ce bezpo\u015brednio zmieniana, mo\u017cliwe jest r\u00f3wnie\u017c interaktywne testowanie r\u00f3\u017cnych konfiguracji element\u00f3w w celu znalezienia optymalnych warto\u015bci.<\/p>\n<p data-start=\"0\" data-end=\"172\">Graficzny debugger wykorzystuje jako wizualizacj\u0119 okno dialogowe (niemodalne). W tym oknie po lewej stronie wy\u015bwietlana jest hierarchia kontener\u00f3w analizowanego interfejsu.<\/p>\n<p data-start=\"174\" data-end=\"384\">Kontenery najwy\u017cszego poziomu (okno g\u0142\u00f3wne, okno dialogowe, okno popup) s\u0105 przedstawiane w formie drzewa. Po prawej stronie wy\u015bwietlane s\u0105 w\u0142a\u015bciwo\u015bci wybranego elementu i mog\u0105 by\u0107 one tam r\u00f3wnie\u017c modyfikowane.<\/p>\n<p data-start=\"174\" data-end=\"384\"><section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">Wy\u015bwietlane elementy nie s\u0105 klasami z pakietu <em data-start=\"485\" data-end=\"504\">com.cisag.pgm.gui<\/em>, lecz klasami z pakietu <em data-start=\"529\" data-end=\"551\" data-is-only-node=\"\">com.cisag.pgm.dialog<\/em>, poniewa\u017c implementacje pakietu <em data-start=\"584\" data-end=\"603\">com.cisag.pgm.gui<\/em> dziedzicz\u0105 z tych klas (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 we wprowadzeniu). Ma to r\u00f3wnie\u017c wp\u0142yw na wy\u015bwietlan\u0105 hierarchi\u0119 kontener\u00f3w oraz pokazywane w\u0142a\u015bciwo\u015bci element\u00f3w. Elementy obu pakiet\u00f3w s\u0105 jednak zasadniczo bardzo podobne (pakiet <em data-start=\"822\" data-end=\"844\">com.cisag.pgm.dialog<\/em> jest jedynie nieco bardziej szczeg\u00f3\u0142owy), dlatego w praktyce nie powoduje to istotnych niedogodno\u015bci.<\/div><\/section><\/p>\n<h4 data-start=\"174\" data-end=\"384\" id=\"wywolanie\" ><span class=\"ez-toc-section\" id=\"Wywolanie\"><\/span>Wywo\u0142anie<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"1695\" data-end=\"1873\">Graficzny debugger mo\u017ce zosta\u0107 uruchomiony bezpo\u015brednio z dzia\u0142aj\u0105cej aplikacji. Warunkiem jest posiadanie przez u\u017cytkownika odpowiednich uprawnie\u0144 (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em>Uprawnienia<\/em>).<\/p>\n<p data-start=\"1875\" data-end=\"1954\">Wywo\u0142anie odbywa si\u0119 z klawiatury przy u\u017cyciu kombinacji klawiszy [<strong>Ctrl<\/strong>]+[<strong>Alt<\/strong>]+[<strong>G<\/strong>].<\/p>\n<p data-start=\"1875\" data-end=\"1954\"><section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">Graficzny debugger zawsze generuje elementy z okna, z kt\u00f3rego zosta\u0142 uruchomiony. Dlatego przed jego uruchomieniem fokus klawiatury musi zosta\u0107 ustawiony w odpowiednim oknie (lub w jego elemencie podrz\u0119dnym).<\/div><\/section><\/p>\n<h5 data-start=\"1875\" data-end=\"1954\" id=\"uprawnienia\" ><span class=\"ez-toc-section\" id=\"Uprawnienia\"><\/span>Uprawnienia<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"1875\" data-end=\"1954\">Aby uruchomi\u0107 graficzny debugger, w obszarze frameworka <em data-start=\"2267\" data-end=\"2289\">Rozw\u00f3j oprogramowania<\/em> (<em data-start=\"2291\" data-end=\"2326\">com.cisag.pgm.SoftwareDevelopment<\/em>) wymagana jest zdolno\u015b\u0107 uruchamiania graficznego debuggera\u00a0(<em data-start=\"2381\" data-end=\"2432\">com.cisag.sys.kernel.browser.startGraphicDebugger<\/em>).<\/p>\n<p data-start=\"1875\" data-end=\"1954\"><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">W systemie produkcyjnym zdolno\u015b\u0107 ta nie powinna by\u0107 przypisana \u017cadnemu u\u017cytkownikowi. Z jednej strony istnieje ryzyko, \u017ce za pomoc\u0105 graficznego debuggera mo\u017cliwe by\u0142oby obej\u015bcie innych ustawie\u0144 uprawnie\u0144. Na przyk\u0142ad dane (pola) mog\u0105 zosta\u0107 uczynione widocznymi, mimo \u017ce dla danego u\u017cytkownika powinny pozosta\u0107 ukryte. Z drugiej strony manipulacja w\u0142a\u015bciwo\u015bciami element\u00f3w mo\u017ce prowadzi\u0107 do powa\u017cnych b\u0142\u0119d\u00f3w w dzia\u0142aj\u0105cych aplikacjach.<\/div><\/section><\/p>\n<h4 data-start=\"1875\" data-end=\"1954\" id=\"obsluga\" ><span class=\"ez-toc-section\" id=\"Obsluga\"><\/span>Obs\u0142uga<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p data-start=\"0\" data-end=\"402\">Lewa cz\u0119\u015b\u0107 graficznego debuggera (nag\u0142\u00f3wek <em>Elements<\/em>) przedstawia hierarchi\u0119 kontener\u00f3w analizowanych element\u00f3w najwy\u017cszego poziomu w formie drzewa. Kontenery najwy\u017cszego poziomu stanowi\u0105 korze\u0144 drzewa, a podkontenery i elementy tworz\u0105 jego w\u0119z\u0142y i li\u015bcie. Drzewo s\u0142u\u017cy jedynie do wizualizacji element\u00f3w kontenera, kt\u00f3rych w\u0142a\u015bciwo\u015bci maj\u0105 by\u0107 wy\u015bwietlane po prawej stronie okna graficznego debuggera.<\/p>\n<p data-start=\"404\" data-end=\"652\">Prawa cz\u0119\u015b\u0107 okna debuggera (nag\u0142\u00f3wek <em>Properties<\/em>) pokazuje w\u0142a\u015bciwo\u015bci wybranych element\u00f3w. Wy\u015bwietlane w\u0142a\u015bciwo\u015bci zale\u017c\u0105 od odpowiedniej klasy elementu. Pokazywane s\u0105 wy\u0142\u0105cznie te w\u0142a\u015bciwo\u015bci, kt\u00f3re s\u0105 wsp\u00f3lne dla wszystkich wybranych element\u00f3w.<\/p>\n<h5 data-start=\"404\" data-end=\"652\" id=\"wyszukiwanie-elementow\" ><span class=\"ez-toc-section\" id=\"Wyszukiwanie_elementow\"><\/span>Wyszukiwanie element\u00f3w<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"404\" data-end=\"652\">Aby szybko znale\u017a\u0107 okre\u015blony element w hierarchii kontener\u00f3w, graficzny debugger udost\u0119pnia funkcj\u0119 wyszukiwania.<\/p>\n<p data-start=\"404\" data-end=\"652\">W polu <em data-start=\"857\" data-end=\"869\">Search for<\/em> wpisany (cz\u0119\u015bciowy) tekst jest wyszukiwany w wybranym kierunku (<em data-start=\"934\" data-end=\"938\">up<\/em>\/<em data-start=\"939\" data-end=\"945\">down<\/em>), z uwzgl\u0119dnieniem lub bez rozr\u00f3\u017cniania wielko\u015bci liter (<em data-start=\"1003\" data-end=\"1019\">case sensitive<\/em>), w hierarchii kontener\u00f3w. Podczas wyszukiwania brane s\u0105 pod uwag\u0119 nast\u0119puj\u0105ce w\u0142a\u015bciwo\u015bci element\u00f3w:<\/p>\n<ul>\n<li data-start=\"1125\" data-end=\"1154\"><strong><em data-start=\"1125\" data-end=\"1130\">_id<\/em> <\/strong>\u2014 wszystkie elementy<\/li>\n<li data-start=\"1157\" data-end=\"1194\"><strong><em data-start=\"1157\" data-end=\"1164\">_text<\/em> (<em data-start=\"1166\" data-end=\"1173\">Label<\/em>)<\/strong> \u2014 wszystkie pola<\/li>\n<li data-start=\"1197\" data-end=\"1223\"><strong><em data-start=\"1197\" data-end=\"1205\">_label<\/em> <\/strong>\u2014 wszystkie pola<\/li>\n<\/ul>\n<p data-start=\"0\" data-end=\"312\">Je\u015bli zostanie znaleziony element, w kt\u00f3rego w\u0142a\u015bciwo\u015bci wpisany tekst jest zawarty (pe\u0142na zgodno\u015b\u0107 nie jest wymagana), element ten zostaje zaznaczony w drzewie i wy\u015bwietlony w prawym polu w\u0142a\u015bciwo\u015bci. Przy kolejnym wyszukiwaniu wyszukiwanie jest kontynuowane od nast\u0119pnego elementu (w kierunku <em data-start=\"295\" data-end=\"299\">up<\/em> lub <em data-start=\"304\" data-end=\"310\">down<\/em>).<\/p>\n<p data-start=\"0\" data-end=\"312\"><section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">Teksty opis\u00f3w p\u00f3l (<em data-start=\"350\" data-end=\"357\">Label<\/em>) zazwyczaj zawieraj\u0105 r\u00f3wnie\u017c znak steruj\u0105cy <em>&amp;<\/em>, kt\u00f3ry s\u0142u\u017cy do oznaczania <em data-start=\"433\" data-end=\"446\">Access Keys<\/em>.<\/div><\/section><\/p>\n<h6 data-start=\"0\" data-end=\"312\" id=\"identyfikatory-elementow\" ><span class=\"ez-toc-section\" id=\"Identyfikatory_elementow\"><\/span>Identyfikatory element\u00f3w<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"492\" data-end=\"864\">Ka\u017cdy element w pakiecie <em data-start=\"517\" data-end=\"539\">com.cisag.pgm.dialog<\/em> ma unikalny identyfikator elementu (<em data-start=\"576\" data-end=\"580\">ID<\/em>). Identyfikator ten jest wykorzystywany przede wszystkim do komunikacji mi\u0119dzy klientem a serwerem. W po\u0142\u0105czeniu z graficznym debuggerem mo\u017ce by\u0107 jednak bardzo przydatny do odnalezienia okre\u015blonego elementu. Na przyk\u0142ad w wyszukiwaniu mo\u017cna wpisa\u0107 numer ID, aby znale\u017a\u0107 dany element.<\/p>\n<p data-start=\"866\" data-end=\"1049\">Warunkiem wyszukiwania wed\u0142ug identyfikatora elementu jest oczywi\u015bcie znajomo\u015b\u0107 identyfikatora szukanego elementu. Aby ustali\u0107 identyfikator elementu, istniej\u0105 nast\u0119puj\u0105ce mo\u017cliwo\u015bci:<\/p>\n<ul>\n<li data-start=\"1053\" data-end=\"1281\">je\u015bli element ma fokus, identyfikator aktualnego elementu mo\u017cna wy\u015bwietli\u0107 w ma\u0142ym oknie popup przy u\u017cyciu kombinacji klawiszy [<strong>Ctrl<\/strong>]+[<strong>Shift<\/strong>]+[<strong>F<\/strong>]. Okno to wy\u015bwietla identyfikator elementu, kt\u00f3ry aktualnie ma fokus.<\/li>\n<li data-start=\"2\" data-end=\"448\">klikn\u0105\u0107 element mysz\u0105, przytrzymuj\u0105c jednocze\u015bnie klawisz [<strong>Ctrl<\/strong>]. W pasku statusu przegl\u0105darki zostanie wy\u015bwietlony identyfikator klikni\u0119tego elementu. Mo\u017ce si\u0119 jednak zdarzy\u0107, \u017ce informacja ta zostanie nadpisana przez inne komunikaty paska statusu i nie b\u0119dzie ju\u017c dost\u0119pna do odczytu. W trybie HTML metoda ta nie jest dost\u0119pna (brak statusu dla element\u00f3w z mo\u017cliwo\u015bci\u0105 ustawienia fokusu), dlatego lepiej zastosowa\u0107 pierwsz\u0105 z opisanych metod.<\/li>\n<li data-start=\"452\" data-end=\"605\">alternatywnie mo\u017cna wybra\u0107 dowolny element znajduj\u0105cy si\u0119 w bezpo\u015brednim s\u0105siedztwie szukanego elementu i w widoku drzewa przej\u015b\u0107 do w\u0142a\u015bciwego elementu.<\/li>\n<\/ul>\n<p data-start=\"607\" data-end=\"855\">Identyfikatory element\u00f3w s\u0105 zawsze zbudowane wed\u0142ug wzorca <em>_id<\/em>, po kt\u00f3rym nast\u0119puje liczba. Je\u015bli po liczbie pojawiaj\u0105 si\u0119 dodatkowe znaki, nie jest to identyfikator elementu. W takim przypadku nale\u017cy powt\u00f3rzy\u0107 jeden z opisanych wcze\u015bniej krok\u00f3w.<\/p>\n<p data-start=\"857\" data-end=\"1035\">Poniewa\u017c graficzny debugger jest realizowany jako niemodalne okno dialogowe, w ten spos\u00f3b mo\u017cna wyszukiwa\u0107 kolejne elementy bez konieczno\u015bci zamykania okna graficznego debuggera.<\/p>\n<h5 data-start=\"857\" data-end=\"1035\" id=\"wyswietlanie-i-zmiana-wlasciwosci\" ><span class=\"ez-toc-section\" id=\"Wyswietlanie_i_zmiana_wlasciwosci\"><\/span>Wy\u015bwietlanie i zmiana w\u0142a\u015bciwo\u015bci<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"1087\" data-end=\"1340\">W zale\u017cno\u015bci od typu (podklasy) wybranych element\u00f3w, po prawej stronie wy\u015bwietlane s\u0105 jedna lub kilka grup w\u0142a\u015bciwo\u015bci. Je\u015bli wybranych jest kilka element\u00f3w, wy\u015bwietlane s\u0105 tylko te grupy w\u0142a\u015bciwo\u015bci, kt\u00f3re obowi\u0105zuj\u0105 dla wszystkich wybranych element\u00f3w.<\/p>\n<p data-start=\"1342\" data-end=\"1791\">Grupowanie w\u0142a\u015bciwo\u015bci odpowiada podzia\u0142owi klas element\u00f3w (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w rozdziale <em data-start=\"1417\" data-end=\"1451\">Podklasy element\u00f3w VisualElement<\/em> \u2013 <em data-start=\"1454\" data-end=\"1476\">com.cisag.pgm.dialog<\/em>). Na przyk\u0142ad w\u0142a\u015bciwo\u015bci klasy <em data-start=\"1509\" data-end=\"1524\">VisualElement<\/em> (<em data-start=\"1526\" data-end=\"1548\">com.cisag.pgm.dialog<\/em>) s\u0105 zestawione w jednej grupie (poniewa\u017c s\u0105 wsp\u00f3lne dla wszystkich element\u00f3w), natomiast w\u0142a\u015bciwo\u015bci pola (<em data-start=\"1656\" data-end=\"1678\">com.cisag.pgm.dialog<\/em>) w innej. Istniej\u0105ce dodatkowe w\u0142a\u015bciwo\u015bci (zaimplementowane w podklasach) s\u0105 wizualizowane w osobnych sekcjach.<\/p>\n<p data-start=\"1793\" data-end=\"1864\" data-is-last-node=\"\" data-is-only-node=\"\">Obecnie graficzny debugger wy\u015bwietla nast\u0119puj\u0105ce w\u0142a\u015bciwo\u015bci element\u00f3w:<\/p>\n<ul>\n<li data-start=\"2\" data-end=\"40\"><em data-start=\"2\" data-end=\"38\">com.cisag.pgm.dialog.VisualElement<\/em><\/li>\n<li data-start=\"43\" data-end=\"90\"><em data-start=\"43\" data-end=\"88\">com.cisag.pgm.dialog.VisualElementContainer<\/em><\/li>\n<li data-start=\"93\" data-end=\"123\"><em data-start=\"93\" data-end=\"121\">com.cisag.pgm.dialog.Field<\/em><\/li>\n<li data-start=\"126\" data-end=\"163\"><em data-start=\"126\" data-end=\"161\">com.cisag.pgm.dialog.DecimalField<\/em><\/li>\n<li data-start=\"166\" data-end=\"204\"><em data-start=\"166\" data-end=\"202\">com.cisag.pgm.dialog.QuantityField<\/em><\/li>\n<li data-start=\"207\" data-end=\"245\"><em data-start=\"207\" data-end=\"243\">com.cisag.pgm.dialog.ValueSetField<\/em><\/li>\n<li data-start=\"248\" data-end=\"278\"><em data-start=\"248\" data-end=\"276\">com.cisag.pgm.dialog.Label<\/em><\/li>\n<li data-start=\"281\" data-end=\"314\"><em data-start=\"281\" data-end=\"312\">com.cisag.pgm.dialog.ListView<\/em><\/li>\n<li data-start=\"317\" data-end=\"352\"><em data-start=\"317\" data-end=\"350\">com.cisag.pgm.dialog.Scrollable<\/em><\/li>\n<li data-start=\"355\" data-end=\"391\"><em data-start=\"355\" data-end=\"389\">com.cisag.pgm.dialog.SmartButton<\/em><\/li>\n<\/ul>\n<p data-start=\"393\" data-end=\"576\">W zale\u017cno\u015bci od w\u0142a\u015bciwo\u015bci do ich wy\u015bwietlania i edycji u\u017cywane s\u0105 proste pola tekstowe, pola wyboru (<em data-start=\"496\" data-end=\"506\">CheckBox<\/em>), pola listy (<em data-start=\"521\" data-end=\"531\">ComboBox<\/em>) lub dodatkowe przyciski czy okna dialogowe.<\/p>\n<p data-start=\"578\" data-end=\"853\">W przypadku bardziej z\u0142o\u017conych w\u0142a\u015bciwo\u015bci (o charakterze obiektowym) dost\u0119pne jest \u2013 w razie potrzeby \u2013 okno dialogowe lub popup (specyficzny dla Comarch ERP Enterprise przycisk ze znakiem <em>\u2026<\/em>). Aktualna implementacja ogranicza si\u0119 jednak do nast\u0119puj\u0105cych w\u0142a\u015bciwo\u015bci lub typ\u00f3w obiekt\u00f3w:<\/p>\n<ul>\n<li data-start=\"857\" data-end=\"867\"><em>Border<\/em><\/li>\n<li data-start=\"870\" data-end=\"878\"><em>Font<\/em><\/li>\n<li data-start=\"881\" data-end=\"901\"><em>Data Description<\/em><\/li>\n<li data-start=\"904\" data-end=\"1028\"><em>Color (background, foreground, selectionBackground, selectionForeground, controlBackground, controlForeground)<\/em><\/li>\n<\/ul>\n<h6 id=\"zmiana-wlasciwosci\" ><span class=\"ez-toc-section\" id=\"Zmiana_wlasciwosci\"><\/span>Zmiana w\u0142a\u015bciwo\u015bci<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"1067\" data-end=\"1378\">W\u0142a\u015bciwo\u015bci mo\u017cna zmienia\u0107 w zale\u017cno\u015bci od typu danych, np. poprzez zaznaczenie (<em data-start=\"1148\" data-end=\"1158\">CheckBox<\/em>) lub wprowadzenie tekstu (<em data-start=\"1185\" data-end=\"1196\">TextField<\/em>). Przej\u0119cie nowej warto\u015bci w polach tekstowych nast\u0119puje jednak dopiero przy zmianie pola (utracie fokusu) lub przy u\u017cyciu przycisk\u00f3w [<strong data-start=\"1332\" data-end=\"1338\">OK<\/strong>] albo [<strong data-start=\"1346\" data-end=\"1355\">Zastosuj<\/strong>] w oknach dialogowych.<\/p>\n<p data-start=\"1067\" data-end=\"1378\"><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\">Zmiana w\u0142a\u015bciwo\u015bci element\u00f3w mo\u017ce prowadzi\u0107 do powa\u017cnych b\u0142\u0119d\u00f3w w powi\u0105zanej aplikacji.<\/div><\/section><\/p>\n<p data-start=\"1067\" data-end=\"1378\"><section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">Nie wszystkie zmiany s\u0105 odwracalne, tzn. warto\u015b\u0107 mo\u017cna wprawdzie zmieni\u0107, ale nie mo\u017cna przywr\u00f3ci\u0107 poprzedniej warto\u015bci (domy\u015blnej).<\/div><\/section><\/p>\n<h6 data-start=\"1067\" data-end=\"1378\" id=\"zachowanie-przy-wielokrotnym-wyborze\" ><span class=\"ez-toc-section\" id=\"Zachowanie_przy_wielokrotnym_wyborze\"><\/span>Zachowanie przy wielokrotnym wyborze<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"240\" data-end=\"712\">Niekt\u00f3re w\u0142a\u015bciwo\u015bci, w szczeg\u00f3lno\u015bci warto\u015bci logiczne (<em data-start=\"297\" data-end=\"306\">boolean<\/em>), obs\u0142uguj\u0105 jednoczesn\u0105 edycj\u0119 wielu element\u00f3w. W przypadku wielokrotnego wyboru wy\u015bwietlana jest tylko taka konkretna warto\u015b\u0107, kt\u00f3ra jest identyczna dla wszystkich wybranych element\u00f3w. Je\u015bli warto\u015bci s\u0105 r\u00f3\u017cne, wy\u015bwietlana jest warto\u015b\u0107 nieokre\u015blona. Gdy dla danej w\u0142a\u015bciwo\u015bci ustawiona zostanie nowa warto\u015b\u0107 (r\u00f3wnie\u017c z warto\u015bci nieokre\u015blonej), zostaje ona zmieniona dla wszystkich wybranych element\u00f3w.<\/p>\n<p data-start=\"714\" data-end=\"831\">W\u0142a\u015bciwo\u015bci, kt\u00f3re nie obs\u0142uguj\u0105 takiego zachowania, s\u0105 w przypadku wielokrotnego wyboru wy\u015bwietlane jako <em data-start=\"820\" data-end=\"830\">disabled<\/em>.<\/p>\n<h5 data-start=\"714\" data-end=\"831\" id=\"debugowanie-ukladu\" ><span class=\"ez-toc-section\" id=\"Debugowanie_ukladu\"><\/span>Debugowanie uk\u0142adu<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p data-start=\"714\" data-end=\"831\">Aby analizowa\u0107 b\u0142\u0119dy uk\u0142adu w aplikacjach, graficzny debugger udost\u0119pnia r\u00f3\u017cne narz\u0119dzia pomocnicze.<\/p>\n<h6 data-start=\"714\" data-end=\"831\" id=\"weryfikacja-granic-elementow\" ><span class=\"ez-toc-section\" id=\"Weryfikacja_granic_elementow\"><\/span>Weryfikacja granic element\u00f3w<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"714\" data-end=\"831\">Rozmiar (relatywnej) pozycji elementu mo\u017cna odczyta\u0107 bezpo\u015brednio we w\u0142a\u015bciwo\u015bciach <em data-start=\"84\" data-end=\"99\">VisualElement<\/em> (<em data-start=\"101\" data-end=\"111\">offset X<\/em>, <em data-start=\"113\" data-end=\"123\">offset Y<\/em>, <em data-start=\"125\" data-end=\"132\">width<\/em> oraz <em data-start=\"138\" data-end=\"146\">height<\/em>). Cz\u0119sto jednak \u0142atwiej jest ustawi\u0107 t\u0142o elementu na widoczny kolor. W ten spos\u00f3b bardzo szybko mo\u017cna rozpozna\u0107, czy element ma nieprawid\u0142owy rozmiar lub czy wype\u0142nia ca\u0142y dost\u0119pny obszar kontenera (np. <em data-start=\"350\" data-end=\"362\">ScrollPane<\/em>).<\/p>\n<p data-start=\"714\" data-end=\"831\"><section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">T\u0142o wielu element\u00f3w, w szczeg\u00f3lno\u015bci prostych kontener\u00f3w takich jak <em data-start=\"451\" data-end=\"457\">View<\/em>, jest przezroczyste. Je\u015bli w takich elementach ma by\u0107 wy\u015bwietlany kolor t\u0142a, w wyborze koloru nale\u017cy ustawi\u0107 warto\u015b\u0107 <em data-start=\"575\" data-end=\"581\">cyan<\/em>.<\/div><\/section><\/p>\n<h6 data-start=\"714\" data-end=\"831\" id=\"zmiana-wskazowek-dla-menedzera-ukladu\" ><span class=\"ez-toc-section\" id=\"Zmiana_wskazowek_dla_menedzera_ukladu\"><\/span>Zmiana wskaz\u00f3wek dla mened\u017cera uk\u0142adu<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"678\" data-end=\"897\">Za pomoc\u0105 trzech w\u0142a\u015bciwo\u015bci <em data-start=\"707\" data-end=\"722\">maximum width<\/em>, <em data-start=\"724\" data-end=\"740\">maximum height<\/em> oraz <em data-start=\"746\" data-end=\"762\">minimum height<\/em> mo\u017cna wp\u0142ywa\u0107 na zachowanie r\u00f3\u017cnych mened\u017cer\u00f3w uk\u0142adu (szczeg\u00f3lnie <em data-start=\"830\" data-end=\"841\">BoxLayout<\/em>). Interesuj\u0105ce s\u0105 w szczeg\u00f3lno\u015bci nast\u0119puj\u0105ce warto\u015bci:<\/p>\n<ul>\n<li data-start=\"901\" data-end=\"995\"><strong><em data-start=\"901\" data-end=\"904\">0<\/em> <\/strong>\u2014 okre\u015bla, \u017ce element nie mo\u017ce zosta\u0107 powi\u0119kszony powy\u017cej swojej preferowanej wysoko\u015bci<\/li>\n<li data-start=\"998\" data-end=\"1083\"><strong><em data-start=\"998\" data-end=\"1005\">32767<\/em> (<em data-start=\"1007\" data-end=\"1024\">Short.MAX_VALUE<\/em>)<\/strong> \u2014 okre\u015bla, \u017ce element mo\u017ce zosta\u0107 powi\u0119kszony dowolnie<\/li>\n<li data-start=\"1086\" data-end=\"1152\"><strong><em data-start=\"1086\" data-end=\"1090\">-1<\/em><\/strong> \u2014 mo\u017cna w ten spos\u00f3b przywr\u00f3ci\u0107 warto\u015b\u0107 domy\u015bln\u0105 (<em data-start=\"1141\" data-end=\"1150\">Default<\/em>)<\/li>\n<\/ul>\n<p data-start=\"1154\" data-end=\"1244\" data-is-last-node=\"\" data-is-only-node=\"\">Podobne mo\u017cliwo\u015bci istniej\u0105 r\u00f3wnie\u017c dla w\u0142a\u015bciwo\u015bci <em data-start=\"1206\" data-end=\"1221\">minimum width<\/em> oraz <em data-start=\"1227\" data-end=\"1243\">minimum height<\/em>.<\/p>\n<h6 data-start=\"1154\" data-end=\"1244\" id=\"wyswietlanie-linii-prowadzacych\" ><span class=\"ez-toc-section\" id=\"Wyswietlanie_linii_prowadzacych\"><\/span>Wy\u015bwietlanie linii prowadz\u0105cych<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p data-start=\"1154\" data-end=\"1244\" data-is-last-node=\"\" data-is-only-node=\"\">Je\u015bli w uk\u0142adach wielokolumnowych pojawiaj\u0105 si\u0119 problemy z prostym wyr\u00f3wnaniem p\u00f3l, przyczyn\u0105 cz\u0119sto jest nieprawid\u0142owe (wielokrotne) u\u017cycie linii prowadz\u0105cych (<em data-start=\"206\" data-end=\"214\">Guides<\/em>). Linie prowadz\u0105ce powinny by\u0107 zawsze definiowane tylko raz \u2014 w odniesieniu do hierarchii kontener\u00f3w mo\u017cliwie jak najwy\u017cej.<\/p>\n<p data-start=\"1154\" data-end=\"1244\" data-is-last-node=\"\" data-is-only-node=\"\">Jednokrotna definicja linii prowadz\u0105cych jest szczeg\u00f3lnie przydatna np. wtedy, gdy w obszarze zapyta\u0144 potrzebny jest uk\u0142ad dwukolumnowy, a w obszarze wynik\u00f3w uk\u0142ad pi\u0119ciokolumnowy.<\/p>\n<p data-start=\"1154\" data-end=\"1244\" data-is-last-node=\"\" data-is-only-node=\"\"><section class=\"document-alert-box indicator\"><div class=\"document-alert-title\">Wskaz\u00f3wka<\/div><div class=\"document-alert-content\">W pakiecie <em data-start=\"584\" data-end=\"603\">com.cisag.pgm.gui<\/em> linie prowadz\u0105ce mog\u0105 by\u0107 tworzone po\u015brednio poprzez u\u017cycie konstruktora <em data-start=\"677\" data-end=\"711\">com.cisag.pgm.gui.StandardLayout<\/em> z parametrem r\u00f3\u017cnym od zera. W tym przypadku nie jest to jednak zalecane. Zamiast tego linie prowadz\u0105ce powinny by\u0107 definiowane podczas dodawania kontenera za pomoc\u0105 metody <em data-start=\"885\" data-end=\"896\">setGuides<\/em>.<\/div><\/section><\/p>\n<p data-start=\"1154\" data-end=\"1244\" data-is-last-node=\"\" data-is-only-node=\"\">Aby sprawdzi\u0107, kt\u00f3re kontenery zawieraj\u0105 linie prowadz\u0105ce (lub s\u0105 \u201estandardowymi\u201d kontenerami z <em data-start=\"995\" data-end=\"1011\">Layout-Manager<\/em>), mo\u017cna wy\u015bwietli\u0107 je w graficznym debuggerze, zaznaczaj\u0105c pole wyboru <em data-start=\"1083\" data-end=\"1097\">paint guides<\/em>. Wyszukiwanie rozpoczyna si\u0119 od aktualnie wybranego elementu w hierarchii kontener\u00f3w i trwa do momentu znalezienia elementu z definicj\u0105 linii prowadz\u0105cych. W tym elemencie linie prowadz\u0105ce zostaj\u0105 nast\u0119pnie wy\u015bwietlone.<\/p>\n<p data-start=\"1154\" data-end=\"1244\" data-is-last-node=\"\" data-is-only-node=\"\">Dla ka\u017cdej kolumny mo\u017cna zdefiniowa\u0107 do sze\u015bciu linii prowadz\u0105cych, kt\u00f3re mog\u0105 by\u0107 wykorzystywane w nast\u0119puj\u0105cy spos\u00f3b:<\/p>\n<ul>\n<li data-start=\"120\" data-end=\"157\">pocz\u0105tek kolumny (<em data-start=\"138\" data-end=\"153\">jasnoczerwony<\/em>)<\/li>\n<li data-start=\"160\" data-end=\"199\">pocz\u0105tek etykiety (<em data-start=\"179\" data-end=\"195\">ciemnoczerwony<\/em>)<\/li>\n<li data-start=\"202\" data-end=\"239\">koniec etykiety (<em data-start=\"219\" data-end=\"235\">ciemnoczerwony<\/em>)<\/li>\n<li data-start=\"242\" data-end=\"277\">pocz\u0105tek pola (<em data-start=\"257\" data-end=\"273\">ciemnoczerwony<\/em>)<\/li>\n<li data-start=\"280\" data-end=\"313\">koniec pola (<em data-start=\"293\" data-end=\"309\">ciemnoczerwony<\/em>)<\/li>\n<li data-start=\"316\" data-end=\"347\">koniec kolumny (<em data-start=\"332\" data-end=\"343\">niebieski<\/em>)<\/li>\n<\/ul>\n<p>Szczeg\u00f3lny przypadek wyst\u0119puje, kt\u00f3rego nie nale\u017cy stosowa\u0107: <em data-start=\"410\" data-end=\"416\">View<\/em> znajduje si\u0119 w <em data-start=\"432\" data-end=\"442\">SubShelf<\/em>. Zar\u00f3wno <em data-start=\"452\" data-end=\"458\">View<\/em>, jak i <em data-start=\"466\" data-end=\"476\">SubShelf<\/em> u\u017cywaj\u0105 mened\u017cera uk\u0142adu <em data-start=\"502\" data-end=\"518\">StandardLayout<\/em>. Jak mo\u017cna zobaczy\u0107 na ilustracji, linie prowadz\u0105ce nie s\u0105 w\u00f3wczas identyczne, lecz w <em data-start=\"605\" data-end=\"612\">Shelf<\/em> s\u0105 definiowane ponownie.<\/p>\n<h5 id=\"weryfikacja-sterowania-fokusem\" ><span class=\"ez-toc-section\" id=\"Weryfikacja_sterowania_fokusem\"><\/span>Weryfikacja sterowania fokusem<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Za pomoc\u0105 przycisku <em data-start=\"62\" data-end=\"77\">request focus<\/em> mo\u017cna przypisa\u0107 fokus klawiatury do elementu. Mo\u017ce to by\u0107 przydatne np. wtedy, gdy w kontenerze ma zosta\u0107 sprawdzone, kt\u00f3ry z jego element\u00f3w podrz\u0119dnych otrzyma fokus klawiatury.<\/p>\n<h5 id=\"usuwanie-elementow\" ><span class=\"ez-toc-section\" id=\"Usuwanie_elementow\"><\/span>Usuwanie element\u00f3w<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Za pomoc\u0105 przycisku <em data-start=\"313\" data-end=\"329\">remove element<\/em> mo\u017cliwe jest r\u00f3wnie\u017c usuwanie element\u00f3w.<\/p>\n<p><section class=\"document-alert-box warning\"><div class=\"document-alert-title\">Uwaga<\/div><div class=\"document-alert-content\"><span style=\"font-size: revert; color: initial;\">Usuwanie element\u00f3w mo\u017ce prowadzi\u0107 do powa\u017cnych b\u0142\u0119d\u00f3w w powi\u0105zanej aplikacji.<\/div><\/section><\/span><\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/article>\n<\/div>\n<p data-start=\"4850\" data-end=\"5005\">\n","protected":false},"author":28,"comment_status":"closed","ping_status":"closed","template":"","format":"standard","meta":{"footnotes":""},"class_list":["post-9669","ht_kb","type-ht_kb","status-publish","format-standard","hentry","ht_kb_category-interfejsy-techniczne"],"_links":{"self":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/ht_kb\/9669","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/ht_kb"}],"about":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/types\/ht_kb"}],"author":[{"embeddable":true,"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/users\/28"}],"replies":[{"embeddable":true,"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/comments?post=9669"}],"version-history":[{"count":263,"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/ht_kb\/9669\/revisions"}],"predecessor-version":[{"id":43239,"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/ht_kb\/9669\/revisions\/43239"}],"wp:attachment":[{"href":"https:\/\/pomoc.comarch.pl\/cee\/index.php\/wp-json\/wp\/v2\/media?parent=9669"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}