Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

1 Fejlett Programozási Technikák 2. 15/6. Fejlett Programozási Technológiák 2. 2 Közhírré tétetik Március 10.-én 14.00-tól TIK I. Előadó MS RoadShow 

Hasonló előadás


Az előadások a következő témára: "1 Fejlett Programozási Technikák 2. 15/6. Fejlett Programozási Technológiák 2. 2 Közhírré tétetik Március 10.-én 14.00-tól TIK I. Előadó MS RoadShow "— Előadás másolata:

1 1 Fejlett Programozási Technikák 2. 15/6

2 Fejlett Programozási Technológiák 2. 2 Közhírré tétetik Március 10.-én tól TIK I. Előadó MS RoadShow  ASP.NET  XML Web Szolgáltatások  … Ingyenes részvétel Regisztrálni célszerű a:  px px

3 Fejlett Programozási Technológiák 2. 3 Az előző előadás tartalma: CVS  Miért van rá szükségünk?  Használata  Címkézés  Ágak kezelése JUnit  Tesztelés  TestCase  TestSuit Log4J  Miért nem println()?  Log  Log4J Ant

4 Fejlett Programozási Technológiák 2. 4 Források Core Java 2

5 Fejlett Programozási Technológiák 2. 5 A mai előadás tartalma: JFC és Swing  Múlt  Felépítés  Java Bean  Felső szintű konténerek  Középső szintű konténerek  Elemek  Eseménykezelés  Rajzolás

6 Fejlett Programozási Technológiák 2. 6 JFC (Java Foundation Classes) olyan alkalmazások csoportja melyek segítségével GUI-t készíthetünk ben a JavaOne konferencián mutatták be A következő csoportokra osztható:  Swing komponenesek (nyomógomb, …)  Beépíthető látvány támogatás (Java, Windows, …)  Hozzáférést támogató API-k vakok részére  Java 2D API (jó minőségű 2D képek készítése)  Drag and Drop támogatás

7 Fejlett Programozási Technológiák 2. 7 Java Swing Nem tartalmaz natív kódot (az AWT tartalmaz) ezért teljesen platform független A Swing komponensek megjelenítését megadhatjuk (az AWT az aktuális platform megjelenítését használja) Az objektumok nevei J betűvel kezdődnek javax.swing.*; java.awt.*; java.awt.event.*;

8 Fejlett Programozási Technológiák 2. 8 Java Beans Visual Programming  VB  Delphi  Java Az elemeket testre szeretnénk szabni:  szín  események … Reflexió segítségével deríti ki tulajdnoságokat

9 Fejlett Programozási Technológiák 2. 9 Bean Egyszerű osztály bizonyos elnevezési konvenciókkal xxx tulajdonság  getXxx  setXxx  isXxx  addListener()  removeListener()

