package elte.java2_utikalauz5.swing; /** Keretek használata Swingben.
A felhasználói felület tetején egy nyomógomb látható, amelynek keretfelépítését tetszőlegesen módosíthatjuk. Alatta az aktuális keretek listája és mérete látható kilistázva. A felület alján található vezérlőgombokkal új keretet rakhatunk a gombra, törölhetjük a legkülső keretet, és megváltoztathatjuk az aktuális megjelenítési stílust. Stílusváltáskor csak akkor lesz a gomb kerete a kiválasztott stílusnak megfelelően beállítva, ha annak alapértelmezett keretén kívül nincs más keret a gombra rakva. Szöveges keretek használata esetén a keret szövege az alapkeret típusából, valamint a szöveg pozícióját és igazítását megadó számpárból tevődik össze. A keretes gomb megjelenítése nyomkövethető. @link.forrásfájl {@docRoot}/../data/swing/src BorderTeszt.java @link.letöltés {@docRoot}/../data/swing BorderTeszt.jar @since Java 2 Útikalauz programozóknak */ public class BorderTeszt extends SwingTeszt implements java.beans.PropertyChangeListener { /** Verziószám. */ private final static long serialVersionUID = 15L; /** Indítás alkalmazásként. @param argumentumok Az indításkor megadott paraméterek. */ public static void main(String argumentumok[]) { new BorderTeszt().init(argumentumok); } /** Applet leírása. @return A példaprogram leírása */ @Override public String getAppletInfo() { return "Keretek használatát bemutató tesztprogram"; } /** Vezérlő gomb */ private javax.swing.JButton gomb; /** Keretfeliratozás kapcsolója */ javax.swing.JCheckBox felirat; /** GUI felépítése */ @Override protected void felépít() { felirat = new javax.swing.JCheckBox("feliratos keretek?"); add( new javax.swing.JScrollPane(napló) ); //keretek listája javax.swing.JPanel panel = new javax.swing.JPanel(); //vezérlő panel add(panel, java.awt.BorderLayout.SOUTH); panel.setPreferredSize(new java.awt.Dimension(550, 100)); panel.add(felirat); gomb = new javax.swing.JButton(" + "); //keret hozzávétele panel.add(gomb); gomb.setActionCommand("+"); gomb.addActionListener(this); gomb = new javax.swing.JButton(" - "); //külső keret törlése panel.add(gomb); gomb.setActionCommand("-"); gomb.addActionListener(this); for (javax.swing.Action váltás : stílusváltások) panel.add(new javax.swing.JButton(váltás)); //stílusváltásgombok gomb = new javax.swing.JButton("keretes gomb"); add(gomb, java.awt.BorderLayout.NORTH); nyomkövetés(gomb); //lehet nyomkövetni a megjelenítését keretlista(); //kezdeti keretek kilistázása addPropertyChangeListener(LAF, this); //stílusváltás figyellése } /** Véletlenszámgenerátor */ private java.util.Random rnd = new java.util.Random(); /** Ikon a kerethez */ private javax.swing.Icon ikon = ikonbetöltés("img/wood.jpg"); /** Gombnyomás kezelése. @param ae gombnyomási esemény */ public void actionPerformed(java.awt.event.ActionEvent ae) { javax.swing.border.Border keret = gomb.getBorder(); if (ae.getActionCommand().equals("+")) { //új keret hozzáadása if (keret instanceof javax.swing.border.CompoundBorder) //összetett? keret = ((javax.swing.border.CompoundBorder)keret). getOutsideBorder(); String típus = null; //jelenlegi külső keret típusa if (keret instanceof javax.swing.border.TitledBorder) { típus = ((javax.swing.border.TitledBorder)keret).getTitle(); típus = típus.substring(0, típus.indexOf("@")); } else if (keret!=null) típus = keret.getClass().getSimpleName(); javax.swing.border.Border újkeret = null; String újtípus = null; do { //ne legyen egymáson azonos típusú keret switch (rnd.nextInt(10)) { case 0: case 1: újkeret=javax.swing.BorderFactory.createEmptyBorder( rnd.nextInt(10), rnd.nextInt(10), rnd.nextInt(10), rnd.nextInt(10)); break; case 2: case 3: újkeret = javax.swing.BorderFactory.createEtchedBorder(); break; case 4: case 5: újkeret=javax.swing.BorderFactory.createLineBorder ( gomb.getForeground(), rnd.nextInt(10)); break; case 6: újkeret = javax.swing.BorderFactory.createLoweredBevelBorder(); break; case 7: case 8: újkeret=javax.swing.BorderFactory.createMatteBorder( rnd.nextInt(10), rnd.nextInt(10), rnd.nextInt(10), rnd.nextInt(10), ikon); break; default: újkeret = javax.swing.BorderFactory.createRaisedBevelBorder(); } újtípus = újkeret.getClass().getSimpleName(); } while (újtípus.equals( típus )); if (felirat.isSelected()) { //plussz felirat a kereten int pozíció; //felirat pozícionálása switch (rnd.nextInt(6)) { case 0: pozíció = javax.swing.border.TitledBorder.ABOVE_TOP; break; case 1: pozíció = javax.swing.border.TitledBorder.TOP; break; case 2: pozíció = javax.swing.border.TitledBorder.BELOW_TOP; break; case 3:pozíció=javax.swing.border.TitledBorder.ABOVE_BOTTOM; break; case 4: pozíció = javax.swing.border.TitledBorder.BOTTOM; break; default:pozíció=javax.swing.border.TitledBorder.BELOW_BOTTOM; } int igazítás; //felirat igazítása switch (rnd.nextInt(3)) { case 0: igazítás = javax.swing.border.TitledBorder.LEFT; break; case 1: igazítás = javax.swing.border.TitledBorder.CENTER; break; default: igazítás = javax.swing.border.TitledBorder.RIGHT; } //szöveges keret létrehozása újkeret = javax.swing.BorderFactory.createTitledBorder( újkeret, újtípus+"@"+igazítás+", "+pozíció, igazítás, pozíció ); } gomb.setBorder( javax.swing.BorderFactory.createCompoundBorder( újkeret, gomb.getBorder()) ); } else if (ae.getActionCommand().equals("-")) { //külső keret törlése if (keret instanceof javax.swing.border.CompoundBorder) keret = ((javax.swing.border.CompoundBorder)keret).getInsideBorder(); else keret = null; gomb.setBorder( keret ); } keretlista(); //keretlista aktualizálása } /** Stílusváltás figyelése. @param pce Stílusváltást jelző esemény */ public void propertyChange(java.beans.PropertyChangeEvent pce) { keretlista(); //keretlistázás } /** Keretek kilistázása */ private void keretlista() { napló.setText("Keretlista kívülről befelé: "+ "[méretadatok: fent, balra, lent, jobbra]\n"); javax.swing.border.Border keret = gomb.getBorder(); javax.swing.border.Border külső; java.awt.Insets méret; while (keret != null) { //kerethierarchián végigmenni if (keret instanceof javax.swing.border.CompoundBorder) külső = ((javax.swing.border.CompoundBorder)keret).getOutsideBorder(); else külső = keret; napló.append(külső.getClass().getName()); //típus kiírása if (külső instanceof javax.swing.border.TitledBorder) napló.append( "("+((javax.swing.border.TitledBorder)külső).getTitle()+")"); méret = külső.getBorderInsets(gomb); //keret mérete napló.append(" ["+méret.top+", "+méret.left+", "+ méret.bottom+", "+méret.right+"]\n"); if (!(keret instanceof javax.swing.border.CompoundBorder)) break; keret=((javax.swing.border.CompoundBorder)keret).getInsideBorder(); } napló.setCaretPosition(0); //mindig elölről látszódjon a napló } }