Fejlett Programozási Technikák 2.

Slides:



Advertisements
Hasonló előadás
Grafikus tervezőrendszerek programozása 10. előadás.
Advertisements

A Java programozási nyelvSoós Sándor 1/17 Java programozási nyelv 8. rész – Grafikus felhasználói felület Nyugat-Magyarországi Egyetem Faipari Mérnöki.
II. Grafikus felhasználói interfész
Programozás III STRING-XML.
Programozás III KOLLEKCIÓK 2..
Programozás III GRAFIKUS FELÜLETEK.
Öröklődés 2..
© Kozsik Tamás Tömbök, kollekciók és egyéb alaposztályok.
© Kozsik Tamás Beágyazott osztályok A blokkstrukturáltság támogatása –Eddig: egymásba ágyazható blokk utasítások Osztálydefiníciók is egymásba.
Fájlkezelés, IO Kivételkezelés Belső osztályok
Osztályok Garbage collection.  általában minden osztálynak vannak adattagjai és/vagy metódusai ◦ adattagok megadása:  [láthatóság] [static] [final]
Abstract osztályok és interface-ek Beolvasás és kiíratás 7. gyakorlat.
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 tól TIK I. Előadó MS RoadShow 
Programozás II. 3. Gyakorlat C++ alapok.
Tömbök ismétlés Osztályok Java-ban Garbage collection
Windows operációs rendszer
Ellenőrző kérdések a)Auto-indexing enabled b)Auto-indexing disabled c)Nem eldönthető 1.
VFP programozása report készítése menü készítése dinamikus elemek
C# tagfüggvények.
C# tagfüggvények.
Krizsán Zoltán iit 1.2.  Nem kell vizuális felületnek lennie.  Delegátumok segítségével valósíthatja meg a.NET. Krizsán Zoltán iit Delegátumok C#-ban2.
Kliensoldali Programozás
A JAVA TECHNOLÓGIA LÉNYEGE Többlépcsős fordítás A JAVA TECHNOLÓGIA LÉNYEGE Platformfüggetlenség.
Kivételkezelés.
Webszerkesztés Űrlapok a HTML-ben. Űrlap létrehozása Űrlapunk tartalma a … elemek között fog helyetfoglalni Egy lapon több űrlap is elhelyezhető Több.
VFP Form programozás Form szerkesztő elemei vezérlő elemek
WEB Technológiák WEB-DB és XML ME Általános Informatikai Tsz. dr. Kovács László.

Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz tárgy honlap:
Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz tárgy honlap:
1 Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz tárgy honlap:
Vizuális alkalmazások a FoxProban Páll Éva Boglárka.
Űrlapok és keretek.
Űrlapok.
Objektum orientált programozás a gyakorlatban
HTML nyelv.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Javascript Microsoft által készített kiegészítése Statikus típusosság Nagy projektek Windows 8 fejlesztésénél WinRT egy részét ebben írták Nyílt forráskódú,
Delphi Készítette: Rummel Szabolcs Elérhetőség:
Visual Basic 2008 Express Edition
Visual Basic 2008 Express Edition
1 Verseny 2000 gyakorlat ASP. 2 Gyakorlat Web létrehozása: Frontpage 2000 New Web:
Java programozási nyelv Filekezelés
Java programozási nyelv Adatbekérés konzolról
HTML 2. Űrlapok
Generics Krizsán Zoltán. Bemutató A.NET 2.0 verziótól. A.NET 2.0 verziótól. Típusparaméter Típusparaméter Más nyelvben ez a template (sablon). Más nyelvben.
Programozás III SWING. SWING ALKALMAZÁSOK (ISM.) Swing felületű, eseményvezérelt alkalmazás létrehozása: 1.JFrame alapú osztály létrehozása Szerepe: vezérlés.
Egyenesvonalú (lineáris) adatszerkezetek
Webprogramozó tanfolyam Űrlapok (form-ok). Űrlapok a HTML-ben Biztosan mindenki találkozott már vele – Űrlap példapélda Felhasználási lehetőségei – Regisztráció,
A Visual Basic és a programozás oktatása
1Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Programozás I. 6. gyakorlat.
TÁMOP /1-2F Informatikai gyakorlatok 11. évfolyam Windows Forms alkalmazás készítése Czigléczky Gábor 2009.
Programozás III SWING. SWING ALKALMAZÁSOK (ISM.) Swing felületű, eseményvezérelt alkalmazás létrehozása: 1.JFrame alapú osztály létrehozása Szerepe: vezérlés.
TÁMOP /1-2F JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam Osztályok, objektumok definiálása és alkalmazása. Saját.
Krizsán Zoltán, iit C# osztályok 2 Adattagok  Osztály hatáskörben definiált változó.  Formája: [attribútum] [módosító] típus azonosító [=kezdő érték][,
Az Endnote bibliográfia adatbázis-kezelő szoftver alapvető használata Skultéti Attila
Alkalmazásfejlesztés gyakorlat
ListBox CheckedListBox TextBox
ComboBox A listák nagy helyet foglalnak a formokon, és az általuk felkínált elemek nem bővíthetőek a felhasználó által. Ezen problémák megoldására használhatjuk.
Adatkötés Sablonokkal
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
B M Java Programozás 4. Gy: Java GUI IT A N Tipper, MVC kalkulátor
B M Java Programozás 9. Gy: Java alapok IT A N Adatkezelő 5.rész
B M Java Programozás 7. Gy: Java alapok IT A N Adatkezelő 3.rész
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
B M Java Programozás 6. Gy: Java alapok IT A N Adatkezelő 2.rész
B M Java Programozás 5. Gy: Java alapok IT A N Adatkezelő 1.rész
B M Java Programozás 8. Gy: Java alapok IT A N Adatkezelő 4.rész
Java alkalmazások 10. Előadás.
Függvénysablonok használata
Előadás másolata:

Fejlett Programozási Technikák 2. 14/8

A mai előadás tartalma: JFC és Swing 2/2 Elemek Eseménykezelés

Elemek Információ közlés és bevitel: Információ bevitel: Gombok(button) Legördülő menük(combo box) Listák(list) Menük(menu) Csúszka(slider) Szöveg mező(text area) Információ közlés: Címke(label) Haladás jelző(progress bar) Eszköz tipp(tool tip) Információ közlés és bevitel: Szín választó(color chooser) Fájl választó(file chooser) Táblázat(table) Szöveg támogatás(text) Fa(tree)

Gombok AbstractButton osztály alosztályai: JButton JCheckBox JRadioButton JMenuItem JCheckBoxMenuItem JRadioButtonMenuItem JToggleButton

JButton minden gomb tartalmazhat szöveget és képet(icon) egyaránt, melyek pozicióját megadhatjuk. setVerticalTextPosition(AbstractButton.BOTTOM) setHorizontalTextPosition(AbstractButton.CENTER) Minden gombhoz rendelhetünk gyorsbillentyűt setMnemonic(KeyEvent.VK_E) A gomb feliratát formázhatjuk HTML elemek segítségével (Swing 1.1.1 Beta 1 verzió után) Egy felső szintű tárolóban egy gomb alapértelmezett lehet (ő fogadja az aktuális billentyűzet eseményeket) a gyökér lap getRootPane().setDefaultButton(setButton); metódusával tudjuk az alapértelmezett gombot beállítani