10 Fejlett Programozási Technológiák package frogbean; import java.awt.*; import java.awt.event.*; class Spots {} public class Frog { private int jumps; private Color color; private Spots spots; private boolean jmpr; public int getJumps() { return jumps; } public void setJumps(int newJumps) { jumps = newJumps; } public Color getColor() { return color; } public void setColor(Color newColor) { color = newColor; } public Spots getSpots() { return spots; } public void setSpots(Spots newSpots) { spots = newSpots; } public boolean isJumper() { return jmpr; } public void setJumper(boolean j) { jmpr = j; } public void addActionListener(ActionListener l) { //... } public void removeActionListener(ActionListener l) { //... } public void addKeyListener(KeyListener l) { //... } public void removeKeyListener(KeyListener l) { //... } // An "ordinary" public method: public void croak() { System.out.println("Ribbet!"); } } ///:~

11 Fejlett Programozási Technológiák Java Bean A forráskód nélkül kell a fejlesztő környezetnek megtudnia a használható metódusokat Használhatnánk a Reflexió-t is Inspector osztály  BeanInfo static getBeanInfo( )

12 Fejlett Programozási Technológiák public void dump(Class bean) { results.setText(""); BeanInfo bi = null; try { bi = Introspector.getBeanInfo(bean, Object.class); } catch(IntrospectionException e) { print("Couldn't introspect " + bean.getName()); return; } PropertyDescriptor[] properties = bi.getPropertyDescriptors(); for(int i = 0; i < properties.length; i++) { Class p = properties[i].getPropertyType(); if(p == null) continue; print("Property type:\n " + p.getName() + "Property name:\n " + properties[i].getName()); Method readMethod = properties[i].getReadMethod(); if(readMethod != null) print("Read method:\n " + readMethod); Method writeMethod = properties[i].getWriteMethod(); if(writeMethod != null) print("Write method:\n " + writeMethod); print("===================="); } print("Public methods:"); MethodDescriptor[] methods = bi.getMethodDescriptors(); for(int i = 0; i < methods.length; i++) print(methods[i].getMethod().toString()); print("======================"); print("Event support:"); EventSetDescriptor[] events = bi.getEventSetDescriptors(); for(int i = 0; i < events.length; i++) { print("Listener type:\n " + events[i].getListenerType().getName()); Method[] lm = events[i].getListenerMethods(); for(int j = 0; j < lm.length; j++) print("Listener method:\n " + lm[j].getName()); MethodDescriptor[] lmd = events[i].getListenerMethodDescriptors(); for(int j = 0; j < lmd.length; j++) print("Method descriptor:\n " + lmd[j].getMethod()); Method addListener= events[i].getAddListenerMethod(); print("Add Listener Method:\n " + addListener); Method removeListener = events[i].getRemoveListenerMethod(); print("Remove Listener Method:\n "+ removeListener); print("===================="); }

13 Fejlett Programozási Technológiák Csomagolás Manifest fájl: Manifest-Version: 1.0 Name: bangbean/BangBean.class Java-Bean: True jar cfm BangBean.jar BangBean.mf bangbean

14 Fejlett Programozási Technológiák A GUI felépítése Felső szintű konténerek  helyet biztosítanak a többi komponens számára (JFrame, JDialog, JApplet)  tartalmaznak egy content_pane nevű konténert mely közvetlenül vagy közvetve tartalmaz minden elemet a menüt kivéve  közvetlenül tartalmazhatja a menü elemet Középső szintű általános, speciális konténerek  egyszerűbbé teszik az egyes elemek pozicionálását  minden elem a menüt kivéve itt helyezkedik el  az add() metódust használhatjuk az egyes elemek felhelyezésére Elemi komponensek

15 Fejlett Programozási Technológiák Megjelenítés(Layout management ) I. megállapítja az egyes komponensek helyét és méretét öt különböző menedzsert használhatunk:  BorderLayout  BoxLayout  FlowLayout  GridBagLayout  GridLayout amikor az add() metódust használjuk figyelembe kell vennünk az egyes megjelenítések igényeit is (relatív pozíció) bármikor megválltoztatható JPanel pane = new JPanel(); pane.setLayout(new BorderLayout()); nem kötelező használni ( pane.setLayout(NULL) ), ekkor minden komponensnek meg kell adnunk a méretét és a helyét, hátránya, hogy nem alkalmazkodik a felső szintű konténre átméretezésekor, nem alkalmazkodik a különböző rendszerekhez, fontméretkehez

16 Fejlett Programozási Technológiák Megjelenítés(Layout management ) II. megadhatjuk a komponens minimum, alapértelmezett, maximális méretét (setMinimumSize, setPreferredSize, setMaximumSize ) megadhatjuk a rendezést is (setAlignmentX, setAlignmentY ) a komponensek közötti hely az alábbiaktól függ:  Layout manager  Láthatatlan komponensek  Üres keretek

17 Fejlett Programozási Technológiák A méret megállapítása JFrame esetén:  miután a GUI össze lett rakva a JFrame pack() metódusát meghívjuk, mely megpróbálja kideríteni a keret méretét  a keret megjelenítés menedzselője hozzáadja a keret méretéhez a keret által közvetlenül tartalmazott elemek méretét (content pane, menu bar)  a content pane mérete a megjelenítés menedzserétől függ GridLayout esetén például megpróbál minden elemet egyforma méretűre venni (a legnagyobb méretet veszi fel)  megkérdezi az általa tartalmazott elemek az alapértelmezett méreteit

18 Fejlett Programozási Technológiák Border Layout

19 Fejlett Programozási Technológiák Flow Layout

20 Fejlett Programozási Technológiák Grid Layout

21 Fejlett Programozási Technológiák Esemény kezelés event source event listener minden eseménytípusra külön osztály használandó:  ActionListener  WindowListener  MouseListener  MouseMotionListener  ComponentListener  FocusListener  ListSelectionListener az események objektumként jelennek meg, melyek sok hasznos tulajdonsággal rendelkeznek (esemény forrása, információ az eseményről …) egy esemény forráshoz több esemény kezelő csatlakozhat az esemény kezelésért egy szál a felelős (event-dispatching thread ). Az események kezelése egymás után történik !

22 Fejlett Programozási Technológiák Esemény kezelés megvalósítása a megfelelő interfészt meg kell valósítani public class MyClass implements ActionListener { regisztrálni kell a megfelelő esemény forrásnál esemény kezelőnket someComponent.addActionListener(instanceOfMyClass); meg kell valósítani az interfészt public void actionPerformed(ActionEvent e) {...//code that reacts to the action... } általában névtelen belső osztályt használunk erre a célra button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { numClicks++; label.setText(labelPrefix + numClicks);} } ); célszerű gyors kezelőket írni, vagy ha ez nem oldható meg akkor új szálat indítani !

23 Fejlett Programozási Technológiák Rajzolás szintén az event-dispatching szálban van amikor a Swing GUI-t újra kell rajzolni akkor a legfelső komponenst rajzolja újra és halad lefelé a hierarchiában az egyes komponensek automatikusan újrarajzolják, méretezik magukat revalidate(), repaint() a gördülékeny működés érdekében a Swing az ún. double-buffered technológiát alkalmazza. Előbb a bufferbe összerakja a GUI-t és utána innen másolja ki a képernyőre gyorsíthatjuk a rajzolást ha az egyes elemekre beállítjuk az opaque tulajdonságot (setOpaque(true) ). Ilyenkor az alatta lévő objektumokat nem rajzolja ki.

24 Fejlett Programozási Technológiák Rajzolási sorrend: Háttér Speciális grafika Keret Gyermek objektum

25 Fejlett Programozási Technológiák Swing áttekintés import javax.swing.*; import java.awt.*; import java.awt.event.*; public class SwingApplication { private static String labelPrefix = ”Kattintások száma: "; private int numClicks = 0; public Component createComponents() { final JLabel label = new JLabel(labelPrefix + "0 "); JButton button = new JButton("I'm a Swing button!"); button.setMnemonic(KeyEvent.VK_I); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { numClicks++; label.setText(labelPrefix + numClicks);}}); label.setLabelFor(button); JPanel pane = new JPanel(); pane.setBorder(BorderFactory.createEmptyBorder(30,30,10,30)); pane.setLayout(new GridLayout(0, 1)); pane.add(button); pane.add(label); return pane; } public static void main(String[] args) { try { UIManager.setLookAndFeel( UIManager.getCrossPlatformLookAndFeelClassName()); } catch (Exception e) { } JFrame frame = new JFrame("SwingApplication"); SwingApplication app = new SwingApplication(); Component contents = app.createComponents(); frame.getContentPane().add(contents, BorderLayout.CENTER); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);}}); frame.pack(); frame.setVisible(true); } } Felső Konténer Alsó Konténer Eseménykezelő Felirat Gomb Eseménykezelő Megjelenés

26 Fejlett Programozási Technológiák Eseménykezelők I. EventObject  Object getSource() Események:  alacsony szintű (ablak, alacsony szintű bevitel) egér ablak billentyű...  szemantikus (elemenként különböző lehet pl szöveg mező, gomb) akció (action) elem (item) lista kiválasztás (list selection) Ajánlatos szemantikus eseményeket használni

27 Fejlett Programozási Technológiák Esemény kezelők II. Interfész megvalósítás vs. öröklés  érdemesebb az öröklést választani anonym osztályként (mivel ilyenkor nem kell a sok üres metódust megvalósítani) Általános eseménykezelők:  component listener  focus listener  key listener  mouse events  mouse-motion events

28 Fejlett Programozási Technológiák component listener Az egyes komponensek megváltozásakor hívódik meg Az interfész:  void componentHidden(ComponentEvent)  void componentMoved(ComponentEvent)  void componentResized(ComponentEvent)  void componentShown(ComponentEvent) Component getComponent() addComponentListener(this)

29 Fejlett Programozási Technológiák focus listener A FocusListener interfész:  void focusGained(FocusEvent)  void focusLost(FocusEvent) FocusEvent objektum  boolean isTemporary()

30 Fejlett Programozási Technológiák key listener I. két esemény:  unicode karakter (key-typed)  egy billentyű lenyomása (key-pressed) KeyListener interfész:  void keyTyped(KeyEvent)  void keyPressed(KeyEvent)  void keyReleased(KeyEvent)

31 Fejlett Programozási Technológiák key listener II. KeyEvent objektum:  int getKeyCode()  void setKeyCode(int)  void setModifiers(int)  String getKeyText()  String getKeyModifiersText()  Component getComponent()  boolean isAltDown()  boolean isControlDown()  boolean isMetaDown()  boolean isShiftDown()  int getModifiers()

32 Fejlett Programozási Technológiák mouse events MouseListener interfész:  void mouseClicked(MouseEvent)  void mouseEntered(MouseEvent)  void mouseExited(MouseEvent)  void mousePressed(MouseEvent)  void mouseReleased(MouseEvent) MouseEvent objektum:  int getClickCount()  int getX()  int getY()  Point getPoint()  boolean isPopupTrigger()

33 Fejlett Programozási Technológiák mouse-motion events MouseMotionListener interfész:  void mouseDragged(MouseEvent)  void mouseMoved(MouseEvent)

34 Fejlett Programozási Technológiák Swing komponensek I. Felső szintű tárolók  Applet  Dialog  Frame Általános célú tárolók  Panel  Scroll pane  Split pane  Tabbed pane  Tool bar

35 Fejlett Programozási Technológiák Swing komponensek II. Speciális célú tárolók:  Belső keret (Internal Frame)  Réteges tábla (Layered pane)  Gyökér tábla (Root pane)

36 Fejlett Programozási Technológiák Swing komponensek III. Egyszerű vezérlők:  Gombok  Legördülő lista  Lista  Menü  Csúszka (Slider)  Szöveg mező

37 Fejlett Programozási Technológiák Swing komponensek IV. információ közlő elemek (nem írható):  Felirat (Label)  Progress bar  Tool tip

38 Fejlett Programozási Technológiák Swing komponenesek V. információ közlő elemek (írható):  Szín választó  Fájl választó  Táblázat  Szöveg  Fa

39 Fejlett Programozási Technológiák Felső szintű tárolók használata I. három általánosan használható felső szintű tároló van. a képernyőn való megjelenéshez szükség van egy konténer hierarchiára melynek gyökere egy felső szintű konténer egy alkalmazásban több konténer szerkezete is lehet (egy főablak két dialógus ablakkal) minden felső szintű vezérlő tartalmaz egy content pane-t tartalmazhatnak menüt is getContentPane() - Container objektumot ad vissza nem JComponent objektumot. ha ki akarjuk használni a JComponent osztály lehetőségeit akkor át kell alakítanunk (cast) vagy egy saját objektumot kell létrehoznunk minden felső szintű tároló rendelkezik egy gyökér lappal is melyet csak speciális esetekben kell használnunk JInternal Frame ugyan hasnoló de nem felső szintű

40 Fejlett Programozási Technológiák Felső szintű tárolók használata II. új objektummal: JPanel contentPane = new JPanel(); contentPane.setLayout(new BorderLayout()); contentPane.setBorder(someBorder); contentPane.add(someComponent, BorderLayout.CENTER); contentPane.add(anotherComponent, BorderLayout.SOUTH); topLevelContainer.setContentPane(contentPane); átakalkítva: JComponent x = (JComponent) frame.getContentPane(); x.setLayout(new BorderLayout()); x.setBorder(someBorder); x.add(someComponent, BorderLayout.CENTER); x.add(anotherComponent, BorderLayout.SOUTH);

41 Fejlett Programozási Technológiák import java.awt.*; import java.awt.event.*; import javax.swing.*; public class TopLevelDemo { public static void main(String s[]) { JFrame frame = new JFrame("TopLevelDemo"); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); JLabel yellowLabel = new JLabel(""); yellowLabel.setOpaque(true); yellowLabel.setBackground(Color.yellow); yellowLabel.setPreferredSize(new Dimension(200, 180)); JMenuBar cyanMenuBar = new JMenuBar(); cyanMenuBar.setOpaque(true); cyanMenuBar.setBackground(Color.cyan); cyanMenuBar.setPreferredSize(new Dimension(200, 20)); frame.setJMenuBar(cyanMenuBar); frame.getContentPane().add(yellowLabel, BorderLayout.CENTER); frame.pack(); frame.setVisible(true); }

42 Fejlett Programozási Technológiák Keretek (frames) a JFrame osztály példányaként valósítható meg megjelenítése platformfüggő JFrame(”név") getContentPane() pack() setVisible()

43 Fejlett Programozási Technológiák Dialógus ablakok I. korlátozottabb képességekkel bírnak mint a keretek minden dialógus egy keretből származik amikor a keretet bezárjuk bezáródnak a hozzá tartozó dialógus ablakok is lehet modális (ekkor csak ő fogadja az inputot) saját dialógus ablakot a JDialog osztály segítségével tudunk létrehozni  létrehoz egy gyökér hátlapot  támogatja az ablak bezárást  hasonló funkciói vannak mint a JFrame-nak

44 Fejlett Programozási Technológiák Dialógus ablakok II. egyszerű dialógusablakot a JOptionPane osztályból célszerű példányosítani JOptionPane.showMessageDialog(frame, "Egy minta dialógus ablak"); az alábbi típusokat használhatjuk:  alapértelmezett  figyelmeztetés ( JOptionPane.WARNING_MESSAGE )  kérdés ( JOptionPane.QUESTION_MESSAGE )  hiba ( JOptionPane.ERROR_MESSAGE )  ikon nélküli ( JOptionPane.PLAIN_MESSAGE )  saját ikon ( JOptionPane.INFORMATION_MESSAGE, icon ) a kérdés beállítása:  DEFAULT_OPTION  YES_NO_OPTION,  YES_NO_CANCEL_OPTION  OK_CANCEL_OPTION.

45 Fejlett Programozási Technológiák Dialógus ablak III. import java.awt.*; import java.awt.event.*; import javax.swing.*; public class teszt { public static void main(String s[]) { JFrame frame = new JFrame("TopLevelDemo"); Object[] options = {”Igen", "Nem", "Nem ha mondom!"}; int n = JOptionPane.showOptionDialog(frame, ”Szerinted ez működni fog" + ”minden további nélkül?", ”Jó kérdés", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[2]); System.exit(0); };}

46 Fejlett Programozási Technológiák Appletek JApplet a java.applet.Applet osztályból származik hasonlóan kezelhető mint a keret

47 Fejlett Programozási Technológiák JComponent osztály őse az AWT csomag Container osztálya a felső szintű tárolókat kivéve minden objektum belőle származik szolgáltatásai:  eszköz tippek (Tool Tips)  keretek (borders)  billentyűzet események kezelése  alkalmazásfüggő megjelenítés  tulajdonságok kezelése (név érték párként, putClientProperty )  megjelenítés definiálása (setMaximumSize, …)  speciális hozzáférés támogatása (brail)  dupla tároló (double buffer)

48 Fejlett Programozási Technológiák Közbülső tárolók arra szolgálnak, hogy más elemeket tartalmazzanak a következő típusai vannak:  Panel – A legflexibilisebb. Gyakran használják közbülső tárolóként, a JPanel osztály írja le. Az elemek csoportosítására is gyakran használatos.  Scroll Pane – görgetősávokat biztosít  Split Pane – két részre osztja a területet  Tabbed Pane – több komponenst is tartalmazhat de csak egy látható  Tool Bar – egy elemcsoportot tartalmaz oszlopba, vagy sorba rendezve melyet a felhasználó áthelyezhet

49 Fejlett Programozási Technológiák Hátrészek (Panel) I. általános célú tároló az egyszerű komponensek számára alapértelmezésként csak a saját hátterét rajzolja meg egy speciális függvény felülírásával rajzolhatunk is ( paintComponent() ) public void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(image, 0, 0, this); g.drawImage(image, 90, 0, 300, 62, this); }

50 Fejlett Programozási Technológiák Hátrészek (Panel) II. beállíthatjuk az elrendezést JPanel aPanel = new JPanel(); aPanel.setLayout(new BorderLayout()); JPanel aPanel = new JPanel(new BorderLayout()); komponenseket adhatunk hozzá: aFlowPanel.add(aComponent); aFlowPanel.add(anotherComponent); amikor BorderLayout elrendezést használunk akkor specifikálni kell az elem helyét aBorderPanel.add(aComponent, BorderLayout.CENTER); aBorderPanel.add(anotherComponent, BorderLayout.SOUTH);

51 Fejlett Programozási Technológiák Hátrészek (Panel) III. Fontosabb metódusok:  void add(Component, int) void add(Component, int)  int getComponentCount() int getComponentCount()  Component getComponent(int) Component getComponent(int)  void remove(Component) void remove(Component)  void remove(int) void remove(int)  void removeAll() void removeAll()  void setLayout(LayoutManager) void setLayout(LayoutManager)  LayoutManager getLayout() LayoutManager getLayout()

52 Fejlett Programozási Technológiák Scroll Panes a komponens gördíthető nézetét biztosítja megadhatjuk a görgető sávok jelenlétét JScrollPane(Component, int, int) JScrollPane(int, int)  VERTICAL_SCROLLBAR_AS_NEEDED  HORIZONTAL_SCROLLBAR_AS_NEEDED  VERTICAL_SCROLLBAR_ALWAYS  HORIZONTAL_SCROLLBAR_ALWAYS  VERTICAL_SCROLLBAR_NEVER  HORIZONTAL_SCROLLBAR_NEVER

53 Fejlett Programozási Technológiák Példa textArea = new JTextArea(5, 30); JScrollPane scrollPane = new JScrollPane(textArea);... contentPane.setPreferredSize(new Dimension(400, 100));... contentPane.add(scrollPane, BorderLayout.CENTER);

54 Fejlett Programozási Technológiák Scroll Panes díszítések:  setColumnHeaderView(columnView);  setRowHeaderView(rowView);  setCorner(JScrollPane.UPPER_LEFT_CORNER, buttonCorner);  a Scrollable interfész megvalósításával személyre szabhatjuk a görgetést a kívánt objektumon getScrollableBlockIncrement getScrollableUnitIncrement getPreferredScrollableViewportSize getScrollableTracksViewportHeight getScrollableTracksViewportWidth

55 Fejlett Programozási Technológiák Vonalzók //...where the member variables are defined: private Rule columnView; private Rule rowView;... //...where the GUI is initialized: ImageIcon david = new ImageIcon("images/youngdad.jpeg");... // Create the row and column headers columnView = new Rule(Rule.HORIZONTAL, true); columnView.setPreferredWidth(david.getIconWidth()); rowView = new Rule(Rule.VERTICAL, true); rowView.setPreferredHeight(david.getIconHeight());... pictureScrollPane.setColumnHeaderView(columnView); pictureScrollPane.setRowHeaderView(rowView);...

56 Fejlett Programozási Technológiák Sarkok // Create the corners. JPanel buttonCorner = new JPanel(); isMetric = new JToggleButton("cm", true); isMetric.setFont(new Font("SansSerif", Font.PLAIN, 11)); isMetric.setMargin(new Insets(2,2,2,2)); isMetric.addItemListener(new UnitsListener()); buttonCorner.add(isMetric); //Use the default FlowLayout... // Set the corners. pictureScrollPane.setCorner(JScrollPane.UPPER_LEFT_CORNER, buttonCorner); pictureScrollPane.setCorner(JScrollPane.LOWER_LEFT_CORNER, new Corner()); pictureScrollPane.setCorner(JScrollPane.UPPER_RIGHT_CORNER, new Corner());

57 Fejlett Programozási Technológiák public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) { //lekérdezi a jelenlegi poziciót int currentPosition = 0; if (orientation == SwingConstants.HORIZONTAL) currentPosition = visibleRect.x; else currentPosition = visibleRect.y; //kiszámítja a pixelek számát a jelenlegi pozíció és a legközelebbi egység között if (direction < 0) { int newPosition = currentPosition - (currentPosition / maxUnitIncrement) * maxUnitIncrement; return (newPosition == 0) ? maxUnitIncrement : newPosition; } else { return ((currentPosition / maxUnitIncrement) + 1) * maxUnitIncrement - currentPosition; }

58 Fejlett Programozási Technológiák Példa: köröket helyezhetünk el melyek dinamikusan bővítik a komponens területét

59 Fejlett Programozási Technológiák Példa public ScrollDemo2() {… drawingArea.setBackground(Color.white); drawingArea.addMouseListener(new MyMouseListener()); JScrollPane scroller = new JScrollPane(drawingArea); scroller.setPreferredSize(new Dimension(200,200)); setLayout(new BorderLayout()); add(instructionPanel, BorderLayout.NORTH); add(scroller, BorderLayout.CENTER); } class MyMouseListener extends MouseInputAdapter { final int W = 100; final int H = 100; public void mouseReleased(MouseEvent e) { boolean changed = false;... if (changed) { drawingArea.setPreferredSize(size); drawingArea.revalidate(); } drawingArea.repaint(); }

60 Fejlett Programozási Technológiák public static void main (String args[]) { JFrame frame = new JFrame("ScrollDemo2"); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);} }); frame.setContentPane(new ScrollDemo2()); frame.pack(); frame.setVisible(true); }

61 Fejlett Programozási Technológiák Osztott hátrészek (Split Panes) két objektumot helyez el egymás mellett a felhasználó menet közben dinamikusan változtathatja a határt több részre is feloszthatjuk a területet az egyes elemek egymásba ágyazásával gyakran előbb Scroll Pane-ba helyezzük az objektumokat és csak ezután helyezzük a Split Pane - ba

62 Fejlett Programozási Technológiák Megvalósítás splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, listScrollPane, pictureScrollPane); splitPane.setOneTouchExpandable(true); splitPane.setDividerLocation(150); splitPane.setDividerLocation(0.25); // a negyedénél lesz A minimális méretnél nem lehetnek kisebbek az egyes objektumok Dimension minimumSize = new Dimension(100, 50); listScrollPane.setMinimumSize(minimumSize); pictureScrollPane.setMinimumSize(minimumSize);

63 Fejlett Programozási Technológiák Egymásba ágyazás SplitPaneDemo splitPaneDemo = new SplitPaneDemo(); JSplitPane top = splitPaneDemo.getSplitPane(); label = new JLabel("Click on an image name in the list.", JLabel.CENTER); JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, top, label);

64 Fejlett Programozási Technológiák Címkés hátlapok (Tabbed Panes) egy helyen több elem (általában Panel) helyezkedhet el JTabbedPane(JTabbedPane.LEFT); ( TOP, BOTTOM, LEFT, RIGHT ) insertTab(String, Icon, Component, String, int) removeTabAt(int) void setSelectedIndex(int)

65 Fejlett Programozási Technológiák import javax.swing.JTabbedPane; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JFrame; import java.awt.*; import java.awt.event.*; public class TabbedPaneDemo extends JPanel { public TabbedPaneDemo() { ImageIcon icon = new ImageIcon("images/middle.gif"); JTabbedPane tabbedPane = new JTabbedPane(); Component panel1 = makeTextPanel("Blah"); tabbedPane.addTab("One", icon, panel1, "Does nothing"); tabbedPane.setSelectedIndex(0); … setLayout(new GridLayout(1, 1)); add(tabbedPane); } protected Component makeTextPanel(String text) { JPanel panel = new JPanel(false); JLabel filler = new JLabel(text); filler.setHorizontalAlignment(JLabel.CENTER); panel.setLayout(new GridLayout(1, 1)); panel.add(filler); return panel; }

66 Fejlett Programozási Technológiák public static void main(String[] args) { JFrame frame = new JFrame("TabbedPaneDemo"); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);} }); frame.getContentPane().add(new TabbedPaneDemo(), BorderLayout.CENTER); frame.setSize(400, 125); frame.setVisible(true); }

