{"id":243,"date":"2009-10-26T03:03:17","date_gmt":"2009-10-26T02:03:17","guid":{"rendered":"http:\/\/netrix.org.pl\/index.php\/2009\/10\/26\/swing-czyli-taniec-z-java\/"},"modified":"2011-02-12T02:05:34","modified_gmt":"2011-02-12T01:05:34","slug":"swing-czyli-taniec-z-java","status":"publish","type":"post","link":"https:\/\/netrix.org.pl\/index.php\/2009\/10\/26\/swing-czyli-taniec-z-java\/","title":{"rendered":"Swing czyli taniec z Jav\u0105"},"content":{"rendered":"<p><a href=\"http:\/\/netrix.org.pl\/wp-content\/2009\/10\/200910263.png\"><img loading=\"lazy\" decoding=\"async\" style=\"border-right-width: 0px; margin: 5px 0px 5px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px\" title=\"2009-10-26(3)\" border=\"0\" alt=\"2009-10-26(3)\" align=\"right\" src=\"http:\/\/netrix.org.pl\/wp-content\/2009\/10\/200910263_thumb.png\" width=\"244\" height=\"211\" \/><\/a><\/p>\n<p>Tym razem postawi\u0142em napisa\u0107 o czym\u015b, czym si\u0119 aktualnie zajmuj\u0119 na uczelni czyli programowaniem w Javie, a konkretniej programowanie interfejsu graficznego w Swingu. Java Swing jest w pe\u0142ni obiektow\u0105 (jak sam j\u0119zyk) bibliotek\u0105 graficzn\u0105 s\u0142u\u017c\u0105c\u0105 do majstrowania okienkowego GUI (podobnie jak QT, czy te\u017c Windows Forms). Korzystanie z tej biblioteki jest bardzo proste, niestety ma ona jedn\u0105 podstawow\u0105 wad\u0119 (opr\u00f3cz bycia w Javie) \u2013 domy\u015blnie okienko posiada w\u0142asny style, wi\u0119c nie wykorzystuje systemowego, dlatego mo\u017ce si\u0119 wyr\u00f3\u017cnia\u0107.<\/p>\n<p>Tworzenie okienek w Swingu jest bardzo proste, przyk\u0142adowo wy\u015bwietlenie pustego okienka wygl\u0105da nast\u0119puj\u0105co:    <\/p>\n<pre lang=\"java\" line=\"1\">import javax.swing.SwingUtilities;\r\nimport javax.swing.JFrame;\r\n\r\npublic class Okienko\r\n{\r\n   public static void main(String[] args)\r\n   {\r\n      SwingUtilities.invokeLater(new Runnable()\r\n      {\r\n         public void run()\r\n         {\r\n            JFrame f = new JFrame();\r\n            f.setTitle(\"Hello World!\");\r\n            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\r\n            f.setSize(290, 250);\r\n            f.setVisible(true);\r\n         }\r\n      });\r\n   }\r\n}<\/pre>\n<p><a href=\"http:\/\/netrix.org.pl\/wp-content\/2009\/10\/200910264.png\"><img loading=\"lazy\" decoding=\"async\" style=\"border-right-width: 0px; margin: 5px 0px 5px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px\" title=\"2009-10-26(4)\" border=\"0\" alt=\"2009-10-26(4)\" align=\"right\" src=\"http:\/\/netrix.org.pl\/wp-content\/2009\/10\/200910264_thumb.png\" width=\"244\" height=\"211\" \/><\/a><\/p>\n<p>Ten kr\u00f3tki kod tworzy prost\u0105 formatk\u0119 <em>JFrame<\/em>, a nast\u0119pnie ustawia jej tytu\u0142, rozmiar, akcje zamni\u0119cia i na ko\u0144cu pokazuje okienko. Wszystko to jest wykonywane w funkcji <em>run()<\/em> anonimowej klasy wewn\u0119trznej po interfejsie <em>Runnable<\/em> (swoj\u0105 drog\u0105 najpi\u0119kniejszy mechanizm w Javie :)), kt\u00f3ra dzia\u0142a w osobnym w\u0105tku biblioteki Swing. Jak wida\u0107 jest to bardzo proste.<\/p>\n<p>Co jednak gdy chcemy stworzy\u0107 co\u015b bardziej wyszukanego? Wtedy najlepiej rozszerzy\u0107 (odziedziczy\u0107) klas\u0119 <em>JFrame<\/em>. Maj\u0105c w\u0142asn\u0105 klas\u0119 o wiele \u0142atwiej wszystkim zarz\u0105dza\u0107 wszystkimi komponentami, kt\u00f3re znajduj\u0105 si\u0119 na formatce. Poni\u017cszy kod tworzy formatk\u0119 i wy\u015bwietla na niej przycisk i pole tekstowe:<\/p>\n<pre lang=\"java\" line=\"1\">import java.awt.FlowLayout;\r\nimport javax.swing.*;\r\n\r\npublic class Okienko extends JFrame\r\n{\r\n   private JButton bPisz = new JButton(\"Pisz\");\r\n   private JTextArea textArea = new JTextArea(10, 20);\r\n\r\n   public Okienko()\r\n   {\r\n      setTitle(\"Hello World!\");\r\n      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\r\n      setSize(290, 250);\r\n      \r\n      setLayout(new FlowLayout());\r\n      add(new JScrollPane(textArea));\r\n      add(bPisz);\r\n   }\r\n\r\n   public static void main(String[] args)\r\n   {\r\n      SwingUtilities.invokeLater(new Runnable()\r\n      {\r\n         public void run()\r\n         {\r\n            new Okienko().setVisible(true);\r\n         }\r\n      });\r\n   }\r\n}<\/pre>\n<p>Powy\u017cszy kod jest ju\u017c troszk\u0119 d\u0142u\u017cszy, a jego zadanie polega na wy\u015bwietleniu na formatce przycisku oraz pola tekstowego. Pojawi\u0142y si\u0119 tutaj dodatkowe komponenty takie jak: <em>JButton<\/em>, <em>JTextArea<\/em>, <em>JScrollPane<\/em> oraz funkcja <em>setLayout()<\/em>. Dwa pierwsze s\u0105 oczywiste, bo jest to wspomniany przycisk i pole tekstowe, natomiast <em>JScrollPane<\/em> jest dodatkowym komponentem dodaj\u0105cym do <em>JTextArea<\/em> paski przesuwania (to wszystko przez proste opakowanie go). Funkcja <em>setLayout()<\/em> ustawia spos\u00f3b rozmieszczenia kontrolek. Domy\u015blnym uk\u0142adem jest <em>BorderLayout<\/em>, kt\u00f3ry kontrolki uk\u0142ada jedna na drugiej, natomiast <em>FlowLayout<\/em> ustawia je w taki spos\u00f3b aby wszystkie by\u0142y widoczne (po szczeg\u00f3\u0142y zapraszam do dokumentacji :)).<\/p>\n<p><a href=\"http:\/\/netrix.org.pl\/wp-content\/2009\/10\/200910265.png\"><img loading=\"lazy\" decoding=\"async\" style=\"border-right-width: 0px; margin: 5px 0px 5px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px\" title=\"2009-10-26(5)\" border=\"0\" alt=\"2009-10-26(5)\" align=\"right\" src=\"http:\/\/netrix.org.pl\/wp-content\/2009\/10\/200910265_thumb.png\" width=\"244\" height=\"211\" \/><\/a><\/p>\n<p>No c\u00f3\u017c mamy przycisk, ale teraz co zrobi\u0107, aby po jego naci\u015bni\u0119ciu co\u015b si\u0119 sta\u0142o. Obs\u0142uga akcji na kontrolkach opiera si\u0119 na zdarzeniach, czyli w przypadku naci\u015bni\u0119cia przycisku wywo\u0142ywana jest odpowiednia funkcja, kt\u00f3ra to zdarzenie potrafi obs\u0142u\u017cy\u0107. W takim razie jak obs\u0142u\u017cy\u0107 akcj\u0119 wci\u015bni\u0119cia przycisku? W tym celu nale\u017cy doda\u0107 do przycisku odbiorc\u0119 zdarzenia za pomoc\u0105 funkcji <em>addActionListener()<\/em>. Funkcja ta przyjmuje referencj\u0119 do interfejsu <em>ActionListener<\/em>, z kt\u00f3rego nale\u017cy zaimplementowa\u0107 funkcj\u0119 <em>actionPerformed()<\/em>. W\u0142a\u015bnie ta funkcja zostanie wywo\u0142ana w momencie wyst\u0105pienia zdarzenia.<\/p>\n<p>Wynikowy kod: <\/p>\n<pre lang=\"java\" line=\"1\">import java.awt.FlowLayout;\r\nimport javax.swing.*;\r\nimport java.awt.event.*;\r\n\r\npublic class Okienko extends JFrame\r\n{\r\n   private JButton bPisz = new JButton(\"Pisz\");\r\n   private JTextArea textArea = new JTextArea(10, 20);\r\n\r\n   public Okienko()\r\n   {\r\n      setTitle(\"Hello World!\");\r\n      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\r\n      setSize(290, 250); \r\n      \r\n      bPisz.addActionListener(new ActionListener()\r\n      {\r\n         public void actionPerformed(ActionEvent e)\r\n         {\r\n            textArea.append(\"Hello World \");\r\n         }\r\n      });\r\n\r\n      setLayout(new FlowLayout());\r\n      add(new JScrollPane(textArea));\r\n      add(bPisz);\r\n   }\r\n\r\n   public static void main(String[] args)\r\n   {\r\n      SwingUtilities.invokeLater(new Runnable()\r\n      {\r\n         public void run()\r\n         {\r\n            new Okienko().setVisible(true);\r\n         }\r\n      });\r\n   }\r\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Tym razem postawi\u0142em napisa\u0107 o czym\u015b, czym si\u0119 aktualnie zajmuj\u0119 na uczelni czyli programowaniem w Javie, a konkretniej programowanie interfejsu graficznego w Swingu. Java Swing jest w pe\u0142ni obiektow\u0105 (jak sam j\u0119zyk) bibliotek\u0105 graficzn\u0105 s\u0142u\u017c\u0105c\u0105 do majstrowania okienkowego GUI (podobnie jak QT, czy te\u017c Windows Forms). Korzystanie z tej biblioteki jest bardzo proste, niestety ma [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[29],"tags":[182,76,30,25],"_links":{"self":[{"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/posts\/243"}],"collection":[{"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/comments?post=243"}],"version-history":[{"count":6,"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/posts\/243\/revisions"}],"predecessor-version":[{"id":793,"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/posts\/243\/revisions\/793"}],"wp:attachment":[{"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/media?parent=243"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/categories?post=243"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/tags?post=243"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}