ImageIcon leftButtonIcon = new ImageIcon("images/right.gif"); ImageIcon middleButtonIcon = new ImageIcon("images/middle.gif"); ImageIcon rightButtonIcon = new ImageIcon("images/left.gif"); b1 = new JButton("("<html><font size=-1><b><u>D</u>isable</b>" + " middle button</font>", ", leftButtonIcon); b1.setVerticalTextPosition(AbstractButton.CENTER); b1.setHorizontalTextPosition(AbstractButton.LEFT); b1.setMnemonic(KeyEvent.VK_D); b1.setActionCommand("disable"); b2 = new JButton("Middle button", middleButtonIcon); b2.setVerticalTextPosition(AbstractButton.BOTTOM); b2.setHorizontalTextPosition(AbstractButton.CENTER); b2.setMnemonic(KeyEvent.VK_M); b3 = new JButton("Enable middle button", rightButtonIcon); b3.setMnemonic(KeyEvent.VK_E); b3.setActionCommand("enable"); b3.setEnabled(false); b1.addActionListener(this); b3.addActionListener(this); b1.setToolTipText("Click this button to disable " + "the middle button."); b2.setToolTipText("This middle button does nothing " + "when you click it."); b3.setToolTipText("Click this button to enable the " + "middle button."); JButton példa:

JCheckBox jelölőnégyzeteket használhatunk segítségével JCheckBoxMenuItem segítségével menüben használhatunk jelölőnégyzetet alapértelmezett helyzet setSelected(true)