67 Fejlett Programozási Technológiák Eszköztárak a felhasználó által mozgatható JToolBar(String, int) add(Component) addSeparator() void setFloatable(boolean)

68 Fejlett Programozási Technológiák Példa: public ToolBarDemo() {... JToolBar toolBar = new JToolBar(); addButtons(toolBar);... JPanel contentPane = new JPanel(); contentPane.setLayout(new BorderLayout());... contentPane.add(toolBar, BorderLayout.NORTH); contentPane.add(scrollPane, BorderLayout.CENTER);...} protected void addButtons(JToolBar toolBar) { JButton button = null; button = new JButton(new ImageIcon("images/left.gif"));... toolBar.add(button); button = new JButton(new ImageIcon("images/middle.gif"));... toolBar.add(button); }

69 Fejlett Programozási Technológiák Belső keretek segítségével JFrame szerű ablakokat tudunk egy másik ablakban megnyitni általában JDesktopPane objektumot használunk gyökér objektumnak

70 Fejlett Programozási Technológiák Gyökér keret négy részből áll:  üveg hátlap (glass pane)  réteges hátlap (layered pane)  tartalom hátlap (content pane)  menü (opcionális)

71 Fejlett Programozási Technológiák Réteges hátlap (Layered Pane) egy harmadik dimenziót biztosít (z order) minden elem mely tartalmaz root pane – t tartalmaz layered pane – t is. nincs megjelenítés vezérlője (ezt nekünk kell megírnunk) layeredPane = new JLayeredPane(); layeredPane.setPreferredSize(new Dimension(300, 310)); layeredPane.setBorder(BorderFactory.createTitledBorder( "Move the Mouse to Move Duke")); layeredPane.addMouseMotionListener(new MouseMotionAdapter() {... }); for (int i = 0; i <...number of labels...; i++) { JLabel label = createColoredLabel(...); layeredPane.add(label, new Integer(i));... }

