Java Niezbednik 12

  • November 2019
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Java Niezbednik 12 as PDF for free.

More details

  • Words: 1,215
  • Pages: 18
Java niezbędnik programisty spotkanie nr 12

Graficzny interfejs użytkownika

1

Opracował Jacek Sroka

Graphical User Interface (GUI) 





Abstract Window Toolkit 

słabo się prezentuje



mało obiektowy



projekt i implementacja zajęły miesiąc



w wersji 1.1 wiele poprawiono i dodano JavaBeans

Swing 

jest oparty na JavaBeans i doskonale nadaje się do tworzenia interfejsu metodą przeciągnij-upuść



nazewnictwo metod jest spójne i po zrozumieniu kilku przykładów do większości zastosowań wystarczy lektura dokumentacji



w całości jest napisany w Javie (komponenty są uznawane za lekkie)



"pluggable look and feel" – można przełączać wygląd w zależności od systemu operacyjnego

Standard Window Toolkit (SWT) – konkurencyjna biblioteka IBM opracowana przy budowie Eclipse 

polega na komponentach GUI systemu operacyjnego 2

Opracował Jacek Sroka

Applety Małe programiki uruchamiane wewnątrz przeglądarki internetowej 



Applety działają w piaskownicy 

izolacja od dysku twardego



bezpieczeństwo dla użytkownika i mniejszy stres dla programisty

Wszystko składające się na applet zazwyczaj musi być ściągane przy każdym uruchomieniu 

dobrym pomysłem jest zamknięcie wszystkiego w archiwum JAR



archiwa JAR oraz poszczególne ich elementy można podpisywać elektronicznie



koniec zamieszania z instalacją nowych wersji aplikacji

3

Opracował Jacek Sroka

Zrąb 

Applety nie zawierają metody main()



Typowa funkcjonalność zawarta jest w zrębie aplikacji (ang. application framework)



Programista rozszerza klasy wchodzące w skład zrębu i przesłania odpowiednie metody



Mechanizm sterowania wbudowany w zrąb odpowiada za wywoływanie tych metod w odpowiednim czasie



To co niezmienne jest zakodowane w ramach zrębu

4

Opracował Jacek Sroka

Cykl życia appletów init() - pierwsza wywoływana metoda, zawsze się ją przesłania, tu



rozmieszczamy komponenty GUI

destroy() - wywoływana, gdy applet już nie będzie potrzebny i należy zwolnić



zasoby (np. jak strona na której się znajdował jest zamykana)

stop() - wywoływana jak applet przestaje być widoczny (np. w wyniku



przewinięcia strony), żeby wstrzymać zasobożerne obliczenia; wywoływana również tuż przed destroy() start() - wywoływana jak applet zaczął być widoczny, żeby wznowić normalne działanie; wywoływana również tuż przed init()



import javax.swing.*; public class Applet1 extends JApplet { public void init() { getContentPane().add(new Jlabel("Witaj Świecie!")); } } 5

Opracował Jacek Sroka

Applet na stronie HTML 

Kiedyś wystarczał prosty znacznik





Ponieważ niektórzy producenci przeglądarek zaczęli go blokować, trzeba skorzystać ze standardowych mechanizmów wbudowanych w przeglądarkę, np. kontrolek ActiveX 



warto się posłużyć narzędziem HtmlConverter

Applet można też uruchomić przy pomocy narzędzia appletviewer 

znacznik wskazujący applet podajemy wtedy w komentarzu import javax.swing.*;

// public class Applet1 extends JApplet { public void init() { getContentPane().add(new JLabel("Applet!")); } }

6

Opracował Jacek Sroka

Wygenerowany znacznik HTML <param name = "type" value = "application/x-java-applet;version=1.5"> <param name = "scriptable" value = "false"> <embed type = "application/x-java-applet;version=1.5" \ CODE = test12.Applet1 \ WIDTH = 100 \ HEIGHT = 50/ scriptable = false pluginspage = "http://java.sun.com/products/plugin/index.html#download"> <noembed> 7

Opracował Jacek Sroka

