package elte.java2_utikalauz5.swing; /** Belső ablakok használata Swingben.
A felhasználói felület felső része tartalmazza a belső ablakokat, alul pedig az új ablakot létrehozó gomb melletti nyomógombokkal a megjelenítés stílusát lehet megváltoztatni. A belső ablakokat sorszámmal jelölünk meg. Konstruktorának paramétere jelzi, hogy melyik rétegben fog elhelyezkedni az ablak, ezt a bal alsó sarokban található szövegmezőben lehet megadni az ablak létrehozásakor. Egy belső ablak tetején az ablakkal végzett műveletek naplója látható, alatta pedig az ablak tulajdonságait és műveleteit jelölő kiválasztható gombokon kívül még két gomb található, melyekkel az ablakot annak rétegén belül előtérbe, illetve háttérbe lehet mozgatni. A belső ablakok közül legalább egy mindig látható, azaz nem lehet mind egyszerre ikonizált állapotban. Az utolsó ablakot csak alkalmazás esetén lehet bezárni, ekkor a program futása is véget ér. A belső ablakok megjelenítése nyomkövethető. @link.forrásfájl {@docRoot}/../data/swing/src JInternalFrameTeszt.java @link.letöltés {@docRoot}/../data/swing JInternalFrameTeszt.jar @since Java 2 Útikalauz programozóknak */ public class JInternalFrameTeszt extends SwingTeszt { /** 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 JInternalFrameTeszt().init(argumentumok); } /** Applet leírása. @return A példaprogram leírása */ @Override public String getAppletInfo() { return "Belső ablakok használatát bemutató tesztprogram"; } /** Belső ablakok konténere */ private javax.swing.JDesktopPane munkaasztal; /** Réteget megadó számmező */ private javax.swing.JTextField réteg; /** GUI felépítése */ @Override protected void felépít() { munkaasztal = new javax.swing.JDesktopPane(); réteg = new javax.swing.JTextField(5); add(munkaasztal); //belső ablakok kezelője setPreferredSize(new java.awt.Dimension(600, 400)); javax.swing.JPanel panel = new javax.swing.JPanel(); //vezérlő panel add(panel, java.awt.BorderLayout.SOUTH); panel.setPreferredSize(new java.awt.Dimension(600, 100)); panel.add(new javax.swing.JLabel("Réteg:")); panel.add(réteg); //új ablakot létrehozó gomb javax.swing.JButton gomb = new javax.swing.JButton("új ablak"); panel.add(gomb); gomb.addActionListener(this); //nyomógomb figyelése for (javax.swing.Action váltás : stílusváltások) panel.add(new javax.swing.JButton(váltás)); actionPerformed(null); //kezdeti ablak létrehozása nyomkövetés(munkaasztal); //nyomkövethető a megjelenítése } /** Új ablak felvétele adott rétegbe. @param ae Gomblenyomási esemény */ public void actionPerformed(java.awt.event.ActionEvent ae) { int réteg = 0; try { réteg = Integer.parseInt(this.réteg.getText()); //a megadott rétegbe } catch (Exception e) { this.réteg.setText(Integer.toString(réteg)); } new Ablak(réteg); //ablak létrehozása } /** Ablakszámláló */ private int ablakszámláló; /** Belső ablak */ class Ablak extends javax.swing.JInternalFrame implements java.awt.event.ActionListener, javax.swing.event.InternalFrameListener { /** Verziószám. */ private final static long serialVersionUID = 15L; /** Ablak sorszáma */ int sorszám = ++ablakszámláló; /** Naplózó komponens */ private javax.swing.JTextArea napló = new javax.swing.JTextArea(3, 10); /** Ikonizált állapotjelző */ private javax.swing.JCheckBox ikon_e = new javax.swing.JCheckBox("ikonizált?", isIcon()); /** Maximalizált állapotjelző */ private javax.swing.JCheckBox maximum_e = new javax.swing.JCheckBox("maximalizált?", isMaximum()); /** Konstruktor. Az új belső ablakot egyből meg is jeleníti. @param réteg Az új belső ablak elhelyezési rétege. */ Ablak(int réteg) { setTitle(sorszám+". ablak"); setVisible( true ); munkaasztal.add(this, new Integer(réteg)); napló.setEditable(false); //ablak felületének felépítése ((javax.swing.JPanel)getContentPane()).setBorder( javax.swing.BorderFactory.createTitledBorder(getTitle()+ " (réteg="+getLayer()+")")); //szöveges keret add(new javax.swing.JScrollPane(napló)); javax.swing.JPanel panel = new javax.swing.JPanel(); //vezérlőpanel add(panel, java.awt.BorderLayout.SOUTH); panel.setPreferredSize(new java.awt.Dimension(250, 138)); javax.swing.AbstractButton gomb = new javax.swing.JCheckBox("bezárható?", isClosable()); panel.add(gomb); //vezérlőgombok létrehozása és figyelése gomb.setToolTipText("closable"); gomb.setActionCommand("closable"); gomb.addActionListener(this); gomb = new javax.swing.JCheckBox("bezárva?", isClosed()); panel.add(gomb); gomb.setToolTipText("closed"); gomb.setActionCommand("closed"); gomb.addActionListener(this); gomb = new javax.swing.JCheckBox("ikonizálható?", isIconifiable()); panel.add(gomb); gomb.setToolTipText("iconifiable"); gomb.setActionCommand("iconifiable"); gomb.addActionListener(this); panel.add(ikon_e); ikon_e.setToolTipText("icon"); ikon_e.setActionCommand("icon"); ikon_e.addActionListener(this); gomb=new javax.swing.JCheckBox("maximalizálható?", isMaximizable()); panel.add(gomb); gomb.setToolTipText("maximizable"); gomb.setActionCommand("maximizable"); gomb.addActionListener(this); panel.add(maximum_e); maximum_e.setToolTipText("maximum"); maximum_e.setActionCommand("maximum"); maximum_e.addActionListener(this); gomb = new javax.swing.JCheckBox("méretezhető?", isResizable()); panel.add(gomb); gomb.setToolTipText("resizable"); gomb.setActionCommand("resizable"); gomb.addActionListener(this); gomb = new javax.swing.JButton("előre"); panel.add(gomb); gomb.setActionCommand("front"); gomb.setToolTipText("moveToFront"); gomb.addActionListener(this); gomb = new javax.swing.JButton("hátra"); panel.add(gomb); gomb.setActionCommand("back"); gomb.setToolTipText("moveToBack"); gomb.addActionListener(this); addInternalFrameListener(this); //belsőablak események figyelése setSize(getPreferredSize()); //kezdőméret beállítása moveToFront(); //előtérbe helyezés } /** Üzenet naplózása és állapotkijelzés a belső ablakban. @param szöveg A naplózandó szöveg */ private void naplóz( String szöveg ) { //üzenet megjelenítése napló.append( szöveg ); napló.append("\n"); //legújabb üzenet láthatóvá tétele napló.setCaretPosition( napló.getDocument().getLength() ); ikon_e.setSelected(isIcon()); maximum_e.setSelected(isMaximum()); } /** Vezérlőgombok kezelése. @param ae Gomblenyomási esemény */ public void actionPerformed(java.awt.event.ActionEvent ae) { try { javax.swing.AbstractButton gomb = (javax.swing.AbstractButton)ae.getSource(); if (ae.getActionCommand().equals("maximizable")) { setMaximizable(gomb.isSelected()); //maximalizálás } else if (ae.getActionCommand().equals("maximum")) { setMaximum(gomb.isSelected()); } else if (ae.getActionCommand().equals("closable")) { setClosable(gomb.isSelected()); //bezárás } else if (ae.getActionCommand().equals("closed")) { setClosed(gomb.isSelected()); } else if (ae.getActionCommand().equals("iconifiable")) { setIconifiable(gomb.isSelected()); //ikonizálás } else if (ae.getActionCommand().equals("icon")) { setIcon(gomb.isSelected()); } else if (ae.getActionCommand().equals("resizable")) { setResizable(gomb.isSelected()); //méretezhető } else if (ae.getActionCommand().equals("front")) { moveToFront(); //előtérbe helyezés } else if (ae.getActionCommand().equals("back")) { moveToBack(); //háttérbe helyezés } } catch (Exception e) { //művelet elvégzése meg lett akadályozva naplóz("set"+ae.getActionCommand()+": "+e); } } /** Belső ablak bezárása. Utolsó ablak bezárásakor kilépés. @param b Bezárás jelzője. @throws java.beans.PropertyVetoException A változást megtiltó kivétel. */ @Override public void setClosed(boolean b) throws java.beans.PropertyVetoException{ if (b) doDefaultCloseAction(); else super.setClosed( b ); } /** Belső ablak bezárása. Utolsó ablak bezárásakor kilépés. */ @Override public void doDefaultCloseAction() { javax.swing.JInternalFrame[] ablakok = munkaasztal.getAllFrames(); if (ablakok.length == 1) { //ha ez volt az utolsó if (applet_e) { naplóz("Utolsó ablak nem zárható be!"); return; //applet esetén nem zárható } System.exit(0); //alkalmazás esetén kilépés } //látható ablak keresése super.doDefaultCloseAction(); //ablak bezárása for (javax.swing.JInternalFrame a : ablakok) if (((Ablak)a).sorszám!=sorszám && !a.isIcon()) return; try { //ha mind ikonizált, az első láthatóvá tétele ablakok[((Ablak)ablakok[0]).sorszám==sorszám ? 1 : 0]. setIcon(false); } catch (Exception e) {} } /** Belső ablak ikonizálása. Csak akkor mehet, ha van másik látható belső ablak is. @param b Ikonizálás jelző. @throws java.beans.PropertyVetoException A változást megtiltó kivétel. */ @Override public void setIcon(boolean b) throws java.beans.PropertyVetoException { if (!b) { super.setIcon( b ); return; } javax.swing.JInternalFrame[] ablakok = munkaasztal.getAllFrames(); int i = ablakok.length; for (;--i>=0;) if (sorszám!=((Ablak)ablakok[i]).sorszám && !ablakok[i].isIcon()) break; //másik látható ablak keresése if (i<0) naplóz("Utolsó ablak nem ikonizálható!"); else super.setIcon(b); } /** Belsőablak nyitásának naplózása. @param ie Belső ablak esemény. */ public void internalFrameOpened(javax.swing.event.InternalFrameEvent ie) { naplóz("InternalFrameEvent: internalFrameOpened"); } /** Belsőablak záródásának naplózása. @param ie Belső ablak esemény. */ public void internalFrameClosing(javax.swing.event.InternalFrameEvent ie) { naplóz("InternalFrameEvent: internalFrameClosing"); } /** Belsőablak zárásának naplózása. @param ie Belső ablak esemény. */ public void internalFrameClosed(javax.swing.event.InternalFrameEvent ie) { naplóz("InternalFrameEvent: internalFrameClosed"); } /** Belsőablak ikonizálásáank naplózása. @param ie Belső ablak esemény. */ public void internalFrameIconified(javax.swing.event.InternalFrameEvent ie) { naplóz("InternalFrameEvent: internalFrameIconified"); } /** Belsőablak visszaállításának naplózása. @param ie Belső ablak esemény. */ public void internalFrameDeiconified(javax.swing.event.InternalFrameEvent ie) { naplóz("InternalFrameEvent: internalFrameDeiconified"); } /** Belsőablak aktiválásáank naplózása. @param ie Belső ablak esemény. */ public void internalFrameActivated(javax.swing.event.InternalFrameEvent ie) { naplóz("InternalFrameEvent: internalFrameActivated"); } /** Belsőablak deaktiválásának naplózása. @param ie Belső ablak esemény. */ public void internalFrameDeactivated(javax.swing.event.InternalFrameEvent ie) { naplóz("InternalFrameEvent: internalFrameDeactivated"); } } }