72 Fejlett Programozási Technológiák Üveg hátlap (Glass Pane) akkor hasznos ha olyan eseményeket akarunk kezelni melyek egy vagy több elem által elfoglalt területen következtek be több objektum fölé is rajzolhatunk vele

73 Fejlett Programozási Technológiák Pél frame.getContentPane()); frame.setGlassPane(myGlassPane); … class MyGlassPane extends JComponent { Point point; public void paint(Graphics g) { if (point != null) { g.setColor(Color.red); g.fillOval(point.x - 10, point.y - 10, 20, 20); } public void setPoint(Point p) { point = p; } public MyGlassPane(AbstractButton aButton, JMenuBar menuBar, Container contentPane) { CBListener listener = new CBListener(aButton, menuBar, this, contentPane); addMouseListener(listener); addMouseMotionListener(listener); }}

74 Fejlett Programozási Technológiák Egyszerű komponensek I. a JComponent osztályból származnak az összes szolgáltatásával rendelkeznek (keretvonalak, …):  Button, Check Box, Radio Button - egyszerűen használható egyszerűen testreszabható gombot nyújtanak  Combo Box - Írható és csak olvasható legördülő listát egyaránt biztosít  List Displays – elemcsoportot jelenít meg melyek közül a felhasználó választhat  Menu - menü, sok különböző elemet tartalmazhat  Slider – lehetővé teszi a felhasználó számára, hogy egy folytonos értékhalmazból válasszon  Spinner - kicsi le és fel nyilak segítségével tudunk választani egy diszkrét elemhalmazból  Text Field – egy szöveg sor bevitelére alkalmas

75 Fejlett Programozási Technológiák Egyszerű komponensek II. Néhány elemi komponens csak információ nyújtást biztosít:  Label – szöveget és ikonokat tartalmazhat  Progress Bar - a célig hátralévő és a megtett munka közötti különbséget mutatja  Tool Tip – minden elem fölött megjelenhet egy kis felirat A többi elemi komponens az információ megjelenítésére és bevitelére egyaránt alkalmas:  Color Chooser – Szín választó mely dialógus ablakon kívül és belül is lehet  File Chooser – Fájl választó  Table – Nagyon rugalmas táblázat megjelenítő  Text Support - Egy keret szövegek kezelésére  Tree – komponens hierarchia megjelenítő

76 Fejlett Programozási Technológiák Fájl választó egy GUI interfészt biztosít a fájlrendszerben történő navigálásra beépíthetjük egy felületbe a JFileChooser osztály segítségével modális dialógus ablakként is használhatjuk a JFileChooser API segítségével csak a fájlok megjelenítését garantálja a fájlműveleteket nekünk kell leprogramoznunk CANCEL_OPTION APPROVE_OPTION

77 Fejlett Programozási Technológiák Használata: final JFileChooser fc = new JFileChooser();... openButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int returnVal = fc.showOpenDialog(FileChooserDemo.this); if (returnVal == JFileChooser.APPROVE_OPTION) { File file = fc.getSelectedFile(); log.append("Opening: " + file.getName() + "." + newline); } else { log.append("Open command cancelled by user." + newline); } });

