package elte.java2_utikalauz5.swing; /** Üvegpanel használata Swingben.
A felhasználói felület legfontosabb eleme egy kiválasztható gomb, mellyel az üveglap láthatóságát vezérelhetjük. Ez a komponens akkor is megkapja az egéreseményeket, ha látszik az üveglap, és ezért az alapértelmezés szerint nem adná tovább az egéreseményeket az alatta lévő komponenseknek. Ha látszik az üveglap, akkor a legutolsó egérkattintási esemény helyén egy pötty fog megjelenni, ami azt is jól szemlélteti, hogy az üveglapot komponenshatárokat átlépő megjelenítésre is lehet használni. Így egyszerűen látható, hogy az egéreseményeket valóban elnyeli az üveglapkomponens, mivel ekkor a felhasználói felületelemek (kivéve a kapcs gombot) nem reagálnak az egérkattintásra. Az üveglap átlátszóságát az üveglap egyetlen kiválasztható gomb komponensével lehet szabályozni. Ezen gomb érdekessége, hogy megragadhatjuk az egérrel és interaktívan elmozdíthatjuk tetszőleges helyre. Az üveglap megjelenítése nyomkövethető. @link.forrásfájl {@docRoot}/../data/swing/src GlassPaneTeszt.java @link.letöltés {@docRoot}/../data/swing GlassPaneTeszt.jar @since Java 2 Útikalauz programozóknak */ public class GlassPaneTeszt 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 GlassPaneTeszt().init(argumentumok); } /** Applet leírása. @return A példaprogram leírása */ @Override public String getAppletInfo() { return "Üvegpanel használatát bemutató tesztprogram"; } /** Üveglap látható-e */ private javax.swing.JCheckBox kapcs; /** Legutolsó egérkattintás koordinátái */ private java.awt.Point pont; /** GUI felépítése */ @Override protected void felépít() { kapcs = new javax.swing.JCheckBox("üveglap látható?"); kapcs.addActionListener(this); //kapcsoló gomb figyelése setLayout(new java.awt.FlowLayout()); add(kapcs); //üveglap láthatóságát vezéri add(new javax.swing.JButton("JButton"));//felhasználói felület kitöltése add(new javax.swing.JRadioButton("JRadioButton")); add(new javax.swing.JLabel("JLabel")); javax.swing.JMenuBar menuBar = new javax.swing.JMenuBar(); //menü javax.swing.JMenu menu = new javax.swing.JMenu("JMenu"); menu.add(new javax.swing.JMenuItem("JMenuItem")); menuBar.add(menu); setJMenuBar(menuBar); setGlassPane(new GlassPane()); //üveglap komponens beállítása } /** Gombnyomás kezelése. @param ae gombnyomási esemény */ public void actionPerformed(java.awt.event.ActionEvent ae) { pont=null; //üveglap láthatóságának állítása getGlassPane().setVisible(kapcs.isSelected()); } /** Üveglap komponens */ private class GlassPane extends javax.swing.JPanel implements java.awt.event.ActionListener, java.awt.event.MouseListener, java.awt.event.MouseMotionListener { /** Verziószám. */ private final static long serialVersionUID = 15L; /** Átlátszóság kapcsolója */ private javax.swing.JCheckBox átlátszó = new javax.swing.JCheckBox("átlátszó?", true); /** Alapkonstruktor */ public GlassPane() { super(null); //abszolút pozícionálás setOpaque(false); //átlátszó átlátszó.setOpaque(false); add(átlátszó); //komponens felépítése átlátszó.setSize(átlátszó.getPreferredSize()); átlátszó.addActionListener(this); //kiválasztható gomb figyelése átlátszó.addMouseListener(this); //egérrel történő mozgatás átlátszó.addMouseMotionListener(this); //figyelése addMouseListener(this); //egérkattintás figyelése setVisible(true); nyomkövetés(this); } /** Megjelenítés elvégzése. @param g A megjelenítésre használt grafikus környezet */ public void paint(java.awt.Graphics g) { super.paint(g); //legutolsó egérkattintás helyére körlap rajzolása if (pont != null) g.fillOval(pont.x - 10, pont.y - 10, 20, 20); } /** Gombnyomás kezelése. @param ae gombnyomási esemény */ public void actionPerformed(java.awt.event.ActionEvent ae) { setOpaque(!((javax.swing.JCheckBox)ae.getSource()).isSelected()); repaint(); //komponens átlátszóságának megváltoztatása } /** Átlátszósági kapcsoló egérrel történő megragadási pontja */ private java.awt.Point belsőpont; /** Egérkattintás. @param me egérkattintási esemény */ public void mouseClicked(java.awt.event.MouseEvent me) { if (this.equals(me.getSource())) redispatchMouseEvent(me); } /** Egérbelépés. @param me egérbelépési esemény */ public void mouseEntered(java.awt.event.MouseEvent me) { if (this.equals(me.getSource())) redispatchMouseEvent(me); } /** Egérkilépés. @param me egérkilépési esemény */ public void mouseExited(java.awt.event.MouseEvent me) { if (this.equals(me.getSource())) redispatchMouseEvent(me); } /** Egérgomb lenyomás. @param me egérgomb lenyomási esemény */ public void mousePressed(java.awt.event.MouseEvent me) { if (this.equals(me.getSource())) { pont = me.getPoint(); //egérkurzor pozíciójának tárolása redispatchMouseEvent(me); repaint(); //kattintási pont kirajzolása } else belsőpont = me.getPoint(); //átlátszósági kapcsoló mozgatása } /** Egérgomb felengedés. @param me egérgomb felengedési esemény */ public void mouseReleased(java.awt.event.MouseEvent me) { if (this.equals(me.getSource())) redispatchMouseEvent(me); } /** Egéresemény továbbítása az kapcsolónak. @param me továbbítandó egéresemény */ private void redispatchMouseEvent(java.awt.event.MouseEvent me) { if (isOpaque()) return; //csak ha látszik is a kapcsoló java.awt.Point pont = javax.swing.SwingUtilities.convertPoint( me.getComponent(), me.getPoint(), getContentPane());//transzform if (pont.y < 0) return; //menüsor nem érdekes java.awt.Component komponens=javax.swing.SwingUtilities. //komponens getDeepestComponentAt( getContentPane(), pont.x, pont.y ); if ( !kapcs.equals(komponens) ) return;//csak a kapcsolónak adjuk át kapcs.dispatchEvent( javax.swing.SwingUtilities.convertMouseEvent( me.getComponent(), me, kapcs) ); } /** Egérmozgatás. @param me egérmozgatási esemény */ public void mouseMoved(java.awt.event.MouseEvent me) {} /** Áthúzás egérrel. @param me áthúzási egéresemény */ public void mouseDragged(java.awt.event.MouseEvent me) { java.awt.Point pont = javax.swing.SwingUtilities.convertPoint( me.getComponent(), me.getPoint(), this); pont.x -= belsőpont.x; //kezdeti megragadási pont pont.y -= belsőpont.y; //koordinátáinak figyelembe vétele if (pont.x < 0) pont.x = 0; //koordináták ellenőrzése if (pont.x > getWidth()-átlátszó.getWidth()) pont.x = getWidth()-átlátszó.getWidth(); if (pont.y < 0) pont.y = 0; if (pont.y > getHeight()-átlátszó.getHeight()) pont.y = getHeight()-átlátszó.getHeight(); átlátszó.setLocation(pont); //új pozícióra mozgatás } } }