package elte.java2_utikalauz5.swing; /** Görgethető panel használata Swingben.

A felhasználói felület tetején látható a naplózó komponens, a középső görgethető panel pedig egy kép görgetését teszi lehetővé. Ezen képet egy külön saját pehelysúlyú komponens megjelenítéseként rajzoljuk ki, egy függőleges és egy vízszintes vonallal nyomon követjük az egérmutató aktuális pozícióját is. A görgethető panel sor- és oszlopfejlécei vonalzóhoz hasonlóan beosztásokat tartalmaznak, és egy mutató segítségével megjelölik az egérkurzor képen belüli pozícióját. A görgethető panel sarkaiba egyszerű nyomógombokat helyeztünk, ezek megnyomásakor a megfelelő sarok neve kerül naplózásra, ezzel is mutatva, hogy nem csak a főkomponens lehet aktív, hanem akár a sarkakban is tetszőleges, interaktivitást lehetővé tevő komponens is elhelyezhető. A görgethető panel görgetősávjait szándékosan vastagabbra állítottuk, hogy még több hely maradjon a sarokkomponensek számára. A felhasználói felület alján található vezérlő panel a vízszintes és függőleges görgetősáv megjelenítési politikáját megadó legördülő listákat, valamint a megjelenítés stílusát megváltoztató nyomógombokat tartalmaz. A képet tartalmazó görgethető panel megjelenítése nyomkövethető. @link.forrásfájl {@docRoot}/../data/swing/src JScrollPaneTeszt.java @link.letöltés {@docRoot}/../data/swing JScrollPaneTeszt.jar @since Java 2 Útikalauz programozóknak */ public class JScrollPaneTeszt extends SwingTeszt implements java.awt.event.ItemListener, java.awt.event.MouseMotionListener, javax.swing.event.ChangeListener { /** 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 JScrollPaneTeszt().init(argumentumok); } /** Applet leírása. @return A példaprogram leírása */ @Override public String getAppletInfo() { return "Görgethető panel használatát bemutató tesztprogram"; } /** Görgethető panel komponens */ private javax.swing.JScrollPane görgethetőpanel; /** Görgethető háttérkép */ private javax.swing.ImageIcon kép = ikonbetöltés("img/hatter.jpg"); /** Aktuálisan kiválasztott pont */ java.awt.Point pont = new java.awt.Point(); /** Háttérkép területe */ java.awt.Rectangle képterület = new java.awt.Rectangle( kép.getIconWidth(), kép.getIconHeight() ); /** GUI felépítése */ @Override protected void felépít() { add(new javax.swing.JScrollPane(napló), java.awt.BorderLayout.NORTH); görgethetőpanel = new javax.swing.JScrollPane( new javax.swing.JComponent() { /** Verziószám. */ private final static long serialVersionUID = 15L; { addMouseMotionListener( JScrollPaneTeszt.this ); java.awt.Dimension méret = képterület.getSize(); setPreferredSize(méret); //képterület lefixálása setMinimumSize(méret); setMaximumSize(méret); } /** Háttérkép és aktuális pozíció megjelenítése. @param g Rajzolási környezet */ @Override public void paintComponent(java.awt.Graphics g) { g.drawImage(kép.getImage(), 0, 0, this); //kép megrajzolása g.setColor(java.awt.Color.white); //fehér vonallal g.setXORMode(java.awt.Color.black); //de színváltósan g.drawLine(pont.x,0, pont.x, képterület.height-1);//függőlegesen g.drawLine(0, pont.y, képterület.width-1, pont.y);//vízszintesen } }); add(görgethetőpanel); //görgethető tartomány méretváltozásának görgethetőpanel.getViewport().addChangeListener(this); //figyelése javax.swing.JSlider vonalzó = new javax.swing.JSlider( javax.swing.JSlider.HORIZONTAL, 0, képterület.width, 0); javax.swing.Box box = javax.swing.Box.createHorizontalBox(); box.add( vonalzó ); box.add( javax.swing.Box.createHorizontalGlue() ); görgethetőpanel.setColumnHeaderView( box ); vonalzó.setPaintTicks(true); //beosztások ábrázolása vonalzó.setPaintLabels(true); vonalzó.setEnabled(false); vonalzó.setMajorTickSpacing(50); java.awt.Dimension méret = new java.awt.Dimension(//fix méret beállítása képterület.width, vonalzó.getPreferredSize().height); vonalzó.setMinimumSize(méret); //méret lefixálása vonalzó.setPreferredSize(méret); vonalzó.setMaximumSize(méret); vonalzó = new javax.swing.JSlider( javax.swing.JSlider.VERTICAL, 0, képterület.height,0); box = javax.swing.Box.createVerticalBox(); box.add( vonalzó ); box.add( javax.swing.Box.createVerticalGlue() ); görgethetőpanel.setRowHeaderView( box ); vonalzó.setPaintTicks(true); //beosztások ábrázolása vonalzó.setPaintLabels(true); vonalzó.setEnabled(false); vonalzó.setMajorTickSpacing(20); vonalzó.setInverted(true); méret = new java.awt.Dimension( //fix méret beállítása vonalzó.getPreferredSize().width, képterület.height); vonalzó.setMinimumSize(méret); //méret lefixálása vonalzó.setPreferredSize(méret); vonalzó.setMaximumSize(méret); méret = new java.awt.Dimension(40, 40); //görgetősávok felnagyítása görgethetőpanel.getHorizontalScrollBar().setPreferredSize( méret ); görgethetőpanel.getVerticalScrollBar().setPreferredSize( méret ); javax.swing.JButton gomb = new javax.swing.JButton("bal felső sarok"); gomb.setToolTipText(gomb.getText()); gomb.addActionListener(this); //nyomógomb figyelése görgethetőpanel.setCorner(görgethetőpanel.UPPER_LEFT_CORNER, gomb); gomb = new javax.swing.JButton("jobb felső sarok"); gomb.setToolTipText(gomb.getText()); gomb.addActionListener(this); görgethetőpanel.setCorner(görgethetőpanel.UPPER_RIGHT_CORNER, gomb); gomb = new javax.swing.JButton("jobb alsó sarok"); gomb.setToolTipText(gomb.getText()); gomb.addActionListener(this); görgethetőpanel.setCorner(görgethetőpanel.LOWER_RIGHT_CORNER, gomb); gomb = new javax.swing.JButton("bal alsó sarok"); gomb.setToolTipText(gomb.getText()); gomb.addActionListener(this); görgethetőpanel.setCorner(görgethetőpanel.LOWER_LEFT_CORNER, gomb); javax.swing.JPanel panel = new javax.swing.JPanel(); //vezérlőpanel add(panel, java.awt.BorderLayout.SOUTH); panel.setPreferredSize(new java.awt.Dimension(440, 170)); javax.swing.JLabel címke = new javax.swing.JLabel("vízszintes görgetősáv megjelenítése:"); panel.add(címke); címke.setToolTipText("horizontalScrollBarPolicy"); Object[] elemek = {"AS_NEEDED", "ALWAYS", "NEVER"}; //legördülő lista javax.swing.JComboBox legördülőlista=new javax.swing.JComboBox(elemek); panel.add(legördülőlista); legördülőlista.setToolTipText("HORIZONTAL_SCROLLBAR_"); legördülőlista.addItemListener(this); //kiválasztás figyelése címke = new javax.swing.JLabel("függőleges görgetősáv megjelenítése:"); panel.add(címke); címke.setToolTipText("verticalScrollBarPolicy"); legördülőlista = new javax.swing.JComboBox(elemek); panel.add(legördülőlista); legördülőlista.setToolTipText("VERTICAL_SCROLLBAR_"); legördülőlista.addItemListener(this); //kiválasztás figyelése for (javax.swing.Action váltás : stílusváltások) panel.add(new javax.swing.JButton(váltás)); //stílusváltásgombok setPreferredSize(new java.awt.Dimension(440, 500)); //kezdeti méret nyomkövetés(görgethetőpanel); //nyomkövethető a megjelenítése } /** Egérmutató húzása. @param me Egérmozgatási esemény */ public void mouseDragged(java.awt.event.MouseEvent me) { mouseMoved( me ); } /** Egérmutató mozgatása. @param me Egérmozgatási esemény */ public void mouseMoved(java.awt.event.MouseEvent me) { ((javax.swing.JSlider)((java.awt.Container)görgethetőpanel. getColumnHeader().getView()).getComponent(0)).setValue(me.getX()); ((javax.swing.JSlider)((java.awt.Container)görgethetőpanel. getRowHeader().getView()).getComponent(0)).setValue(me.getY()); if (képterület.contains(me.getPoint())) { //aktuális hely kirajzoltatása if (pont.x!=me.getX()) { //csak ha változott me.getComponent().repaint(pont.x, 0, 1, képterület.height); pont.x = me.getX(); me.getComponent().repaint(pont.x, 0, 1, képterület.height); } if (pont.y!=me.getY()) { //csak ha változott me.getComponent().repaint(0, pont.y, képterület.width, 1); pont.y = me.getY(); me.getComponent().repaint(0, pont.y, képterület.width, 1); } } } /** Görgetési terület változásának kijelzése. @param ce Változást jelző esemény */ public void stateChanged(javax.swing.event.ChangeEvent ce) { javax.swing.JViewport tartomány = (javax.swing.JViewport)ce.getSource(); java.awt.Point pozíció = tartomány.getViewPosition(); java.awt.Dimension méret = tartomány.getExtentSize(); naplóz("ChangeEvent: pozíció="+pozíció.x+","+pozíció.y+"; méret="+ méret.width+"*"+méret.height); } /** Görgetősávok láthatóságának megváltoztatása. @param ie Kiválasztási esemény */ public void itemStateChanged(java.awt.event.ItemEvent ie) { if (ie.getStateChange()!=java.awt.event.ItemEvent.SELECTED) return; int láthatóság = 0; String választás = (String)ie.getItem(); if (((javax.swing.JComboBox)ie.getSource()).getToolTipText(). startsWith("HORIZONTAL")) { //vízszintes görgetősáv if (választás.equals("ALWAYS")) láthatóság = //mindig javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS; else if (választás.equals("AS_NEEDED")) láthatóság = //csak ha kell javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED; else if (választás.equals("NEVER")) láthatóság = //soha javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER; görgethetőpanel.setHorizontalScrollBarPolicy(láthatóság); } else { //függőleges görgetősáv if (választás.equals("ALWAYS")) láthatóság = //mindig javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS; else if (választás.equals("AS_NEEDED")) láthatóság = //csak ha kell javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED; else if (választás.equals("NEVER")) láthatóság = //soha javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER; görgethetőpanel.setVerticalScrollBarPolicy(láthatóság); } görgethetőpanel.revalidate(); //görgethető panel újrarajzolása } /** Sarokgombok lenyomásának naplózása. @param ae Gomblenyomási esemény */ public void actionPerformed(java.awt.event.ActionEvent ae) { naplóz(((javax.swing.JButton)ae.getSource()).getText()); } }