78 Fejlett Programozási Technológiák Metódusai: fc.showSaveDialog() fc.showOpenDialog()  megjegyzi a könyvtárat  mindkettőre érvényesek a beállítások getSelectedFile()  getPath  isDirectory  exists

79 Fejlett Programozási Technológiák Testreszabása: sendButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JFileChooser fc = new JFileChooser(); fc.addChoosableFileFilter(new ImageFilter()); fc.setFileView(new ImageFileView()); fc.setAccessory(new ImagePreview(fc)); int returnVal = fc.showDialog(FileChooserDemo2.this,"Attach"); if (returnVal == JFileChooser.APPROVE_OPTION) { File file = fc.getSelectedFile(); log.append("Attaching file: " + file.getName() + "." + newline); } else { log.append("Attachment cancelled by user." + newline); } });

80 Fejlett Programozási Technológiák Szűrés beépített szűrés:  setFileHidingEnabled(false) alkalmazás vezérelt szűrés  FileFilter osztály  setFileFilter felhasználó által választható szűrés  fc.addChoosableFileFilter(new ImageFilter());

81 Fejlett Programozási Technológiák Szűrés minta: public boolean accept(File f) { if (f.isDirectory()) { return true; } String extension = Utils.getExtension(f); if (extension != null) { if (extension.equals(Utils.tiff) || extension.equals(Utils.tif) || extension.equals(Utils.gif) || extension.equals(Utils.jpeg) || extension.equals(Utils.jpg)) { return true; } else { return false;}} return false; }

