690 likes | 1.03k Views
Java Swing. Mohammad Iqbal. Macam GUI pada Java. AWT (Abstract Window Toolkit) – SUN Microsystem -> Oracle Product
E N D
Java Swing Mohammad Iqbal
Macam GUI pada Java • AWT (Abstract Window Toolkit) – SUN Microsystem -> Oracle Product • AWT adalah GUI Toolkit pertama pada bahasa pemrograman Java, sayang-nya AWT ini sangat-sangat kekurangan komponen yang biasa digunakan untuk membangun sebuah aplikasi desktop secara lengkap (komponen tabel saja tidak ada ) • Aplikasi yang dibangun menggunakan AWT (Abstract Window Toolkit) akan tampak seperti aplikasi native yaitu, jika aplikasi yang dibangun menggunakan AWT ini dijalankan pada Sistem Operasi Windows. Maka aplikasi ini akan terlihat seperti aplikasi Windows pada umum-nya, dan begitu juga jika dijalankan pada Sistem Operasi Mac ataupun GNU/Linux. Kenapa ini bisa terjadi, karena AWT (Abstract Window Toolkit) ini benar-benar memanggil native subrutin untuk menggambar setiap komponen-nya ke layar. • Java Swing – SUN Microsystem -> Oracle • Adalah GUI Toolkit dalam Pemrograman GUI di Java, • Banyak dikenal dikarenakan dukungan tutorialnya banyak di Internet, dan juga merupakan standart dari Java sehingga tidak perlu melakukan penambahan library lagi kalau ingin menggunakan GUI Toolkit ini. • Terdapat 2 IDE besar yang menggunakan GUI Toolkit Java Swing yaitu NetBeans IDE(OpenSource) dan IntelliJ IDEA (mempunyai versi OpenSource dan Komersial) • Dibandingkan dengan AWT, Swing mempunyai lebih banyak komponen pendukung untuk membangun sebuah aplikasi yang lengkap untuk keperluan desktop. • Swing ini 100 % ditulis dengan bahasa pemrograman Java tanpa adanya sebuah wrapper untuk memanggil rutin-rutin native code via JNI (Java Native Interface). Seluruh komponen yang terdapat pada Swing, semuanya murni digambar sendiri menggunakan API (Application Programming Interface) 2D untuk memanggil rutin-rutin dasar penggambaran komponen-nya. Dengan model seperti ini, memungkinkan sekali aplikasi yang dibangun menggunakan Swing tampak sama persis di berbagai macam Sistem Operasi. • Swing juga mempunyai kemampuan untuk berganti-ganti tampilan menggunakan LAF (Look And Feel) atau themes Sayang-nya, jika kita menginginkan tampilan GUI yang native (tampilan-nya sama seperti aplikasi-aplikasi lain pada sistem operasi target) Swing seperti-nya masih terasa kurang smooth terutama dukungan pada font rendering-nya .
Macam GUI pada Java SWT (Standart Widget Tookit) – IBM Product -> Eclipse Foundation SWT (Standart Widget Toolkit) ini adalah sebuah GUI Toolkit yang dikeluaran oleh IBM sebagai alternatif dari AWT/Java Swing milik SUN Microsystem, yang membedakan antara SWT (Standart Widget Toolkit) dan AWT/Java Swing adalah SWT ini benar-benar mengakses native GUI library yang terdapat pada Sistem Operasi melalui JNI (Java Native Interface). Dengan model seperti ini, memungkinkan tampilan aplikasi yang dibangun menggunakan GUI Toolkit SWT menjadi sama persis dengan aplikasi native lain-nya. Kekurangan dari model pemanggilan native GUI library seperti ini adalah kita harus menyediakan library untuk tiap-tiap Sistem Operasi target aplikasi kita. QtJambi – Trolltech -> Nokia Product -> Stopped and Taken By Community • Pernah menggunakan Desktop Environment KDE ? Ingin membuat aplikasi yang tampilan-nya mirip dengan KDE menggunakan bahasa java sebagai dasar-nya, maka QtJambi adalah pilihan yang tepat. Karena QtJambi ini merupakan binding Qt Framework dengan bahasa Java, tetapi sayang-nya proyek QtJambi sudah tidak disupport oleh Nokia dan secara resmi telah ditutup Untung-nya, awal tahun ini ada beberapa developer yang peduli dengan kelangsungan proyek ini dan akhir-nya membuat sebuah komunitas untuk melanjutkan pengembangan proyek QtJambi, sekarang teman-teman bisa melihat perkembangan proyek QtJambi ini pada halaman QtJambi Community JavaGNOME – Community Product • Kalau QtJambi diatas ditujukan untuk teman-teman yang sudah akrab dengan API (Application Programming Interface) Qt Framework, berbeda dengan JavaGNOME Proyek ini lebih dikhususkan untuk teman-teman pecinta GTK atau yang paling banyak dikenal yaitu GNOMESama seperti GUI Toolkit SWT dan QTJambi, JavaGNOME ini juga mengakses native library tetapi API yang digunakan adalah API dari GTK. Untuk teman-teman yang sudah terbiasa membangun aplikasi menggunakan Glade, maka teman-teman bisa men-design form-nya menggunakan Glade dan memanggil-nya menggunakan bahasa java melalui JavaGNOME
Apakah Swing? • Grup 14 packages untuk GUI • 451 class • Bagian dari JFC (Java Foundation Classes)
Swing dan AWT • AWT = Abstract Windows Toolkit (cross platform) • AWT = Versi lama Java GUI 'heavyweight‘ (elemennya terhubung dengan UI OS), • Contoh : Frame AWT bukan JFrame Swing • Hampir semua komponen Swing 'lightweight' (ringan, tdk terhubung dgn OS UI elemen) • Jangan gabung AWT dan Swing, Gunakan Swing saja
Dari AWT ke Swing • AWT: Abstract Windowing Toolkit • import java.awt.* • Swing: new with Java2 • import javax.swing.* • Merupakan Perluasan dari AWT • Banyak komponen baru yang improved. • Standard dialog boxes, tooltips, … • Look-and-feel, skins • Event listeners • API: • http://java.sun.com/j2se/1.3/docs/api/index.html
API Komponen GUI Java: GUI komponen = class • Properties • Methods • Events JButton
Menggunakan Komponen GUI • Create it (Buat) • Instantiate object: b = new JButton(“press me”); • Configure it (Atur) • Properties: b.text = “press me”; • Methods: b.setText(“press me”); • Add it (Tambahkan) • panel.add(b); • Listen to it (dengarkan) • Events: Listeners JButton
Anatomi Aplikasi GUI GUI Internal structure JFrame JFrame JPanel containers JPanel JButton JButton JLabel JLabel
Menggunakan Komponen GUI • Create it • Configure it • Add children (jika container) • Add to parent (kalau bukan menggunakan JFrame) • Listen to it Urutan sangat Penting diperhatikan
Membuat GUI dari bottom up Listener • Create: • Frame • Panel • Components • Listeners • Add: (bottom up) • listeners into components • components into panel • panel into frame JButton JLabel JPanel JFrame
Contoh Langkah Program JFrame f = new JFrame(“title”); JPanel p = new JPanel( ); JButton b = new JButton(“press me”); p.add(b); // add button to panel f.setContentPane(p); // add panel to frame f.show(); press me
Contoh kode Aplikasi import javax.swing.*; class hello { public static void main(String[] args){ JFrame f = new JFrame(“title”); JPanel p = new JPanel(); JButton b = new JButton(“press me”); p.add(b); // add button to panel f.setContentPane(p); // add panel to frame f.show(); } } press me
Swing dan threads • Thread termasuk dalam proses lightweight • Kebanyakan komponen Swing tidak thread-safe • Solusinya adalah harus yakin bahwa semua kode yang men-create dan memodifikasi komponen Swing dieksekusi dalam thread 'event-dispatching‘ yang sama
Swing dan Threads Contoh Aplikasi Swing : Starting-up public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); // << methode untuk memulai Swing } }); }
createAndShowGUI private static void createAndShowGUI() { //Create and set up the window. JFrame frame = new JFrame("Hi.."); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Add a label. JLabel label = new JLabel("Hello World"); frame.getContentPane().add(label); //Display the window. frame.pack(); frame.setVisible(true); } Silahkan coba Kode ini !
Layout Manager • Swing UI menggunakan LayoutManager untuk mengontrol posisi item • Ini adalah pilihan untuk dapat bekerja dalam cara yang berbeda tapi lebih mudah : • frame.setLayout(null);
Posisi Absolut JFrame frame = new JFrame("I am a JFrame"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(20,30,300,100); frame.setLayout(null); JButton butt=new JButton("Click me"); frame.getContentPane().add(butt); butt.setBounds(20, 20, 200,20); frame.setVisible(true); Silahkan coba Kode ini ! - Mulai dengan contoh sebelumnya dan tulis kode ini di bagian CreateandShowGUI()
Respon pada user actions • Berdasarkan model event-handling • Komponen baru seperti button harus memiliki Listener khusus • Obyek Listener diprogram untuk merespon Event objects yang tiba dari komponen • Obyek Listener harus diimplementasikan pada interface yang tepat
Mekanisme Event-handling Interface, mis: ActionListener Event object Listener, mis : JFrame Ketika di klik Komponen, mis: button Saat inisialisasi, komponen akan memilih obyek lain mis: JFrame, untuk menjadi listener Eksekusi method interface yang tepat, mis: actionPerformed
Interface • Interface adalah kumpulan methods • Misalnya : interface ActionListener memiliki satu method – public void actionPerformed(ActionEvent e) • Class dapat mendeklarasikan method ini sebagai implements, misalnya : public class Main implements ActionListener • Harus didefenisikan mthod dalam interface ini atau compiler akan gagal mengkompilasinya. • Suatu Class dapat mengimplementasikan multiple interface.
Demo klik Button • JButton dan JLabel • clickCounts akan mengingat jumlah klik • Class implements ActionListener • Buat JFrame, JButton dan JLabel • Instantiate obyek aplikasi • Set untuk menjadi listener dari button
Demo klik Button * Main.java * * demonstrasi respon klik button */ package swingprogs; import javax.swing.*; import java.awt.event.*; public class Main implements ActionListener { private static void createAndShowGUI() { // make frame.. JFrame frame = new JFrame("I am a JFrame"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(20,30,300,100); frame.getContentPane().setLayout(null); // make a button JButton butt=new JButton("Click me"); frame.getContentPane().add(butt); butt.setBounds(20, 20, 200,20); // instantiate an application object Main app = new Main(); // make the label app.label = new JLabel("0 clicks"); app.label.setBounds(20,40, 200,20); frame.getContentPane().add(app.label); // set the application object to be the thing which // listens to the button butt.addActionListener(app); frame.setVisible(true); }
Demo klik Button public void actionPerformed(ActionEvent e) { // Ini akan dieksekusi ketika button diklik clickCount++; label.setText("Clicks = "+clickCount); } public static void main(String[] args) { // Memulai Swing GUI SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } // application object fields int clickCount=0; JLabel label; }
Button yang mana yang diklik? • Jika menggunakan banyak button, setiap button harus me-link ke actionPerformed • Bagaimana mengetahui button yang mana yang diklik? • Gunakan method .getSource pada obyek ActionEvent
Contoh mendeteksi button yang diklik butt1=new JButton("Button 1"); .. butt2 = new JButton("Button 2"); .. public void actionPerformed(ActionEvent e) { if (e.getSource()==butt1) label.setText("Butt1 clicked"); else label.setText("Butt2 clicked"); } Silahkan coba Kode ini !
Perhatikan dan RasakanLook and Feel (LaF) JTatto CDE/Motif Windows Metal Quaqua Tampilan ini tergantung pada implementasi library LaF, Contoh library lain untuk melakukan make over tampilan aplikasi yang menggunakan bahasa pemrograman java : Substance, Quaqua, JTatto, serta MacWidgets. Baca di : http://blog.fastncheap.com/look-feel-java-swing/#ixzz1xqVFSgC0
Setting LaF (Look and Feel) try { UIManager.setLookAndFeel( "com.sun.java.swing.plaf.motif.MotifLookAndFeel" ); } catch (Exception e) { System.out.println("Cant get laf"); } .. JFrame frame = new JFrame(); This in main() - set laf as first step try .. catch.. because could fail UIManager is in java.lang
Menemukan LaF yang terinstall dalam Sistem Object a[]= UIManager.getInstalledLookAndFeels(); for (int i=0; i<a.length; i++) System.out.println(a[i]);
Dekorasi Frame JFrame.setDefaultLookAndFeelDecorated(true); .. Tinggal panggil JFrame constructor
Swing memiliki banyak Class Internal structure Containers Sesuatu tempat yang mengumpulkan sesuatu lainnya Mis: JFRame, JPanel JFrame containers JPanel Controls User I/O widget Mis: Jbutton, JLabel JButton JLabel
Container top level containers - JFrame JApplet JDialog • General purpose containers - • panel • scroll pane • split pane • tabbed pane • tool bar
JPanel ( pada createAndShowGUI) JFrame.setDefaultLookAndFeelDecorated(true); JFrame frame = new JFrame("I am a JFrame"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(20,30,300,100); frame.setLayout(null); //Create a panel JPanel myPanel = new JPanel(); myPanel.setBackground(new Color(255,3,25)); myPanel.setOpaque(true); //Make it the content panel frame.setContentPane(myPanel); frame.setVisible(true);
JPanel • adalah subclass dari JComponent • Merupakan komponen Swing yang bukan bagian dari top-level container, tapi digunakan sebagai general purpose container • Kita dapat menambahkan border dan tool-tip di sini.
Tool-tip dan border .. myPanel.setOpaque(true); myPanel.setToolTipText("I'm a JPanel"); myPanel.setBorder(BorderFactory.createLineBorder(Color.white)); frame.setContentPane(myPanel); ..
JSplitPane .. setLayout(null); //Create a split pane JSplitPane myPane = new JSplitPane(); myPane.setOpaque(true); frame.setContentPane(myPane); frame.setVisible(true);
JSplitPane menggunakan JPanels //Create a split pane JSplitPane myPane = new JSplitPane(); myPane.setOpaque(true); myPane.setDividerLocation(150); // make two panels JPanel right = new JPanel(); right.setBackground(new Color(255,0,0)); JPanel left = new JPanel(); left.setBackground(new Color(0,255,0)); // set as left and right in split myPane.setRightComponent(right); myPane.setLeftComponent(left);
Latihan • Buatlah Program • Buttons set the colour of the left hand pane
JTextField • Untuk satu baris input teks • Methods : getText, setText • Dapat menggunakan ActionListener, yang dipicu ketika tombol Enter ditekan
Contoh JTextField • Cek Main object fields untuk label dan field teks • Buat panel, set sebagai content pane • Buat dan tambahkan field teks • Tambahkan actionlistener • Buat dan tambahkan label • Program actionPerformed
Contoh JTextField // make a text field app.textField = new JTextField("Type here",20); myPanel.add(app.textField); // set up action listener app.textField.addActionListener(app); // make and add label app.label = new JLabel("Result"); myPanel.add(app.label); frame.setContentPane(myPanel); frame.setVisible(true); } import javax.swing.*; import java.awt.event.*; import java.awt.*; public class Main implements ActionListener { private static void createAndShowGUI() { Main app=new Main(); // make frame.. JFrame.setDefaultLookAndFeelDecorated(true); JFrame frame = new JFrame("I am a JFrame"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(20,30,300,120); frame.setLayout(null); // make a panel JPanel myPanel = new JPanel();
Contoh JTextField SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } // application object fields JLabel label; JTextField textField; } public void actionPerformed(ActionEvent e) { // this happens when Enter hit on the text field label.setText(textField.getText()); } public static void main(String[] args) { // start off.. try { UIManager.setLookAndFeel( "javax.swing.plaf.metal.MetalLookAndFeel" ); } catch (Exception e) { System.out.println("Cant get laf"); }
JTextArea JPanel myPanel = new JPanel(); app.textArea = new JTextArea("Type here",5, 20); myPanel.add(app.textArea); TextArea expands rows and columns as needed
JScrollPane JTextArea textArea = new JTextArea("Type here",5, 20); JScrollPane scrollPane = new JScrollPane(textArea); frame.setContentPane(scrollPane);
Latihan • Buat Program • Gunakan selectAll dan cut methods dari JTextComponent, dengan JTextArea.
Timer .. Timer t = new Timer(1000, app); t.start(); app.label = new JLabel("Time"); app.label.setBounds(20,20,200,20); frame.getContentPane().add(app.label); .. public void actionPerformed(ActionEvent e) { String now = (new java.util.Date()).toString(); label.setText(now); }
Citra Icon JFrame frame = new JFrame("I am Celsius"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(20,30,200,200); frame.getContentPane().setLayout(null); ImageIcon icon = new ImageIcon("c:/celsius.jpg", "Celsius"); JLabel label = new JLabel(icon); label.setBounds(20,20,150,150); frame.getContentPane().add(label); frame.setVisible(true);
JScrollBar Gunakan : • JScrollBar dan JLabel • Constructor argumen • Implementasikan AdjustmentListener • adjustmentValueChanged • e.getValue()
JScrollBar import javax.swing.*; import java.awt.event.*; public class Main implements AdjustmentListener { private static void createAndShowGUI() { // make frame.. JFrame frame = new JFrame("JScrollBar"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(20,30,200,200); frame.getContentPane().setLayout(null); Main app = new Main(); app.sbar = new JScrollBar(java.awt.Adjustable.VERTICAL, 127, 1,0,255); app.sbar.setBounds(20,20, 20, 200); app.sbar.addAdjustmentListener(app); frame.getContentPane().add(app.sbar); app.label = new JLabel(); app.label.setBounds(50,20,100,20); frame.getContentPane().add(app.label); frame.setVisible(true); } public void adjustmentValueChanged(AdjustmentEvent e) { label.setText("Value = "+e.getValue()); } public static void main(String[] args) { // start off.. SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } // application object fields JScrollBar sbar; JLabel label; }
Latihan • Buat Program • Scroll bars determine the red, green and blue components of the background of the panel