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

Fejlett Programozási Technikák 2.

Hasonló előadás


Az előadások a következő témára: "Fejlett Programozási Technikák 2."— Előadás másolata:

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

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

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

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

5 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 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

6 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:

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

8 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 */); }

9 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

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

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

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

13 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 ? )

14 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

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

16 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

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

18 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

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

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

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

22 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ü.

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

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

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

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

27 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

28 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()) + "\""); }

29 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()) + "\"");

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

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

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

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

34 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

35 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

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

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

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

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

40 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

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

42 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

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

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

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

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

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

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

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

50 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:

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

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

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

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

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

56 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

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

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

59 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

60 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

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

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

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

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

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

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


Letölteni ppt "Fejlett Programozási Technikák 2."

Hasonló előadás


Google Hirdetések