82 Fejlett Programozási Technológiák Fájl nézet (File view) FileView osztály fc.setFileView(new ImageFileView()); String getTypeDescription(File f) Icon getIcon(File f) String getName(File f) String getDescription(File f)

83 Fejlett Programozási Technológiák Megvalósítás public Icon getIcon(File f) { String extension = Utils.getExtension(f); Icon icon = null; if (extension != null) { if (extension.equals(Utils.jpeg) || extension.equals(Utils.jpg)) { icon = jpgIcon; } else if (extension.equals(Utils.gif)) { icon = gifIcon; } else if (extension.equals(Utils.tiff) || extension.equals(Utils.tif)) { icon = tiffIcon;} } return icon; }}

84 Fejlett Programozási Technológiák Villámnézet fc.setAccessory(new ImagePreview(fc)); File file = null;... public void propertyChange(PropertyChangeEvent e) { String prop = e.getPropertyName(); if (prop.equals(JFileChooser.SELECTED_FILE_CHANGED_PROPERTY)) { file = (File) e.getNewValue(); if (isShowing()) { loadImage(); repaint(); }

85 Fejlett Programozási Technológiák Táblázat JTable osztály nem tartalmazza az adatokat csak megjeleníti a következő konstruktorok:  minden cellát írhatóvá tesznek  minden adatot egyformán kezelnek (bool is string-ként)  minden adatot egy vektorba kell tenni (adatbázis lekérdezés) JTable(Object[][] rowData, Object[] columnNames) JTable(Vector rowData, Vector columnNames)

86 Fejlett Programozási Technológiák Minta: Object[][] data = { {"Mary", "Campione", "Snowboarding", new Integer(5), new Boolean(false)}, {"Alison", "Huml", "Rowing", new Integer(3), new Boolean(true)}, {"Kathy", "Walrath", "Chasing toddlers", new Integer(2), new Boolean(false)}, {"Mark", "Andrews", "Speed reading", new Integer(20), new Boolean(true)}, {"Angela", "Lih", "Teaching high school", new Integer(4), new Boolean(false)} }; String[] columnNames = {"First Name", "Last Name", "Sport", "# of Years", "Vegetarian"}; final JTable table = new JTable(data, columnNames);... JScrollPane scrollPane = new JScrollPane(table); table.setPreferredScrollableViewportSize(new Dimension(500, 70));

87 Fejlett Programozási Technológiák Testreszabás: oszlop szélességek: TableColumn column = null; for (int i = 0; i < 5; i++) { column = table.getColumnModel().getColumn(i); if (i == 2) { column.setPreferredWidth(100); } else { column.setPreferredWidth(50); }

88 Fejlett Programozási Technológiák Felhasználói kijelölés alapértelmezésként egyszerre több egymás alatt lévő sor is kijelölhető table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);... ListSelectionModel rowSM = table.getSelectionModel(); rowSM.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { if (e.getValueIsAdjusting()) return; ListSelectionModel lsm = (ListSelectionModel)e.getSource(); if (lsm.isSelectionEmpty()) { } else { int selectedRow = lsm.getMinSelectionIndex(); }}});

