package elte.java2_utikalauz5.swing; /** Alap Swing tesztprogram.

Grafikus felhasználói felületén felül látni a naplózás eredményét, középen a segédszövegek időzítési paramétereit szabályozó görgetősávok találhatóak, alulra pedig a stílusváltást végrehajtó gombok kerülnek. Adott görgetősáv segédszövege a szabályozott paraméter értékén kívül az egérkurzor sávon belüli aktuális pozícióját is kijelzi, megjelenítésének pozíciója pedig csakis a görgetősáv aktuális értékének pozíciójától függ. A görgetősávok alatt található kiválasztható gombbal a segédszövegek megjelenítését engedélyezhetjük, illetve tilthatjuk. A felület felépítésének minden főbb lépését naplózzuk. A megjelenítés nyomkövetésekor a stílusváltó gombok megrajzolására érvényes a nyomkövetés. @link.forrásfájl {@docRoot}/../data/swing/src SwingTeszt.java @link.letöltés {@docRoot}/../data/swing SwingTeszt.jar @see javax.swing.Action @see javax.swing.LookAndFeel @see javax.swing.DebugGraphics @see javax.swing.ToolTipManager @since Java 2 Útikalauz programozóknak */ public class SwingTeszt extends javax.swing.JApplet implements Runnable, java.awt.event.ActionListener, java.awt.event.AdjustmentListener { /** Verziószám */ private final static long serialVersionUID = 15L; /** Indítási mód */ protected boolean applet_e; /** Inicializálás alkalmazásként. @param argumentumok indítási paraméterek */ protected final void init(String[] argumentumok) { applet_e = false; //indítási mód alkalmazásként for (String paraméter : argumentumok) { //paraméterek feldolgozása int index = paraméter.indexOf('='); //értékadások keresése if (index>0) getRootPane().putClientProperty( //komponenstulajdonság paraméter.substring(0, index), paraméter.substring(index+1) ); else getRootPane().putClientProperty( paraméter, paraméter ); }; javax.swing.SwingUtilities.invokeLater( this ); //szinkronizálás } /** Megjelenítés nyomkövetését kérő paraméternév */ public static final String DEBUGPARAM = "debug"; /** Indítás appletként */ @Override public final void init() { applet_e = true; //indítási mód appletként String érték = getParameter(DEBUGPARAM); //paraméterek feldolgozása if (érték!=null) getRootPane().putClientProperty(DEBUGPARAM, érték); String [][] argumentumok = getParameterInfo(); if (argumentumok!=null) for (String[] paraméter : argumentumok) { érték = getParameter(paraméter[0]); if (érték!=null) getRootPane().putClientProperty(paraméter[0], érték); } //szinkronizálás if (javax.swing.SwingUtilities.isEventDispatchThread()) run(); else try { javax.swing.SwingUtilities.invokeAndWait( this ); } catch (Exception e) { e.printStackTrace(); } } /** Üzeneteket megjelenítő szövegmező */ protected javax.swing.JTextArea napló; /** Üzenet naplózása. @param szöveg A naplózandó szöveg */ protected void naplóz( String szöveg ) { if (napló==null) System.out.println(szöveg); else { napló.append( szöveg ); napló.append("\n"); //legújabb üzenet láthatóvá tétele napló.setCaretPosition( napló.getDocument().getLength() ); } } /** Ikon betöltése. @param kép Az ikonfájl neve @return A betöltött ikon, vagy {@code null} */ public javax.swing.ImageIcon ikonbetöltés( String kép ) { java.net.URL cím = getClass().getResource( kép ); if (cím==null) { naplóz("Ikon nem található: "+kép); return null; //nincs meg } naplóz("Ikonbetöltés: "+cím); return new javax.swing.ImageIcon( cím ); } /** Stílusváltási műveletek */ protected java.util.Vector stílusváltások = new java.util.Vector(); /** Stílusmegvalósítás osztálynevének kulcsa */ private static final String OSZTÁLY = "classname"; /** Stílustéma kulcsa */ private static final String THEME = "téma"; /** Programinicializálás az AWT végrehajtó programszáljában */ public final void run() { napló = new javax.swing.JTextArea(5, 10); javax.swing.Icon ikon = ikonbetöltés("img/wood.jpg"); //stílusváltó ikon boolean témás = false; //megjelenítési stílus témáit is feldolgozzuk for (javax.swing.UIManager.LookAndFeelInfo stílus : javax.swing.UIManager.getInstalledLookAndFeels()) { do { //témák iterációja javax.swing.AbstractAction váltás = new javax.swing.AbstractAction(stílus.getName(), ikon) { /** Verziószám. */ private final static long serialVersionUID = 15L; /** Stílusnév visszaadása. @return Stílusnév. */ public String toString() { return (String)getValue(NAME); } /** Stílusváltó művelet végrehajtása. @param ae A művelet végrehajtását kiváltó esemény */ public void actionPerformed(java.awt.event.ActionEvent ae) { stílusváltás(this); } }; stílusváltások.add( váltás ); váltás.setEnabled( !stílus.getClassName().equals( javax.swing.UIManager.getLookAndFeel().getClass().getName())); váltás.putValue( OSZTÁLY, stílus.getClassName() ); if (stílus.getClassName().equals( //JPLF esetén témák felvétele javax.swing.UIManager.getCrossPlatformLookAndFeelClassName())){ javax.swing.plaf.metal.MetalTheme téma = témás ? new javax.swing.plaf.metal.OceanTheme() : new javax.swing.plaf.metal.DefaultMetalTheme(); váltás.putValue(THEME, téma); //téma tárolása váltás.putValue( javax.swing.Action.NAME, stílus.getName() + " ("+téma.getName()+")" ); váltás.setEnabled( !téma.getClass().equals( javax.swing.plaf.metal.MetalLookAndFeel.getCurrentTheme(). getClass())); témás = !témás; } if ( !váltás.isEnabled() ) naplóz( "Indítási stílus: "+váltás.getValue(javax.swing.Action.NAME)); } while (témás); } napló.setEditable(false); //naplózó komponens nem szerkeszthető napló.registerKeyboardAction( new java.awt.event.ActionListener() { /** Naplótörlés billentyűlenyomáskor. @param ae Billentyűlenyomáskor kiváltott esemény */ public void actionPerformed( java.awt.event.ActionEvent ae ) { napló.setText(""); //napló törlése } }, javax.swing.KeyStroke.getKeyStroke("DELETE"), javax.swing.JComponent.WHEN_FOCUSED); felépít(); //felhasználói felület felépítése if ( !applet_e ) { //alkalmazáshoz keret megjelenítése final javax.swing.JFrame keret = new javax.swing.JFrame( getClass().getSimpleName()+" alkalmazás" ); keret.setContentPane(this); //a keretben csak mi látszunk keret.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE); keret.pack(); keret.setVisible(true); //ablak megjelenítése } } /** Megjelenítési stílusváltást jelző név */ public static final String LAF = "stílus"; /** Megjelenítési stílus váltása. @param stílus A stílusváltást kiváltó esemény */ public void stílusváltás(final javax.swing.Action stílus) { if (!stílus.isEnabled()) return; //csak ha még nem aktuális javax.swing.SwingUtilities.invokeLater( new Runnable() { public void run() { for (javax.swing.Action váltás:stílusváltások) //műveletek váltás.setEnabled( váltás!=stílus ); //engedélyezése javax.swing.plaf.metal.MetalTheme téma = (javax.swing.plaf.metal.MetalTheme)stílus.getValue(THEME); if (téma!=null) //JPLF esetén téma beállítása javax.swing.plaf.metal.MetalLookAndFeel.setCurrentTheme(téma); try { javax.swing.UIManager.setLookAndFeel( (String)stílus.getValue(OSZTÁLY)); javax.swing.SwingUtilities.updateComponentTreeUI( getRootPane()); //új stílus alkalmazása naplóz("Stílusváltás: "+ //és a váltás naplózása stílus.getValue(javax.swing.Action.NAME)); firePropertyChange(LAF, null, stílus); } catch (Exception e) { e.printStackTrace(); } } }); } /** Adott komponens megjelenítésének nyomkövetése. @param komponens A nyomkövetendő komponens */ protected void nyomkövetés(javax.swing.JComponent komponens) { String debug = (String)getRootPane().getClientProperty(DEBUGPARAM); if (debug != null) { //nyomkövetés bekapcsolva? int idő = 20; //nyomkövetési idő-paraméter kiértékelése try { idő = Integer.parseInt(debug); } catch (Exception e) {} javax.swing.DebugGraphics.setFlashTime(idő); //nyomkövetés javax.swing.DebugGraphics.setFlashCount(idő/10); //konfigurálása komponens.setDebugGraphicsOptions( javax.swing.DebugGraphics.FLASH_OPTION); komponens.setDoubleBuffered(false); //offscreen kikapcsolása javax.swing.RepaintManager.currentManager( komponens).setDoubleBufferingEnabled(false); } } /** Indítás alkalmazásként. @param argumentumok Az indításkor megadott paraméterek. */ public static void main(String argumentumok[]) { new SwingTeszt().init(argumentumok); } /** Applet leírása. @return A példaprogram leírása */ @Override public String getAppletInfo() { return "Alap Swing tesztprogram"; } /** Applet indítási paramétereinek leírása. @return Az appletparaméterek leírása */ @Override public String[][] getParameterInfo() { return new String[][] {{DEBUGPARAM, "késleltetés (ms)", "megjelenítés nyomkövetésének kérése"}}; } /** GUI felépítése */ protected void felépít() { naplóz("Felhasználói felület felépítése..."); add(new javax.swing.JScrollPane(napló), java.awt.BorderLayout.NORTH); naplóz("napló felvéve"); javax.swing.JPanel panel = new javax.swing.JPanel(); //gombok panelje add(panel, java.awt.BorderLayout.SOUTH); napló.append("gombok felvétele: "); javax.swing.AbstractButton gomb; //stílusváltó gombok felvétele for (javax.swing.Action váltás : stílusváltások) { gomb = new javax.swing.JButton(váltás); panel.add(gomb); napló.append(gomb.getText()+", "); } naplóz("\nToolTipTeszt felépítése"); panel = new javax.swing.JPanel(new java.awt.GridLayout(7, 1)); add( panel ); javax.swing.JLabel címke = new javax.swing.JLabel( "Megjelenítésig szükséges várakozási idő (msec)"); panel.add( címke ); címke.setToolTipText("initialDelay"); tooltipmanager = javax.swing.ToolTipManager.sharedInstance(); ScrollBar sáv = new ScrollBar(1); panel.add(sáv); //kezdőérték beállítása sáv.setValue(tooltipmanager.getInitialDelay()); sáv.addAdjustmentListener(this); //görgetősáv figyelése címke = new javax.swing.JLabel( "Megjelenítés eltüntetéséhez szükséges várakozási idő (msec)"); panel.add( címke ); címke.setToolTipText("dismissDelay"); sáv = new ScrollBar(2); panel.add(sáv); //kezdőérték beállítása sáv.setValue(tooltipmanager.getDismissDelay()); sáv.addAdjustmentListener(this); //görgetősáv figyelése címke = new javax.swing.JLabel( "Megjelenítés újraidőzítéséhez szükséges várakozási idő (msec)"); panel.add( címke ); címke.setToolTipText("reshowDelay"); sáv = new ScrollBar(3); panel.add(sáv); //kezdőérték beállítása sáv.setValue(tooltipmanager.getReshowDelay()); sáv.addAdjustmentListener(this); //görgetősáv figyelése gomb = new javax.swing.JCheckBox( "segédszöveg?", tooltipmanager.isEnabled()); panel.add(gomb); //segédszövegek engedélyezése/tiltása gomb.setToolTipText("enabled"); gomb.addActionListener(this); //gomb figyelése naplóz("kész!"); nyomkövetés( panel ); //gombpanel nyomkövetésének engedélyezése } /** Görgetősáv események feldolgozása. @param ae görgetősáv esemény */ public void adjustmentValueChanged(java.awt.event.AdjustmentEvent ae) { switch (ae.getAdjustable().getMinimum()) { //paraméterek beállítása case 1: tooltipmanager.setInitialDelay(ae.getValue()); break; case 2: tooltipmanager.setDismissDelay(ae.getValue()); break; case 3: tooltipmanager.setReshowDelay(ae.getValue()); } } /** Segédszöveg engedélyezés váltása. @param ae Váltás eseménye */ public void actionPerformed(java.awt.event.ActionEvent ae) { tooltipmanager.setEnabled( //engedélyezés/tiltás ((javax.swing.JCheckBox)ae.getSource()).isSelected() ); } /** Aktuális segédszövegmegjelenítést vezérlő objektum */ private javax.swing.ToolTipManager tooltipmanager; /**Dinamikusan változó HTML segédszöveggel rendelkező görgetősáv komponens*/ class ScrollBar extends javax.swing.JScrollBar { /** Verziószám */ private final static long serialVersionUID = 15L; /** Alapérelmezett konstruktor. @param min minimális érték */ ScrollBar(int min) { super(HORIZONTAL, min, 1, min, 10000); //rendelkezik tooltipmanager.registerComponent(this); //segédszöveggel } /** Alapértelmezett segédszöveg visszaadása. @return HTML formájú segédszöveg az aktuális érték kijelzésével */ public String getToolTipText(){ return "
HTML segédszöveg!

"+ "aktuális érték = "+getValue()+""; } /** Egérkurzor pozíciójától függő segédszöveg visszaadása. @param me aktuális egéresemény @return HTML formájú segédszöveg az aktuális értékkel és egérpozícióval */ public String getToolTipText(java.awt.event.MouseEvent me) { return getToolTipText()+"

Egéresemény koordinátái:

"; } /** Segédszöveg megjelenítési pozíciójának visszaadása. @param me aktuális egéresemény @return Igazítási koordináták az aktuális érték alapján */ public java.awt.Point getToolTipLocation(java.awt.event.MouseEvent me) { java.awt.Point pont = me.getPoint(); pont.y = 0; //pozíció igazítása a görgetősáv aktuális értékének pont.x = (int)((float)getWidth()* // megfelelően (float)getValue()/(float)getMaximum()); return pont; } } }