====== Okénko s několika ovládacími prvky ====== Podobně jako v prvním příkladu vytvoříme nový projekt: Menu **File**, **New Project**, **Java Ant / Java Application** Projekt pojmenuji **Introduction** s velkým písmenem. \\ //Balíček (package) se bude jmenovat introduction s malým písmenem.// \\ //Necháme si vytvořit hlavní třídu introduction.Introduction, kterou později vymažeme.// {{intro_proj.png}} Vytvoříme nový **JFrame** a pojmenujeme ho **MainWindow** \\ (pravou myší na balíček //introduction//, z kontextového menu New a potom JForm) {{intro_form.png}} Z palety přidáme * **Check Box**, bude typu **JCheckBox** a dostane identifikátor **jCheckBox1** * **Text Field**, s identifikátorem jTextField1 * **Slider**, jSlider1 * **Text Area**, jTextArea1 * **Button**, jButton1 {{intro_design.png}} Dvakrát klikneme na tlačítko **jButton1**, objeví se funkce **jButton1ActionPerformed**, \\ do této funkce doplníme pár řádků a sami napíšeme celou funkci **send**. Pro přepínání mezi zdrojovým textem a návrhem slouží tlačítka **Source** a **Design** u horního okraje okna. public void send (String s) { jTextArea1.append (s + "\n"); } private void jButton1ActionPerformed (java.awt.event.ActionEvent evt) { boolean b = jCheckBox1.isSelected(); int n = jSlider1.getValue(); String s = jTextField1.getText(); send ("checkbox: " + b); send ("slider: " + n); send ("text box: " + s); send (""); } Před spuštěním nejspíše odstraňte introduction.Introduction.java a ponechte introduction.MainWindow.java \\ :?: Proč jsem hlavní třídu vytvářel ? Aby mi vznikl balíček //introduction// a já ho nemusel vytvářet. {{intro_files.png}} Nyní můžeme program spustit zeleným trojúhelníkem: {{intro_run.png}} Zdrojový text nalezneme na https://gitlab.fjfi.cvut.cz/culikzde/java-priklady/ \\ Zkuste **Download**, to je tlačítko s ikonkou a bez textu vlevo od tlačítka **Clone** ===== Zdrojový text celého programu ===== package introduction; public class MainWindow extends javax.swing.JFrame { public MainWindow() { initComponents(); } private void initComponents() { jCheckBox1 = new javax.swing.JCheckBox(); jTextField1 = new javax.swing.JTextField(); jSlider1 = new javax.swing.JSlider(); /* ... */ jCheckBox1.setText("jCheckBox1"); jTextField1.setText("abc"); jTextArea1.setColumns(20); jTextArea1.setRows(5); jScrollPane1.setViewportView(jTextArea1); jButton1.setText("jButton1"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); jLabel1.setText("jTextField1"); jLabel2.setText("jSlider1"); jLabel3.setText("jTextArea1"); /* ... */ } public void send (String s) { jTextArea1.append (s + "\n"); } private void jButton1ActionPerformed (java.awt.event.ActionEvent evt) { boolean b = jCheckBox1.isSelected(); int n = jSlider1.getValue(); String s = jTextField1.getText(); send ("checkbox: " + b); send ("slider: " + n); send ("text box: " + s); send (""); } public static void main(String args[]) { /* Create and display the form */ java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new MainWindow().setVisible(true); } }); } // Variables declaration - do not modify private javax.swing.JButton jButton1; private javax.swing.JCheckBox jCheckBox1; private javax.swing.JSlider jSlider1; private javax.swing.JTextArea jTextArea1; private javax.swing.JTextField jTextField1; /* ... */ // End of variables declaration } ===== Balíčky ===== Zdrojové texty náleží do balíčků (packages), aby nedocházelo ke konfliktům identifikátorů. \\ Obvykle se používají doménová jména počínaje nejvyšší doménou, např. //cz.cvut.fjfi// \\ Na nižších úrovních jednotlivé organizace zavádějí další balíčky, např. //cz.cvut.fjfi.sos.uzivatelske_jmeno.jmeno_projektu// \\ Je zvykem jména balíčků začínat malým písmenem. \\ Náš příklad má ne zcela vhodné jmého balíčku //introduction//. package introduction; Zdrojové texty, které nezačínají klíčovým slovem **package** jsou v takzvaném anonymním balíčku (, který je obvykle zobrazován v kořeni stromu). \\ ( Pokud máme balíčky **a** a **a.b**, balíček **a** nemá žándé zvýhodnění při přístupu k balíčku **a.b** ) ===== Třídy ===== Za názvem balíčku mohou následovat importy a deklarace tříd. \\ Java na globální úrovni nedovoluje deklarace funkcí nebo proměnných (k tomu lze použít statické funkce a proměnné ve třídách) Naše třída se jmenuje MainWindow, je dostupná i z jiných balíčků (public) a je rozšířením standardní třídy JFrame z balíčku javax.swing public class MainWindow extends javax.swing.JFrame ===== Import ===== Pokud nechceme uvádět plná jména i s balíčky, použijeme import. package introduction; import javax.swing.JFrame; public class MainWindow extends JFrame nebo importujeme všechny třídy z javax.swing (nikoliv však vnořené balíčky) package introduction; import javax.swing.*; public class MainWindow extends JFrame ===== Identifikátory ===== Identifikátory začínají písmenem nebo podtržítkem a poté mohou následovat písmena, podtržení a číslice. \\ Rozlišují se malá a velká písmena. \\ Jako písmeno můžeme používat libolvolná písmena z //unicodu// tedy písmena s diakritikou nebo národní abecedy. ===== Konstruktor ===== Konstruktory jso metody (funkce deklarované uvnitř třídy), které se jmenují stejně jako třída. \\ Slouží k inicializaci nově vznikých instancí. public MainWindow () { initComponents (); } **public** znamená, že konstruktor je povoleno volat i vně třídy \\ ( Uvidíme i privátní konstruktory, které lze volat jen z jiných konstruktorů ve stejné třídě. ) ===== Metody ===== Překladač nejprve přečte deklarace všch proměnných a hlavičky všech metod ve třídě. \\ A potom při dalším průchodu čte těla metod. Díky tomu může initComponents používat identifikátory deklarované až dále ve třídě. \\ ( Ale nic takového neplatí pro lokální proměnné. ) Např. v metodě initComponents používáme jCheckBox1 deklarovaný až na konci třídy. Ve zmíněné metodě initComponents vidíme, že identikátory jako jButton1 jsou odkazy (ukazatele), do kterých musí být uloženy odkazy na nově vytvořené prvky. jCheckBox1 = new javax.swing.JCheckBox (); jTextField1 = new javax.swing.JTextField (); jSlider1 = new javax.swing.JSlider (); **new** vytváří novou instanci a pokud její kontruktor nemá žádné parametry, musí následovat prázdné kulaté závorky Metoda initComponents je volaná z konstruktoru naší třídy MainWindow. \\ Vývojové prostředí NetBeans ji schovává před programátormem, nedovoluje editovat a zapisuje do ní příkazy odpovídavící návrhu okna pomocí myši. jCheckBox1.setText("jCheckBox1"); jTextArea1.setColumns(20); jTextArea1.setRows(5); jScrollPane1.setViewportView(jTextArea1); Pro nás může být initComponents zdrojem zajímavých informací. \\ Například zkuste nastavit velikost a barvupísma některého prvku a v initComponents naleznete: jButton1.setFont (new java.awt.Font("Nimbus Roman", 0, 24)); jButton1.setForeground (new java.awt.Color(51, 51, 255)); jButton1.setText ("jButton1");