89 Fejlett Programozási Technológiák Tábla modell: a táblázatok a AbstractTableModel-ből származtatott objektumból nyerik az adatokat ezt mindenképpen létrehozza nem elég okos (bool nem string, az év oszlopban csak szám) saját kedvünk szerint alakíthatjuk JTable table = new JTable(myModel);

90 Fejlett Programozási Technológiák class MyTableModel extends AbstractTableModel { public int getColumnCount() { return columnNames.length; } public int getRowCount() { return data.length; } public String getColumnName(int col) { return columnNames[col]; } public Object getValueAt(int row, int col) { return data[row][col]; } public Class getColumnClass(int c) { return getValueAt(0, c).getClass(); } public boolean isCellEditable(int row, int col) { if (col < 2) { return false; } else { return true; }}

91 Fejlett Programozási Technológiák Felhasználói bevitel public class SimpleTableDemo... implements TableModelListener {... public SimpleTableDemo() {... model = table.getModel(); model.addTableModelListener(this);... } public void tableChanged(TableModelEvent e) {... int row = e.getFirstRow(); int column = e.getColumn(); String columnName = model.getColumnName(column); Object data = model.getValueAt(row, column);... }

92 Fejlett Programozási Technológiák Fa megjelenítés hasonlóan a táblázathoz csak a megjelenítéssel foglalkozik, a tárolással nem JTree osztály minden fának van egy gyökere egy sor egy információt tartalmazhat (node) egy ágnak lehetnek gyermek ágai, vagy levelei

93 Fejlett Programozási Technológiák A mai előadás tartalma: JFC és Swing  Múlt  Felépítés  Java Bean  Felső szintű konténerek  Középső szintű konténerek  Elemek  Eseménykezelés  Rajzolás

94 Fejlett Programozási Technológiák A következő előadás anyaga Java Applet JDBC

95 Fejlett Programozási Technológiák Közhírré tétetik Március 10.-én tól TIK I. Előadó MS RoadShow  ASP.NET  XML Web Szolgáltatások  … Ingyenes részvétel Regisztrálni célszerű a:  px px


Letölteni ppt "1 Fejlett Programozási Technikák 2. 15/6. Fejlett Programozási Technológiák 2. 2 Közhírré tétetik Március 10.-én 14.00-tól TIK I. Előadó MS RoadShow "

Hasonló előadás


Google Hirdetések