package elte.java2_utikalauz5.swing;
/**
Alap Swing tesztprogram.
- Lehetővé teszi a program alkalmazásként, vagy akár appletként való indítását is.
- Alkalmazás esetén gondoskodik a felület keretéről, ennek becsukásakor pedig a programból való kilépésről.
- Biztosítja a grafikus felület megadott elemei megjelenítésének nyomkövetési lehetőségét.
A megjelenítés nyomkövetése az aktuális grafikus művelet eredményének villogtatásával történik, a villogtatás idejét a paraméter értékeként meg lehet adni századmásodpercben.
- Megjelenítési stílusváltó műveleteket biztosít.
A program indításakor aktuális megjelenítési stílus, valamint a stílusváltás elvégzése naplózásra kerül.
- Lehetővé teszi szöveg naplózását.
A naplózás egy többsoros szövegmezőbe történik automatikus soremeléssel, mindig a legutoljára naplózott sorok látszanak.
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:
- x = " +
me.getX()+"
- y = "+me.getY()+"
";
}
/**
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;
}
}
}