Applet z metodą main public class Applet2 extends JApplet { public void init() { getContentPane().add(new JLabel("Applet!")); } public static void main(String[] args) { JApplet applet = new Applet2(); JFrame frame = new JFrame("Applet2"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(applet); frame.setSize(100,50); applet.init(); applet.start(); //warto jeszcze wywoływać stop() i destroy(), jak będzie za chwilę frame.setVisible(true); } } 8

Opracował Jacek Sroka

Klasa pomocnicza public class Console { public static String title(Object o) { String t = o.getClass().toString(); if(t.indexOf("class") != -1) t = t.substring(6); return t; } public static void run(JApplet applet, int width, int height) { JFrame frame = new JFrame(title(applet)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(applet); frame.setSize(width, height); applet.init(); applet.start(); frame.setVisible(true); } public static void run(JPanel panel, int width, int height) { JFrame frame = new JFrame(title(panel)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(panel); frame.setSize(width, height); frame.setVisible(true); } }

9

Opracował Jacek Sroka

Dodajemy przycisk import javax.swing.*; import java.awt.*; public class Button1 extends JApplet { private JButton b1 = new JButton("Button 1"), b2 = new JButton("Button 2"); public void init() { Container cp = getContentPane(); cp.setLayout(new FlowLayout());//domyślnie jest BorderLayout cp.add(b1); cp.add(b2); } public static void main(String[] args) { Console.run(new Button1(), 200, 70); } }

10

Opracował Jacek Sroka

Wzorzec Obserwator 

Komponenty GUI mogą generować wiele rodzajów zdarzeń



Zajście poszczególnych zdarzeń może być interesujące dla wielu obiektów



Obiekt zainteresowany danym zdarzeniem rejestruje się jako obserwator tego zdarzenia



Gdy zdarzenie zajdzie obserwowany obiekt iteruje po liście zarejestrowanych obserwatorów i wywołuje podany przez nich kod



Takie rozwiązanie obniża sprzężenie klas graficznego interfejsu użytkownika 

nie muszą być sprzężone ze wszystkimi klasami, które je obserwują



a jedynie z przekazywaną przez nich klasą, na której wykonują wywołanie zwrotne

11

Opracował Jacek Sroka

Przykład import javax.swing.*; import java.awt.event.*; import java.awt.*; public class Button2 extends JApplet { private JButton b1 = new JButton("Button 1"), b2 = new JButton("Button 2"); private JTextField txt = new JTextField(10); class ButtonListener implements ActionListener { public void actionPerformed(ActionEvent e) { String name = ((JButton)e.getSource()).getText(); txt.setText(name); } } private ButtonListener bl = new ButtonListener(); public void init() { b1.addActionListener(bl); b2.addActionListener(bl); Container cp = getContentPane(); cp.setLayout(new FlowLayout()); cp.add(b1); cp.add(b2); cp.add(txt); } public static void main(String[] args) { Console.run(new Button2(), 200, 100); } }

12

Opracował Jacek Sroka

JTextArea public class TextArea extends JFrame { private Jbutton b = new JButton("Add Data"), c = new JButton("Clear Data"); private JTextArea t = new JTextArea(20, 40); private Map<String,String> m = new HashMap<String,String>(); public static void main(String[] args) { Console.run(new TextArea(), 475, 425); } ... }

13

Opracował Jacek Sroka

Przykład c.d. public TextArea() { b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Iterator it = m.entrySet().iterator(); while(it.hasNext()) { Map.Entry me = (Map.Entry)(it.next()); t.append(me.getKey() + ": "+ me.getValue()+"\n"); } } }); c.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { t.setText(""); } }); Container cp = getContentPane(); cp.setLayout(new FlowLayout()); cp.add(new JScrollPane(t)); cp.add(b); cp.add(c); } 14

Opracował Jacek Sroka

Układ 

JApplet, JFrame, JWindow oraz JDialog po wywołaniu getContentPane( ) zwracają obiekt klasy Container



Kontener przechowuje i wyświetla komponenty. Przy pomocy setLayout( ) można zmienić sposób w jaki będą one układane



Niektóre inne klasy jak JPanel przechowują i wyświetlają komponenty bezpośrednio i również bezpośrednio wywołujemy metodę setLayout( )

15

Opracował Jacek Sroka

BorderLayout 

Domyślny dla appletów

import javax.swing.*; import java.awt.*; public class Layout1 extends JApplet { public void init() { Container cp = getContentPane(); cp.add(BorderLayout.NORTH, new JButton("North")); cp.add(BorderLayout.SOUTH, new JButton("South")); cp.add(BorderLayout.EAST, new JButton("East")); cp.add(BorderLayout.WEST, new JButton("West")); cp.add(BorderLayout.CENTER, new JButton("Center")); } public static void main(String[] args) { Console.run(new Layout1(), 300, 250); } }

16

Opracował Jacek Sroka

FlowLayout import javax.swing.*; import java.awt.*; public class Layout2 extends JApplet { public void init() { Container cp = getContentPane(); cp.setLayout(new FlowLayout()); for(int i = 0; i < 20; i++) cp.add(new JButton("Button " + i)); } public static void main(String[] args) { Console.run(new Layout2(), 300, 250); } }



wszystkie komponenty są upychane do najmniejszego możliwego dla nich rozmiaru 

np. dlatego wyrównanie tekstu do prawej na w JLabel nic nie zmieni, bo etykieta miała i tak rozmiar tekstu 17

Opracował Jacek Sroka

Konstruowanie interfejsu metodą przeciągnij i upuść 

Największą kontrolę nad rozmieszczeniem dają GridBagLayout i (trochę prostrzy) BoxLayout



Istnieje wiele narzędzi pozwalających tworzyć interfejs użytkownika metodą przeciągnij i upuść (np. Jbuilder)



Ustawiając układ na null można podać bezwzględne pozycje i rozmiary komponentów.

18

Related Documents

Java Niezbednik 12
November 2019 0
Java 12
November 2019 1
12 Thread Java
November 2019 4
Java Java
June 2020 44
Java
November 2019 24
Java
November 2019 26