410 likes | 739 Views
Swing. malý náhľad do k ni žnice SWING, a pplet (J A pplet)/ aplikácia (J F rame), timer a v l ákna a SWING , tri m al é case studies: ( typu projekt , pr íklad na skúšku, ... ) podpisovanie appletu ( jarsigner, key tool ) , Literat úra (swing) :
E N D
Swing • malý náhľad do knižnice SWING, • applet (JApplet)/aplikácia (JFrame), • timer a vlákna a SWING, • tri malé case studies: (typu projekt, príklad na skúšku, ...) • podpisovanie appletu (jarsigner, keytool), Literatúra (swing): http://docs.oracle.com/javase/tutorial/uiswing/ http://www.javabeginner.com/java-swing-tutorial.htm Demo (swing nájdete v Javasdk/demo/jfc/SwingSet2): ilustruje množstvo GUI komponentov s tutoriálnym kódom, ktoré tu nebudeme rozoberať. Slúži na ilustráciu, a ako katalóg použitelného kódu. http://www.cs.duke.edu/csl/docs/java/demo/jfc/SwingSet2/SwingSet2.html SwingSet3 demo Cvičenia: príklad skúškovej úlohy
Swing • štandard od Java 2 (1.2), • časť JFC (Java Foundations Classes) • “rozšírenie” knižnice awt, • komponenty sa volajú Jxxx, • vlastný look-and-feel, • rozšírená grafika JAVA2D, • použitie SWING: • javax.swing.* • javax.swing.event • použitie AWT (Abstract Window Toolkit): • java.awt.* • nemiešajte awt a swing komponenty !!! • knižnica swing obsahuje množstvo komponentov, v nasledujúcom • ilustrujeme podrobnejšie JButton, • prehľadovo niektoré ďalšie komponenty.
AWT vs. SWING container JComponent JComponents (>30): AbstractButton, JColorChooser, JComboBox, JFileChooser, JLabel, JOptionPane, JPanel, JPopupMenu, JProgressBar, ... ... container Panel, ScrollPane components Button, Canvas, Checkbox, Choice, Label, List, Scrollbar, TextComponent zdroj: http://en.wikipedia.org/wiki/Swing_%28Java%29
javax.swing Chýba tu Canvas ...
JButton import java.awt.event.*; import java.awt.*; import javax.swing.*; public class JButtonDemo extends JApplet { JButton b1 = new JButton("JButton 1"), b2 = new JButton("JButton 2"); JTextField t = new JTextField(10); public void init() { ActionListener al = new ActionListener() { public void actionPerformed(ActionEvent e){ String name = ((JButton)e.getSource()).getText(); t.setText(name + " Pressed"); } }; setLayout(new FlowLayout()); b1.addActionListener(al); add(b1); b2.addActionListener(al); add(b2); add(t); } Jednoduchý príklad na ilustráciu podobnosti knižníc AWT/SWING. Button->JButton, TextField->JTextField, Applet->JApplet. Layouts a Listenery používame rovnako ako v AWT. Súbor:JButtonDemo.java
Možnosti JButton ImageIcon leftButtonIcon = new ImageIcon(“HappyFace.gif”); . . . jb = new JButton("JButton", HappyFace), jb.setRolloverEnabled(true); jb.setRolloverIcon(ConfusedFace); jb.setPressedIcon(MiscFace); jb.setDisabledIcon(CryFace); jb.setToolTipText("Wow!"); jb2.setMnemonic(KeyEvent.VK_D); jb2.setActionCommand("disable"); • táto aplikácia ilustruje možnosti JButton oproti Button z AWT. JButton: • má ikony, hneď niekoľko druhov, • pressed, disabled, rollover, … • má tooltip (Wow!), • má hotkey (Alt-D), • cez actionCommand logickýmmenom previaže komponent a Listener public void actionPerformed(ActionEvent e) { if ("disable".equals(e.getActionCommand())) { jb2.setEnabled(false); jb.setEnabled(false); } . . . . Súbor:Smiles.java
Čo vieme a platí to ďalej Ak chceme použiť nejaký JComponent JXXX: • musíme ho vytvoriť, t.j. btn = new JButton(“Quit”); • nastaviť jeho vlastnosti btn.setToolTipText("Bye!"); • ak je to kontajner, pridať doň všetky podradené komponenty, • pridať ho do nadradeného kontajnera, t.j. panel.add(btn);this.add(btn); • ak má reagovať, tak nastaviť mu listener, t.j. btn.addActionListener(…); • vytvor: • JFrame/JAppletJFramefr = new JFrame(“Hra”); • JPanelJPanel pan = new JPanel( ); • JComponentJButton btn = new JButton(“Quit”); • Listeneral = new ActionListener() • pridaj: • listener ku JComponentubtn.addActionListener(al); • JComponenty do JPanelupan.add(btn); • JPaneldo JFrame fr.setContentPane(pan); fr.show();
Nemáme Canvas publicclass BezCanvasu extends JApplet { publicvoid init() { setLayout(new BorderLayout()); JPanelAkoCanvas jpac = new JPanelAkoCanvas(); add(jpac,BorderLayout.CENTER); JPanel buttons = new JPanel(); JButton goBtn = new JButton("Go!"); goBtn.addAction buttons.add(goBtn); JButton quitBtn = new JButton("Quit!");quitBtn.addAc buttons.add(quitBtn); add(buttons,BorderLayout.SOUTH); }} publicclass JPanelAkoCanvas extends JPanel { protectedvoid paintComponent(Graphics g) { for(int i = 0; i < getHeight(); i+= 3) g.drawLine(0, i, getWidth(), getHeight()-i); }} Súbor: BezCanvasu.java
Hracia plocha hracia plocha je často šachovnica rôznych rozmerov. Ako ju implementujeme: • jeden veľký canvas/JPanel • musíme riešiť transformáciu pixelových súradníc do súradníc hracej plochy: • anaopak, v metóde paint/paintComponent[i,j] -> [x, y] • grid canvasov/JPanelov: • každý canvas/panel má svoje súradnice od [0,0] • každý canvas/panel má svoj action/mouse listener • každý canvas panel má svoju metódu paint/paintComponent • veľkosť gridu upravíme podľa veľkosti obrázkov, resp. veľkosť obrázku upravíme podľa veľkosti panelu oldImg.getScaledInstance(newWidth,newHeight,Image.SCALE_DEFAULT); • grid buttonov/JButtonov: [e.x,e.y]->[1,1]
JPexeso import javax.swing.*; import java.awt.*; Tento príklad ilustruje použitie komponentu JButton tam, kde sme minule použili Canvas. Namiesto drawImage do Canvasu, nastavujeme ikonu (ImageIcon) komponentu podtriedyJButton publicclass JPexeso extends JApplet { int size = 6; publicvoid init() { setLayout(new GridLayout(size,size)); for(int i = 0; i < size; i++) for(int j = 0; j < size; j++) add(new JPexesoCard(this, i,j)); } } • aplikácia JPexeso je analógia Pexesa z minulej prednášky, • do mriežky veľkosti size x size umiestnime objekty triedy JPexesoCard (JButton), • JPexesoCard si odchytáva udalosti Súbor: JPexeso.java
JPexesoCard public class JPexesoCard extends JButton implements ActionListener { final static String[] pika = {"pk000010.gif", …, "pk000730.gif "}; int i, j;// pozícia na hracej ploche boolean visible = false; //stav: odkrytá, neodkrytá JPexeso ap; //referencia do nadradeného JAppletu JPexesoCard (JPexeso ap, int i, int j) { // konštruktor this.i = i; this.j = j; this.ap = ap; addActionListener(this); } public void actionPerformed(ActionEvent e) { visible = !visible; setIcon(visible?new ImageIcon("images/"+pika[i+j]):null); } //Image to ImageIcon: ImageIcon icn = new ImageIcon(image); } // ImageIcon to Image: Image img = icn.getImage(); • JPexesoCard si pamätá • súradnice na hracej ploche [i,j], • stav (odkrytá, neodkrytá katra) [visible]. • podľa stavu nastaví ikonu JButtonu Súbor: JPexesoCard.java
JFrame JLabel JLabel JFrame JPanel: FlowLayout North JPanel: BorderLayout Center South JPanel: GridLayout JPanel: FlowLayout JButton JButton JButton
JFrame import java.awt.*; import java.awt.event.*; import javax.swing.*; publicclass JApplet2JFrame { publicstaticvoid put(JApplet jp, int width, int height) { JFrame frame = new JFrame(jp.getClass().toString()); // pomenuj frame frame.addWindowListener(new WindowAdapter() { // menom triedy publicvoid windowClosing(WindowEvent e){ // ošetri Frame-close event System.exit(0); } }); frame.getContentPane().add(jp, BorderLayout.CENTER);// vlož JPanel do JFrame frame.setSize(width, height);// nastav veľkosť frame.setVisible(true);// zobrazJFrame naobrazovke } } publicclass JPexesoFrame { publicstaticvoid main(String[] args) { JApplet applet = new JPexeso(); applet.init(); applet.start(); JApplet2JFrame.put(applet,300,300); } } z JAppletu/JPanelu vieme vyrobiť JFrame (aplikáciu) Súbor:JApplet2JFrame.java Súbor:JPexesoFrame.java
import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.*; public class MiniEditor extends JFrame { static JTextArea ta = new JTextArea(20,10); public MiniEditor() { super("minieditor"); JPanel buttons = new JPanel(); JButton b; buttons.setLayout(new GridLayout(6,1)); b = new JButton("Load"); buttons.add(b); b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { loadFile(); }}); // … JPanel jp = new JPanel(); jp.setLayout(new BorderLayout()); jp.add("West",buttons); jp.add("Center", ta); add(jp); } public static void quit() {} static class WL extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } } public static void main(String[] args) { MiniEditor jf = new MiniEditor(); jf.addWindowListener(new WL()); jf.setSize(400,300); jf.setVisible(true); } } import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.*; public classMiniEditor extends JFrame { static JTextArea ta = new JTextArea(20,10); publicMiniEditor() { super("minieditor"); JPanel buttons = new JPanel(); JButton b; buttons.setLayout(new GridLayout(6,1)); b = new JButton("Load"); buttons.add(b); b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { loadFile(); }}); // save, cut, copy, paste, quit JPanel jp = new JPanel(); jp.setLayout(new BorderLayout()); jp.add("West",buttons); jp.add("Center", ta); add(jp); } Minieditor • MiniEditor je BorderLayout, v ktorého West časti je grid ovládacích gombíkov. V strede je JTextArea, ktorý pozná metódy: • cut(), • copy(), • paste(). • Okrem toho aplikácia ilustruje: • showOpenDialog ako metódu pre Load gombík, viď loadFile(), • showSaveDialog pre Save gombík, viď saveFile(). Súbor: MiniEditor.java
loadFile() ilustruje JFileChooser: • showOpenDialog metódu, • getSelectedFile(), • JOptionPane poskytuje štandardné dialógové okná: • showMessageDialog, • showConfirmDialog, • showMessageDialog, • showOptionDialog. public voidloadFile() { JFileChooser fc = new JFileChooser(); if (fc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { File f = fc.getSelectedFile();// vybratý súbor try { ta.read(new FileReader(f), null);// otvor na čítanie } catch (Exception e) {// ak je problém, otvor dialog box JOptionPane.showMessageDialog(this,"cannot open for read:"+f.getName()); } } } Súbor: MiniEditor.java
Menu JMenuBar mb = new JMenuBar(); JMenu fileMenu = new JMenu("File"); JMenuItem mi; mi = new JMenuItem("Load"); mi.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { loadFile(); }}); fileMenu.add(mi); mi = new JMenuItem("Save"); mi.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { saveFile(); }}); fileMenu.add(mi); mb.add(fileMenu); JMenu editMenu = new JMenu("Edit"); .... setJMenuBar(mb); • Menu: • JMenuBar alebo • JPopupMenu. • Menu tvoríme pomocou: • add(JMenu). • JMenu naplníme pomocou: • add(JMenuItem) • addSeparator • JMenuItem prívesíme: • addActionListener Súbor:MiniEditor1.java
Popup menu JPopupMenu popup = new JPopupMenu(); JMenuItem m = new JMenuItem("Cut"); m.addActionListener(cutAl); popup.add(m); m = new JMenuItem("Copy"); m.addActionListener(copyAl); popup.add(m); m = new JMenuItem("Paste"); m.addActionListener(pasteAl); popup.add(m); popup.addSeparator(); m = new JMenuItem("Nothing"); popup.add(m); PopupAdapterpl = newPopupAdapter(); addMouseListener(pl); // podľa toho, kde chceme aby menu reagovalo ta.addMouseListener(pl); // tam pripojíme MouseListener class PopupAdapter extends MouseAdapter { public void mousePressed(MouseEvent e) { if(e.isPopupTrigger()) { popup.show( e.getComponent(), e.getX(), e.getY()); } } } JScrollPane jsp = new JScrollPane(); // scrolovanie jsp.getViewport().add(ta); add("Center",jsp);
Case 1 private Image initOneSmiley(int theSadness) { Image off = createImage(faceSize, faceSize); Graphics g = off.getGraphics(); g.setColor(Color.black); g.fillRect(0, 0, faceSize, faceSize); g.setColor(baseColor); g.fill3DRect(1, 1, faceSize-2, faceSize-2, true); g.fill3DRect(2, 2, faceSize-4, faceSize-4, true); g.setColor(Color.yellow); g.fillOval(6, 6, faceSize-12, faceSize-12); g.setColor(Color.black); g.drawOval(6, 6, faceSize-12, faceSize-12); if (theSadness==sad) { g.drawArc(10, faceSize-13, faceSize-20, faceSize-20, 135, -100); } else if (theSadness==happy) { g.drawArc(10, 10, faceSize-20, faceSize-20, -35, -100); } else { g.fillRect(12, faceSize-12, faceSize-23, 1); } g.fillOval(13, 13, 2, 2); g.fillOval(faceSize-12-2, 13, 2, 2); return off; } • Hra minesweeper (riešenie:A.D.Birrell). Celá hra je kreslená graficky, pre zaujímavosť si pozrite, ako maľuje usmievačíka/smutňáčika, resp. do dokonalosti dovedené maľovanie bomby s tieňom http://birrell.org/andrew/minesweeper/Minesweeper.java
Case 2 • grafické dopracovanie projektu je dôležite, nepodceňujte ho ! • získa vám to body a nie je to v Jave Zdroj: Lukáš Zdechovan
Spracovanie v Jave Zdroj: Lukáš Zdechovan
Simulácia Čo roller, to thread Problém, ako simulovať prirodzené brzdenie rollera
Case 3 • zadanie Plumber z predtermínu 2008: • tri vzorové skúšky (zadania) visia na stránke predmetu • príklad ilustruje štruktúru skúšky: • čítanie konfigurácie hry súboru a vykreslenie plochy, konštrukcia appletu, 8 4 12345623 34613532 35216311 23654545 • ošetrenie udalostí a rozpohybovanie appletu v intenciách pravidiel danej hry, • počítanie a zobrazenie krokov, životov, časomiera, zistenie, či v danej konfigurácii už sme boli a pod, • load a save konfigurácie (serializácia), • algoritmus (napr. kam dotečie voda - hľadanie cesty v grafe (labyrinte), analýza víťaznej konfigurácie, ...)
Plumber(inštalatér) Oddeľte GUI • kreslenie objektov, • komponentov, • appletu od logiky hry • analýza ťahov, • víťazná konfigurácia, • zacyklenie, ... • Plumber – appletBorder & Grid Layout, • PlumberCanvas - MouseListener,kreslenie rúr .png, • PlumberThread - časomiera, Súbor:Plubmer.java
Plumber • čítanie obrázkov: for(int i=1; i<=8; i++) { img[i] = getImage(getCodeBase(),"plumber"+i+".png"); • ak vám nekreslí obrázok, pravdepodobne ste ho nenačítali správne, • najčastejšie nie je v správnom adresári • čítanie vstupnej konfigurácie try { File f = new File("Plumber.txt"); ... // čítanie textového súboru } catch (Exception E) { System.out.println("file does not exist"); } • nezanedbajte výnimky, • píšte na konzolu, čo čítate, • ak čítate vstup po znakoch, nezabudnite, že riadok končí znakmi 13, 10, • rozdiel medzi cifrou a jej ascii kódom je 48. • uloženie konfigurácie počas hry • najjednoduchšie pomocou serializácie (pozri prednášku java.io) • neserializujte celý applet, ale len triedu popisujúcu konfiguráciu hry Súbor:Plubmer.java
0,0 Plumber 70,70 • layout – rozvrhnite si plochu a navrhnite zodpovedajúce triedy/objekty setLayout(new BorderLayout()); Panel pg = new Panel(); pg.setLayout(new GridLayout(Height+2,Width)); pg.setSize((Height+2)*70,Width*70); for(int j=0; j<Height; j++) for(int i=0; i<Width; i++) pg.add(new PlumberCanvas(this,i,j,playGround[i][j])); add("Center",pg); Panel lbPanel = new Panel(); lbSteps = new Label("Steps: "); lbTime = new Label("Time: "); lbPanel.add(lbSteps); lbPanel.add(lbTime); add("North",lbPanel); sizex = Width*70; sizey = (Height+2)*70; resize(sizex,(Height+2)*70); Pt = new PlumberThread(this); Pt.start(); Súbor:Plubmer.java
PlumberCanvas publicclass PlumberCanvas extends Canvas implements MouseListener { Plumber parent;// hlavný applet int sx, sy; // súradnice canvasu int state; // stav políčka public PlumberCanvas(Plumber p, int x, int y, int s) { … addMouseListener(this);// aby reagoval na myš } publicvoid paint(Graphics g) { // vykreslenie stavu if (stat>0) g.drawImage(parent.img[stat],0,0,Color.YELLOW,this); if (stat<0) g.drawImage(parent.img_blue[-stat],0,0,Color.YELLOW,this); } publicvoid mouseClicked( MouseEvent e ) {// zmena stavu } Súbor:PlubmerCanvas.java
PlumberThread publicclass PlumberThread extends Thread { Plumber parent; public PlumberThread(Plumber ap) { parent = ap; } publicvoid run() { while (true) try { sleep(1000);// naivná časomiera parent.time++; parent.lbTime.setText("Time: "+parent.time); parent.lbTime.repaint(); } catch (Exception E) {} } } Súbor:PlubmerThread.java
Škálovanie Naprogramujte mriežkuškálovatelnú od rozmeru okna (štvorcová mriežka sa rozťahuje podľa veľkosti okna, v ktorom sa nachádza, NIE KONŠTANTA V PROGRAME) private static int dist = 120; // počiatočné nastavenia private static int offset = dist; public void init() { setSize(offset+N*dist, offset+N*dist);// originálna veľkosť hracej pl. public void paint(Graphics g) { // nastavenia podľa aktuálnej //veľkosti okna offset = dist = (Math.min(getHeight(),getWidth()))/(N+1);
Vlákna a SWING • knižnica SWING nie je thread-safe, t.j. len jedno vlákno môže modifikovať SWING objekty v GUI (to sa volá Event Dispatch Thread - EDT), • ak ovládate SWING komponenty z viacerých vlákien, nikto vám nezaručuje ich korektnú funkcionalitu (interferencia vlákien), • EDT si pridáva do fronty všetky udalosti od listenerov (myš, klávesnica, okná, ...), postupne ich realizuje, • EDT sa vykonáva, keď sa volá akákoľvek listener-metóda SWING objektu, a jedine v ňom môžeme korektne modifikovať SWING objekt, • fronta obsahuje veľa malých úloh, najčastejšie generovaných od listenerov na spracovanie udalostí • dlhé výpočty v rámci EDT (napr. niektorého listenera) spôsobia zasekávanie, resp. vytuhnutie aplikácie, kde a ako ich teda robiť ?
Malý pokus publicvoid init() { setLayout(new FlowLayout()); add(lb); // JLabel lb = new JLabel("label"); add(jb);// JButton jb = new JButton("Klik"); jb.addActionListener(new ActionListener() { publicvoid actionPerformed(ActionEvent e) { System.out.println("Klik"); double a; for(int i=0; i<100000000; i++) a = Math.cos(Math.PI/45); System.out.println("Klak"); } }); public long cas; public void run() { while (true) { cas++; ap.lb.setText("cas:"+cas); ap.repaint(); } Súbor: JThreads, JTimer.java
invokeAndWait vs.invokeLater • veľké veci robia extra vlákna (a nie kódy obsluhujúce eventy), • problém nastáva, ak tieto zároveň chcú ovládať GUI (to nesmú – nie sú v EDT) Dve plánovacie rutiny do fronty EDT zaradia malý runnable task: • SwingUtilities.invokeLater(runnable), • SwingUtilities.invokeAndWait(runnable), tento runnable task: • môže modifikovať SWING komponenty, • vykoná sa po tom, čo sú vykonané všetky už naplánované akcie v EDT, • invokeAndWait(runnable) je synchrónne – metóda skončí až po tom, čo runnable task sa vykoná • invokeLater(runnable) je asynchrónne – metóda skončí hneď po tom, ako sa zavolá, teda, vlákno, čo zavolá invokeLater(runnable), nečaká, kým sa kód runnable vykoná. Na zložitejšie veci treba naštudovať triedu SwingWorker http://docs.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html
invokeLater public class JTimer extends Thread { JThreads ap; public long cas; public JTimer(JThreads ap) { this.ap = ap; } public void run() { while (true) { … výpočet ... SwingUtilities.invokeLater( new Runnable() { public void run() { System.out.println("runnable start"); ap.lb.setText("cas:"+cas); ap.repaint(); } }); System.out.println("after invoke"); } Súbor: JThread,JTimer.java
Swing Timer • javax.swing.Timernie jejava.util.Timer • všetky úlohy všetkých swing.Timerov sa vykonajú v jednom vlákne, EDT • preto timertask nesmie vykonávať zložitý výpočet ActionListenertaskPerformer = newActionListener() { publicvoidactionPerformed(ActionEventevt) { cas++; ap.lb.setText("cas:"+cas); ap.repaint(); }; Timer timer = new Timer( 100 , taskPerformer); timer.setRepeats(false); timer.start(); • setDelay(milis) – čas medziodpáleniamitasku • setInitialDelay(milis) - čas predprvým odpálením tasku • setRepeats – opakujesa, default je true ! • start(), • stop() • restart(), • isRunning() http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html
Pakovanie appletu do JARu • výsledný applet/projekt často obsahuje množstvo .class súborov, ktoré treba zakaždým natiahnúť do browsera. Na komprimáciu viacerých .class súborov používame formát .jar (java archive), a nástroj na komprimáciu .class súborov do .jar je súčasťou distribúcie jdk. jar cf MiniEditor2.jar MiniEditor2*.class • doplníme archive do applet tagu v MiniEditor2.html <head> <title> MiniEditor Example Applet </title> </head> <body> <applet code=“MiniEditor2.class" archive= "MiniEditor2.jar" width=200 height=150> </applet> </body>
Generovanie certifikátu/kľúča • WritingApplet bol príklad appletu, ktorý chcel zapisovať u klienta, • MiniEditor chcel čítať a písať do filesystému, • pri pokuse spustiť takýto applet v browseri (appletvieweri) dostaneme security exception. ako na to: keytool -list - zoznam vygenerovaných kľúčov keytool -genkey -alias mykey-keystore <url>- vytvorí certifikát v .keystore Enter keystore password: manager{java.home}/lib/security/ What is your first and last name?c:\Document Settings\user\ [Unknown]: Peter Borovansky What is the name of your organizational unit? [Unknown]: FMFI What is the name of your organization? [Unknown]: UK BA What is the name of your City or Locality? [Unknown]: Bratislava What is the name of your State or Province? [Unknown]: Slovakia What is the two-letter country code for this unit? [Unknown]: SK Is CN=Peter Borovansky, OU=FMFI, O=UK BA, L=Bratislava, ST=Slovakia, C=SK correct? [no]: yes Enter key password for <mykey> (RETURN if same as keystore password): manager keytool -list Enter keystore password: manager Keystore type: jks Keystore provider: SUN Your keystore contains 1 entry mykey, 12.12.2011, keyEntry, Certificate fingerprint (MD5): B8:45:65:A1:DA:D8:F0:AF:46:AB:81:B5:46:83:CB:EA
Podpisovanie appletu • keď máme (vygenerovaný) kľúč, popíšeme ním applet (jarsigner v jdk): jarsigner MiniEditor2.jar mykey Enter Passphrase for keystore: manager Warning: The signer certificate will expire within six months. • nakoniec pustíme HTMLConverter, skonvertuje MiniEditor2.html na príslušnú platformu a browser http://dai.fmph.uniba.sk/courses/JAVA/sources/12/MiniEditor2.html
Alternatíva pre aplikácie • runnable jar file • po odladení projektu si vytvorte run configuration • export/Runnable JAR file vytvoríte súbor, ktorý sa dá samostatne spustiť.
IPSC pozvánka http://ipsc.ksp.sk/ Prémiové body (umiestnenie v open division): (počet tímov-vaše umiestnenie)/20 pre každého člena tímu (max.traja v tíme) • IPSC 2014 will take place from 15 June 2014, 11:00 UTC to 15 June 2014, 16:00. • The practice session runs from 14 June 2014, 8:00 UTC to 15 June 2014, 8:00. • Google Code Jam • http://code.google.com/codejam • ACM Programming Contest • http://en.wikipedia.org/wiki/ACM_International_Collegiate_Programming_Contest • Topcoder • http://www.topcoder.com/
Ako ďalej(ako nás stretnúť/nestretnúť) JAVA2 (PavelPetrovič)alias Java EE • http://dai.fmph.uniba.sk/courses/java2/ (Login: java/vaja) • Sieťovéaplikácie client/server • Distribuovanévýpočty • Využitietechnológií XML v Jave • Práca s databázami z Javy • Servlety, JSP • Java reflection model VMAalias Vývoj mobilných aplikácií • Android Peter Borovanský, Windows Roman Fulop, iPhone sa hľadá... • http://dai.fmph.uniba.sk/courses/VMA/ Programovacie paradigmy • http://dai.fmph.uniba.sk/courses/PARA/