chinButton = new JCheckBox("Chin"); chinButton.setMnemonic(KeyEvent.VK_C); chinButton.setSelected(true); … CheckBoxListener myListener = new CheckBoxListener(); chinButton.addItemListener(myListener); ... class CheckBoxListener implements ItemListener { public void itemStateChanged(ItemEvent e) { Object source = e.getItemSelectable(); if (source == chinButton) { //...make a note of it... } else if (source == glassesButton) { if (e.getStateChange() == ItemEvent.DESELECTED) picture.setIcon(/* new icon */); }

Rádiógombok JRadioButton és ButtonGroup osztályok segítségével használhatjuk őket A JRadioButtonMenuItem segítségével menüben is használhatóak Két ActionEvent esemény keletkezik egy gomb kiválasztásakor

JRadioButton birdButton = new JRadioButton(birdString); birdButton.setMnemonic(KeyEvent.VK_B); birdButton.setActionCommand(birdString); birdButton.setSelected(true); JRadioButton catButton = new JRadioButton(catString); catButton.setMnemonic(KeyEvent.VK_C); catButton.setActionCommand(catString); … ButtonGroup group = new ButtonGroup(); group.add(birdButton); group.add(catButton); RadioListener myListener = new RadioListener(); birdButton.addActionListener(myListener); catButton.addActionListener(myListener); ... class RadioListener implements ActionListener ... { public void actionPerformed(ActionEvent e) { picture.setIcon(new ImageIcon("images/" + e.getActionCommand() + ".gif")); }

Legördülő menük A JComboBox osztály valósítja meg Lehet írható, olvasható (alapértelmezésben csak olvasható) setEditable(true); Képeket is tartalmazhat (ekkor saját megjelenítőt kell írnunk)

Legördülő menü - Olvasható String[] petStrings = { "Bird", "Cat", "Dog", "Rabbit", "Pig" }; JComboBox petList = new JComboBox(petStrings); petList.setSelectedIndex(4); petList.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JComboBox cb = (JComboBox)e.getSource(); String petName = (String)cb.getSelectedItem(); picture.setIcon(new ImageIcon("images/" + petName + ".gif")); } });

Képeket tartalmazó legördülő menü Írható legördülő menü esetén a ComboBoxEditor interfészt kell megvalósítani. Az alapértelmezett megjelenítő a karakterláncokat és az ikonokat tudja kezelni. Amikor más objektumot talál akkor meghívja az adott objektum toString() metódusát. Saját megjelenítést tudunk definiálni a ListCellRenderer interfész megvalósításával. getListCellRendererComponent( JList list – egy lista objektum mely tartalmazza a megjelenítendő objektumokat Object value – a megjelenítendő objektum int index – a megjelenítendő objektum sorszáma boolean isSelected – ki van-e választva ? boolean cellHasFocus – a fókusz rajta van-e ? )

Példa ImageIcon images[]; public CustomComboBoxDemo() { String[] petStrings = {"Bird", "Cat", "Dog", "Rabbit", "Pig"}; images = new ImageIcon[petStrings.length]; for (int i = 0; i < petStrings.length; i++) { images[i] = new ImageIcon( petStrings[i] + ".gif"); images[i].setDescription(petStrings[i]); } JComboBox petList = new JComboBox(images); ComboBoxRenderer renderer= new ComboBoxRenderer(); renderer.setPreferredSize(new Dimension(200, 130)); petList.setRenderer(renderer); petList.setMaximumRowCount(3); setLayout(new BorderLayout()); add(petList, BorderLayout.NORTH); setBorder(BorderFactory.createEmptyBorder(20,20,20,20)); Példa

class ComboBoxRenderer extends JLabel implements ListCellRenderer { public ComboBoxRenderer() { setOpaque(true); setHorizontalAlignment(CENTER); setVerticalAlignment(CENTER); } public Component getListCellRendererComponent( JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { if (isSelected) { setBackground(list.getSelectionBackground()); setForeground(list.getSelectionForeground());} else { setBackground(list.getBackground()); setForeground(list.getForeground());} ImageIcon icon = (ImageIcon)value; setText(icon.getDescription()); setIcon(icon); return this;

Listák A JList objektum valósítja meg. JScroll lapra célszerű elhelyezni. Konstruktorában minden olyan objektumot felhasználhatunk amely megvalósítja a ListModel interfészt. Az így megadott lista nem változtatható. A DefaultListModel interfészt megvalósító objektum segítségével létrehozott lista változtatható. setModel() A listából egy vagy több elemet is kiválaszthatunk: SINGLE_SELECTION SINGLE_INTERVAL_SELECTION MULTIPLE_INTERVAL_SELECTION

static Vector imageList; ... JList list = new JList(imageList); list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); JScrollPane listScrollPane = new JScrollPane(list); … public void valueChanged(ListSelectionEvent e) { if (e.getValueIsAdjusting()) return; JList theList = (JList)e.getSource(); if (theList.isSelectionEmpty()) { picture.setIcon(null); } else { int index = theList.getSelectedIndex(); ImageIcon newImage = new ImageIcon("images/" + (String)imageList.elementAt(index)); picture.setIcon(newImage); picture.setPreferredSize(new Dimension( newImage.getIconWidth(), newImage.getIconHeight() )); picture.revalidate(); }

Változtatható Lista listModel = new DefaultListModel(); listModel.addElement("Alison Huml"); listModel.addElement("Kathy Walrath"); ... list = new JList(listModel); public void actionPerformed(ActionEvent e) { int index = list.getSelectedIndex(); listModel.remove(index); int size = listModel.getSize(); … } if (index == -1 || (index+1 == size)) { listModel.addElement(employeeName.getText()); list.setSelectedIndex(size); } else { listModel.insertElementAt(employeeName.getText(), index+1); list.setSelectedIndex(index+1); Változtatható Lista

Menük Segítségükkel kis helyen sok választási lehetőséget ajánlhatunk fel. Használhatjuk az alábbi objektumokat is: JComboBox JList JRadioButton JToolBar A menük a többi elemtől eltérően mint „menu bar” vagy mint „popup menu” jelennek meg. Használhatunk gyorsbillentyűket (Accelerator) és rövidítéseket is (mnemonic).

//in the constructor for a JFrame subclass: JMenuBar menuBar; JMenu menu, submenu; JMenuItem menuItem; JCheckBoxMenuItem cbMenuItem; JRadioButtonMenuItem rbMenuItem; ... menuBar = new JMenuBar(); setJMenuBar(menuBar); menu = new JMenu("A Menu"); menu.setMnemonic(KeyEvent.VK_A); menu.getAccessibleContext().setAccessibleDescription( "The only menu in this program that has menu items"); menuBar.add(menu); menuItem = new JMenuItem("A text-only menu item",KeyEvent.VK_T); menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_1, ActionEvent.ALT_MASK)); menuItem.getAccessibleContext().setAccessibleDescription( "This doesn't really do anything"); menu.add(menuItem); menuItem = new JMenuItem("Both text and icon", new ImageIcon("images/middle.gif")); menuItem.setMnemonic(KeyEvent.VK_B);

menu.addSeparator(); ButtonGroup group = new ButtonGroup(); rbMenuItem = new JRadioButtonMenuItem("A radio button menu item"); rbMenuItem.setSelected(true); rbMenuItem.setMnemonic(KeyEvent.VK_R); group.add(rbMenuItem); menu.add(rbMenuItem); rbMenuItem = new JRadioButtonMenuItem("Another one"); rbMenuItem.setMnemonic(KeyEvent.VK_O); ... submenu = new JMenu("A submenu"); submenu.setMnemonic(KeyEvent.VK_S); menuItem = new JMenuItem("An item in the submenu"); menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_2, ActionEvent.ALT_MASK)); submenu.add(menuItem); menuItem = new JMenuItem("Another item"); menu.add(submenu);

A Pop Up menü használata Használatához egy egér kezelőt kell regisztrálnunk Az egér eseményre jelenik meg a menü.

JPopupMenu popup; popup = new JPopupMenu(); menuItem = new JMenuItem("A popup menu item"); menuItem.addActionListener(this); popup.add(menuItem); menuItem = new JMenuItem("Another popup menu item"); MouseListener popupListener = new PopupListener(); output.addMouseListener(popupListener); menuBar.addMouseListener(popupListener); ... class PopupListener extends MouseAdapter { public void mousePressed(MouseEvent e) { maybeShowPopup(e);} public void mouseReleased(MouseEvent e) { maybeShowPopup(e); } private void maybeShowPopup(MouseEvent e) { if (e.isPopupTrigger()) { popup.show(e.getComponent(), e.getX(), e.getY()); }

Csúszka A JSlider osztály valósítja meg. Segítségével a kiküszöbölhetjük beviteli hibákat. Alapértelmezésben a nagy és a kicsi beosztások között 0 a távolság. Ha látni szeretnénk őket akkor be kell állítanunk: setMajorTickSpacing(10) setMinorTickSpacing(1) setPaintTicks(true) setPaintLabels(true) Saját feliratokat is alkalmazhatunk setLabelTable(labelTable);

JSlider framesPerSecond = new JSlider(JSlider JSlider framesPerSecond = new JSlider(JSlider.HORIZONTAL,0, 30, FPS_INIT); framesPerSecond.addChangeListener(new SliderListener()); framesPerSecond.setMajorTickSpacing(10); framesPerSecond.setMinorTickSpacing(1); framesPerSecond.setPaintTicks(true); framesPerSecond.setPaintLabels(true); framesPerSecond.setBorder(BorderFactory.createEmptyBorder(0,0,10,0)); . . . contentPane.add(framesPerSecond); ... class SliderListener implements ChangeListener { public void stateChanged(ChangeEvent e) { JSlider source = (JSlider)e.getSource(); if (!source.getValueIsAdjusting()) { int fps = (int)source.getValue(); if (fps == 0) { if (!frozen) stopAnimation(); } else { delay = 1000 / fps; timer.setDelay(delay); timer.setInitialDelay(delay * 10); if (frozen) startAnimation(); …

Saját címkék JSlider framesPerSecond = new JSlider(JSlider.VERTICAL,0, 30, FPS_INIT); framesPerSecond.addChangeListener(new SliderListener()); framesPerSecond.setMajorTickSpacing(10); framesPerSecond.setPaintTicks(true); Hashtable labelTable = new Hashtable(); labelTable.put( new Integer( 0 ), new JLabel("Stop") ); labelTable.put( new Integer( 3 ), new JLabel("Slow") ); labelTable.put( new Integer( 30 ), new JLabel("Fast") ); framesPerSecond.setLabelTable( labelTable ); framesPerSecond.setPaintLabels(true);

Szöveg komponensek segítségükkel szöveget írhatunk olvashatunk öt különböző képességű komponenst használhatunk melyek a JTextComponent ősosztályból származnak a következő funkciókat biztosítják: a tartalom kezelésére dokumentum modell a megjelenítésre a nézet modell az „editor kit” nevű komponens a szöveg írására, olvasására testre szabhatjuk a karaktertáblát „végtelen” visszavonás, visszavonás visszavonása

Szöveg mező: JTextField textField = new JTextField(10); textField.setActionCommand(textFieldString); textField.addActionListener(this); ... public void actionPerformed(ActionEvent e) { String prefix = "You typed \""; if (e.getActionCommand().equals(textFieldString)) { JTextField source = (JTextField)e.getSource(); actionLabel.setText(prefix + source.getText() + "\""); } else { JPasswordField source = (JPasswordField)e.getSource(); actionLabel.setText(prefix + new String(source.getPassword()) + "\""); }

Password mező JPasswordField passwordField = new JPasswordField(10); passwordField.setActionCommand(passwordFieldString); passwordField.addActionListener(this); String prefix = "You typed \""; ... JPasswordField source = (JPasswordField)e.getSource(); actionLabel.setText(prefix + new String(source.getPassword()) + "\"");

Szöveg terület (text area) Több soros szöveg megjelenítésére alkalmas, használhatunk egeret és billentyűzetet egyaránt JTextArea textArea = new JTextArea( "This is an editable JTextArea " + "that has been initialized with the setText method. " + "in any font, all of the text is in the same font." ); textArea.setFont(new Font("Serif", Font.ITALIC, 16)); textArea.setLineWrap(true); textArea.setWrapStyleWord(true); ... JScrollPane areaScrollPane = new JScrollPane(textArea); areaScrollPane.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); areaScrollPane.setPreferredSize(new Dimension(250, 250)); areaScrollPane.setBorder(...create border...);

Szöveg szerkesztő lap (EditorPane) a formázott Swing szövegkezelők alaposztálya alapesetben HTML, RTF és egyszerű szövegfájlokat tud megjeleníteni saját szöveg formátumokat is regisztrálhatunk registerEditorKitForContentType() a szöveg bevitel ellnőrzésére saját dokumentum kezelő osztályt valósíthatunk meg (ez minden szövegbeviteli elemre igaz)

JEditorPane editorPane = new JEditorPane(); editorPane.setEditable(false); ... String s = null; try { s = "file:" + System.getProperty("user.dir") + System.getProperty("file.separator") + "TextSamplerDemoHelp.html"; URL url = new URL(s); } catch (Exception e) { System.err.println("Couldn't create help URL: " + s); } editorPane.setPage(url); } catch (IOException e) { System.err.println("Attempted to read a bad URL: " + url); JScrollPane editorScrollPane = new JScrollPane(editorPane); editorScrollPane.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); editorScrollPane.setPreferredSize(new Dimension(250, 145));

Szöveg bevitel ellenőrzése szöveg mező: akció ellenőrzés (minden eseményre lefut, actionPerformed metódust kell megvalósítani) getText getPassword változás ellenőrzés (a mező megváltozásakor ellenőrzi az értékét, saját dokumentumot kell biztosítanunk)

Dokumentum saját dokumentum: insert, remove metódusok értesíti a kezelőket a szöveg megváltozásáról nyomon követi az egyes objektumok pozícióját információkat biztosít a szövegről

Példa JTextPane textPane; static final int MAX_CHARACTERS = 300; … LimitedStyledDocument lsd = new LimitedStyledDocument(MAX_CHARACTERS); ... textPane = new JTextPane(lsd); public void insertString(int offs, String str, AttributeSet a) throws BadLocationException { if ((getLength() + str.length()) <= maxCharacters) super.insertString(offs, str, a); else Toolkit.getDefaultToolkit().beep(); } Példa

Címke JLabel osztály HTML kódot is használhatunk ImageIcon icon = new ImageIcon("images/middle.gif"); . . . label1 = new JLabel("Image and Text", icon, JLabel.CENTER); label1.setVerticalTextPosition(JLabel.BOTTOM); label1.setHorizontalTextPosition(JLabel.CENTER); label2 = new JLabel("Text-Only Label"); label3 = new JLabel(icon); add(label1); add(label2); add(label3);

Haladás jelző JProgressBar progressBar; progressBar = new JProgressBar(0, task.getLengthOfTask()); progressBar.setValue(0); progressBar.setStringPainted(true); ... timer = new Timer(ONE_SECOND, new ActionListener() { public void actionPerformed(ActionEvent evt) { progressBar.setValue(task.getCurrent()); taskOutput.append(task.getMessage() + newline); taskOutput.setCaretPosition(taskOutput.getDocument().getLength()); if (task.done()) { Toolkit.getDefaultToolkit().beep(); timer.stop(); startButton.setEnabled(true); progressBar.setValue(progressBar.getMinimum());} } … int getCurrent() { return current;}

Eszköz tipp minden JComponent elemből származó elemre alkalmazható setToolTipText(”mmm");

Szín választó bárhol elhelyezhető ColorSelectionModel interfész final JLabel banner = new JLabel("Welcome to the Tutorial Zone!",JLabel.CENTER); banner.setForeground(Color.yellow); ... final JColorChooser tcc = new JColorChooser(banner.getForeground()); getContentPane().add(tcc, BorderLayout.CENTER); ColorSelectionModel interfész tcc.getSelectionModel().addChangeListener( new ChangeListener() { public void stateChanged(ChangeEvent e) { Color newColor = tcc.getColor(); banner.setForeground(newColor);}});

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

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); } });

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

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); } });

Szűrés beépített szűrés: alkalmazás vezérelt 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());

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; }

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)

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; }}

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(); }

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)

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)); Minta:

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); }

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(); }}});

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);

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; }}

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); . . .

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

