package elte.java2_utikalauz5.gui;
/**
Többsoros címke saját példaprogrammal.

@link.forrásfájl {@docRoot}/../data/gui/src TobbSorosCimke.java
@link.letöltés {@docRoot}/../data/gui TobbSorosCimke.jar
@since Java 2 Útikalauz programozóknak 5.0
*/
public class TobbSorosCimke extends java.awt.Component {
/** Verziószám. */
private static final long serialVersionUID = 15L;
/**
Konstruktor a címke feliratával. Az igazítás ekkor balra történik.
@param felirat A címke felirata.
*/
public TobbSorosCimke( String felirat ) {
this( felirat, java.awt.Label.LEFT );
}
/**
Konstruktor a címke feliratával és igazításával.
@param felirat A címke felirata.
@param igazítás A címke szövegének vízszintes igazítása.
*/
public TobbSorosCimke( String felirat, int igazítás ) {
setFelirat( felirat );
setIgazítás( igazítás );
setInsets( null ); //alapértelmezett keret beállítása
}
/** A címke felirata sorokra bontva. */
private transient String sorok[];
/**
Címke feliratának beállítása. Több sort \n jelekkel lehet elválasztani.
@param felirat A címke felirata.
*/
public void setFelirat( String felirat ) {
if (felirat==null) felirat = "";
this.felirat = felirat;
sorok = felirat.split("\\n");
betűméret = null;
invalidate(); //újrarajzoltatás
}
/** A címke felirata. */
private transient String felirat;
/**
Címke feliratának lekérdezése.
@return A címke felirata.
*/
public String getFelirat() {
return felirat;
}
/**
Címke felirat vízszintes igazításának beállítása. A balra, középre és jobbra
igazítást előíró konstansokat a {@code Label} osztály definiálja.
@param igazítás A címke feliratának vízszintes igazítása.
@throws IllegalArgumentException ismeretlen igazítás esetén.
*/
public void setIgazítás( int igazítás ) {
if (igazítás!=java.awt.Label.LEFT && igazítás!=java.awt.Label.CENTER &&
igazítás!=java.awt.Label.RIGHT) throw new IllegalArgumentException(
"Hibás igazítási paraméter: "+igazítás);
this.igazítás = igazítás;
invalidate(); //újrarajzoltatás
}
/** A címke feliratának vízszintes igazítása. */
private transient int igazítás;
/**
Címke felirata vízszintes igazításának lekérdezése.
@return A címke feliratának vízszintes igazítása.
*/
public int getIgazítás() {
return igazítás;
}
/**
Címke keretvastagságának beállítása. {@code null} esetén az alapértelmezett
keretvastagság (5 pontnyi hely minden oldalon) kerül beállításra.
@param keret A címke keretvastagsága.
*/
public void setInsets( java.awt.Insets keret ) {
if (keret==null) keret=new java.awt.Insets(5, 5, 5, 5); //alapértelmezés
this.keret = keret;
invalidate(); //újrarajzoltatás
}
/** Címke keretvastagsága. */
private transient java.awt.Insets keret;
/**
Címke keretvastagságának lekérdezése.
@return A címke keretvastagsága.
*/
public java.awt.Insets getInsets() {
return keret;
}
/** A címke sorainak hossza */
private transient int sorhossz[];
/** A címke sorainak magassága */
private transient int sormagasság[];
/** Maximális sorhossz */
private transient int maxsorhossz;
/** Sormagasságok összege */
private transient int összsormagasság;
/** Legutóbb használt szövegméretek */
private transient java.awt.FontMetrics betűméret;
/** Címkefelirat szövegsorai által elfoglalt helyek kiszámítása */
private void méretez() {
if (betűméret!=null && betűméret.equals(getFontMetrics(getFont())))
return; //nem kell újra számolni
betűméret = getFontMetrics(getFont());
sorhossz = new int[sorok.length];
sormagasság = new int[sorok.length];
összsormagasság = maxsorhossz = 0;
for (int i=sorok.length; --i>=0;) { //soronkénti számolás
sorhossz[i] = betűméret.stringWidth(sorok[i]);
sormagasság[i] = (int)betűméret.getLineMetrics(sorok[i],
getGraphics()).getHeight();
összsormagasság+=sormagasság[i];
maxsorhossz = Math.max( maxsorhossz, sorhossz[i] );
}
}
/**
Címke optimális mérete a feliratának szövegsorai alapján.
@return A címke optimális mérete
*/
@Override
public java.awt.Dimension getPreferredSize() {
méretez(); //méretszámolás
return new java.awt.Dimension(maxsorhossz+keret.left+keret.right,
összsormagasság+keret.top+keret.bottom); //keretvastagsággal együtt
}
/**
Címke megjelenítésének elvégzése.
@param g Az aktuális rajzolási környezet
*/
@Override
public void paint( java.awt.Graphics g ) {
méretez(); //méretszámolás
int y = (getHeight()-keret.top-keret.bottom-összsormagasság) / 2 +
keret.top+betűméret.getMaxAscent(); //függőlegesen középre igazítás
for (int i=0; i