DefaultMutableTreeNode top = new DefaultMutableTreeNode("The Java Series"); createNodes(top); final JTree tree = new JTree(top); . . . JScrollPane treeView = new JScrollPane(tree); private void createNodes(DefaultMutableTreeNode top) { DefaultMutableTreeNode category = null; DefaultMutableTreeNode book = null; category = new DefaultMutableTreeNode( "Books for Java Programmers"); top.add(category); book = new DefaultMutableTreeNode(new BookInfo ("The Java Tutorial: Object-Oriented "+ "Programming for the Internet", "tutorial.html")); category.add(book); ("The Java Tutorial Continued: The Rest of the JDK", "tutorialcont.html"));

Választás kezelése: tree.getSelectionModel().setSelectionMode (TreeSelectionModel.SINGLE_TREE_SELECTION); tree.addTreeSelectionListener(new TreeSelectionListener() { public void valueChanged(TreeSelectionEvent e) { DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); if (node == null) return; Object nodeInfo = node.getUserObject(); if (node.isLeaf()) { BookInfo book = (BookInfo)nodeInfo; displayURL(book.bookURL); } else { displayURL(helpURL); } });

Eseménykezelők I. EventObject Események: 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

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

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)

focus listener A FocusListener interfész: FocusEvent objektum void focusGained(FocusEvent) void focusLost(FocusEvent) FocusEvent objektum boolean isTemporary()

key listener I. két esemény: KeyListener interfész: unicode karakter (key-typed) egy billentyű lenyomása (key-pressed) KeyListener interfész: void keyTyped(KeyEvent) void keyPressed(KeyEvent) void keyReleased(KeyEvent)

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()

mouse events MouseListener interfész: MouseEvent objektum: 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()

mouse-motion events MouseMotionListener interfész: void mouseDragged(MouseEvent) void mouseMoved(MouseEvent)