package elte.java2_utikalauz5.swing; /** A görgetősávok és állapotjelzők használata Swingben.
A felhasználói felület tetején látható értékkiválasztó és sima görgetősáv, valamint állapotjelző az értéktartomány aktuális állapotát reprezentálják. A bal oldali értékkiválasztó görgetősávval az értéktartomány kezdetét, a jobb oldalival a végét, az alsóval pedig a résztartomány hosszát lehet szabályozni. Ezen értékkiválasztó görgetősávokkal egy adatmodellen osztozó sima görgetősávok is láthatók a megfelelő értékkiválasztó görgetősáv mellett, illetve felett. A felhasználói felület közepén a naplózó komponens látható, amely az értéktartomány jellemzőinek változását naplózza. Alatta található a vezérlő panel, melynek gombjai segítségével az értéktartomány alapú komponensek jellemzőit, valamint a megjelenítési stílust lehet szabályozni. A ProgressMonitor és ProgressMonitorInputStream nyomógombokkal pedig egy hosszantartó háttér-, illetve fájlművelet indítható el, melynek haladása ezután nyomkövethető lesz. Minden értéktartomány adatmodellű komponens megjelenítése nyomkövethető. @link.forrásfájl {@docRoot}/../data/swing/src TartomanyTeszt.java @link.letöltés {@docRoot}/../data/swing TartomanyTeszt.jar @since Java 2 Útikalauz programozóknak */ public class TartomanyTeszt extends SwingTeszt implements 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 TartomanyTeszt().init(argumentumok); } /** Applet leírása. @return A példaprogram leírása */ @Override public String getAppletInfo() { return "Értéktartományok használatát bemutató tesztprogram"; } /** Hosszan beolvasandó fájlnév paraméterneve */ private static final String FÁJLNÉV = "file"; /** Applet indítási paramétereinek leírása. @return Az appletparaméterek leírása */ @Override public String[][] getParameterInfo() { return new String[][] {{FÁJLNÉV, "fájlnév", "Hosszan beolvasandó fájl neve"}}; } /** Közös értéktartomány adatmodell */ private javax.swing.BoundedRangeModel modell; /** Értéktartomány maximumát megadó adatmodell */ private javax.swing.BoundedRangeModel minmodell; /** Értéktartomány maximumát megadó adatmodell */ private javax.swing.BoundedRangeModel maxmodell; /** Értéktartomány résztartományának hosszát megadó adatmodell */ private javax.swing.BoundedRangeModel szélességmodell; /** Értékkiválasztó csúszka */ private javax.swing.JSlider értékkiválasztó; /** Haladási állapotjelző */ private javax.swing.JProgressBar állapotjelző; /** GUI felépítése */ @Override protected void felépít() { javax.swing.JScrollBar görgetősáv = new javax.swing.JScrollBar( javax.swing.JScrollBar.HORIZONTAL); modell = görgetősáv.getModel(); //értéktartomány adatmodellje minmodell = new javax.swing.DefaultBoundedRangeModel(); maxmodell = new javax.swing.DefaultBoundedRangeModel(); szélességmodell = new javax.swing.DefaultBoundedRangeModel(); értékkiválasztó = new javax.swing.JSlider(modell); állapotjelző = new javax.swing.JProgressBar(modell); modell.addChangeListener(this); add(értékkiválasztó, java.awt.BorderLayout.NORTH); értékkiválasztó.setOrientation(javax.swing.JSlider.HORIZONTAL); értékkiválasztó.setMajorTickSpacing(10); //beosztások értékkiválasztó.setMinorTickSpacing(5); nyomkövetés(értékkiválasztó); //nyomkövethető a megjelenítés javax.swing.JPanel panel = new javax.swing.JPanel( new java.awt.BorderLayout()); //külső panel add(panel); panel.add(görgetősáv, java.awt.BorderLayout.NORTH); nyomkövetés(görgetősáv); //nyomkövethető a megjelenítés minmodell.setValue(modell.getMinimum()); //aktuális minimum beállítása minmodell.addChangeListener(this); //minimum változásának figyelése javax.swing.JSlider értékkiválasztó=new javax.swing.JSlider(minmodell); add(értékkiválasztó, java.awt.BorderLayout.WEST); értékkiválasztó.setOrientation(javax.swing.JSlider.VERTICAL); értékkiválasztó.putClientProperty("JSlider.isFilled", Boolean.TRUE); nyomkövetés(értékkiválasztó); //nyomkövethető a megjelenítés görgetősáv=new javax.swing.JScrollBar(javax.swing.JScrollBar.VERTICAL); panel.add(görgetősáv, java.awt.BorderLayout.WEST); görgetősáv.setModel(minmodell); //minimum másik megjelenítése nyomkövetés(görgetősáv); //nyomkövethető a megjelenítés maxmodell.setValue(modell.getMaximum()); //aktuális maximum beállítása maxmodell.addChangeListener(this); //maximum változásának figyelése értékkiválasztó = new Csuszka(maxmodell); //maximum állítója add(értékkiválasztó, java.awt.BorderLayout.EAST); értékkiválasztó.setOrientation(javax.swing.JSlider.VERTICAL); nyomkövetés(értékkiválasztó); //nyomkövethető a megjelenítés görgetősáv=new javax.swing.JScrollBar(javax.swing.JScrollBar.VERTICAL); panel.add(görgetősáv, java.awt.BorderLayout.EAST); görgetősáv.setModel(maxmodell); //maximum másik megjelenítése nyomkövetés(görgetősáv); //nyomkövethető a megjelenítés szélességmodell.setValue(modell.getExtent()); //aktuális tartományhossz szélességmodell.addChangeListener(this); //változásának figyelése értékkiválasztó = new Csuszka(szélességmodell); //tartományhossz állító add(értékkiválasztó, java.awt.BorderLayout.SOUTH); értékkiválasztó.setOrientation(javax.swing.JSlider.HORIZONTAL); értékkiválasztó.putClientProperty("JSlider.isFilled", Boolean.TRUE); nyomkövetés(értékkiválasztó); //nyomkövethető a megjelenítés görgetősáv = new javax.swing.JScrollBar(javax.swing.JScrollBar. HORIZONTAL); görgetősáv.setModel(szélességmodell); nyomkövetés(görgetősáv); //nyomkövethető a megjelenítés panel.add(görgetősáv, java.awt.BorderLayout.SOUTH); javax.swing.JPanel belsőpanel = new javax.swing.JPanel( new java.awt.BorderLayout()); panel.add(belsőpanel); belsőpanel.add(állapotjelző, java.awt.BorderLayout.NORTH); nyomkövetés(állapotjelző); //nyomkövethető a megjelenítés belsőpanel.add(new javax.swing.JScrollPane(napló)); panel = new javax.swing.JPanel(); //vezérlő panel belsőpanel.add(panel, java.awt.BorderLayout.SOUTH); panel.setPreferredSize(new java.awt.Dimension(400, 250)); for (javax.swing.Action váltás : stílusváltások) panel.add(new javax.swing.JButton(váltás)); //stílusváltásgombok javax.swing.AbstractButton gomb = new javax.swing.JCheckBox("címkék?", értékkiválasztó.getPaintLabels()); panel.add(gomb); //címkék gomb.setToolTipText("paintLabels"); gomb.setActionCommand("labels"); gomb.addActionListener(this); //gomb kiválasztásának figyelése gomb = new javax.swing.JCheckBox("beosztások?", értékkiválasztó.getPaintTicks()); panel.add(gomb); //beosztások gomb.setToolTipText("paintTicks"); gomb.setActionCommand("ticks"); gomb.addActionListener(this); //gomb kiválasztásának figyelése gomb = new javax.swing.JCheckBox("görgetősáv?", értékkiválasztó.getPaintTrack()); panel.add(gomb); //görgetősáv gomb.setToolTipText("paintTrack"); gomb.setActionCommand("track"); gomb.addActionListener(this); //gomb kiválasztásának figyelése gomb = new javax.swing.JCheckBox("értékre állítás?", értékkiválasztó.getSnapToTicks()); panel.add(gomb); //értékre állítás gomb.setToolTipText("snapToTicks"); gomb.setActionCommand("snap"); gomb.addActionListener(this); //gomb kiválasztásának figyelése gomb = new javax.swing.JCheckBox("megfordítás?", értékkiválasztó.getInverted()); panel.add(gomb); //megfordítás gomb.setToolTipText("inverted"); gomb.setActionCommand("invert"); gomb.addActionListener(this); //gomb kiválasztásának figyelése gomb = new javax.swing.JCheckBox("keret?", állapotjelző.isBorderPainted()); panel.add(gomb); //keret gomb.setToolTipText("borderPainted(JProgressBar)"); gomb.setActionCommand("border"); gomb.addActionListener(this); //gomb kiválasztásának figyelése gomb = new javax.swing.JCheckBox("folyamatos?", állapotjelző.isIndeterminate()); panel.add(gomb); //keret gomb.setToolTipText("isIndeterminate(JProgressBar)"); gomb.setActionCommand("indeter"); gomb.addActionListener(this); //gomb kiválasztásának figyelése gomb = new javax.swing.JCheckBox("szöveg?", állapotjelző.isStringPainted()); panel.add(gomb); //szöveg gomb.setToolTipText("stringPainted(JProgressBar)"); gomb.setActionCommand("string"); gomb.addActionListener(this); //gomb kiválasztásának figyelése gomb = new javax.swing.JButton("ProgressMonitor"); panel.add(gomb); //háttérben futó művelet állaptokijelzése gomb.setToolTipText("ProgressMonitor"); gomb.setActionCommand("pm"); gomb.addActionListener(this); //gomb megnyomásának figyelése gomb = new javax.swing.JButton("ProgressMonitorInputStream"); panel.add(gomb); //fájlfeldolgozás állaptokijelzése gomb.setToolTipText("ProgressMonitorInputStream"); gomb.setActionCommand("pmis"); gomb.addActionListener(this); //gomb megnyomásának figyelése stateChanged(null); //értéktartomány aktuális értékeinek naplózása } /** Gombnyomás kezelése. @param ae gombnyomási esemény */ public void actionPerformed(java.awt.event.ActionEvent ae) { final javax.swing.AbstractButton gomb = (javax.swing.AbstractButton) ae.getSource(); if (ae.getActionCommand().equals("snap")) { //értékre állítás értékkiválasztó.setSnapToTicks(gomb.isSelected()); } else if (ae.getActionCommand().equals("labels")) { //címkék értékkiválasztó.setPaintLabels(gomb.isSelected()); } else if (ae.getActionCommand().equals("ticks")) { //beosztások értékkiválasztó.setPaintTicks(gomb.isSelected()); } else if (ae.getActionCommand().equals("track")) { //görgetősáv értékkiválasztó.setPaintTrack(gomb.isSelected()); } else if (ae.getActionCommand().equals("invert")) { //megfordítás értékkiválasztó.setInverted(gomb.isSelected()); } else if (ae.getActionCommand().equals("indeter")) { //folyamatos állapotjelző.setIndeterminate(gomb.isSelected()); } else if (ae.getActionCommand().equals("border")) { //keret állapotjelző.setBorderPainted(gomb.isSelected()); } else if (ae.getActionCommand().equals("string")) { //szöveg állapotjelző.setStringPainted(gomb.isSelected()); } else if (ae.getActionCommand().equals("pm")) new Thread() {//háttérműv /** Állapotkijelző */ javax.swing.ProgressMonitor monitor; /** A művelet aktuális állása */ int érték; /** Eddig tart a művelet */ int maxérték; /** Maximális lépésköz */ int maxlépés; /** Megszakították a műveletet */ boolean megszakítva; /** A művelet sikeresen befejeződött */ boolean kész; /** A művelet befejeződött */ boolean vége; /** Művelet indítása */ @Override public void start() { gomb.setEnabled(false); //indító gomb tiltása érték = modell.getMinimum();//művelet kezdőértékeinek beállítása maxérték = modell.getMaximum(); maxlépés = modell.getExtent(); //állapotkijelzés indítása monitor = new javax.swing.ProgressMonitor(TartomanyTeszt.this, "Hosszan tartó háttérművelet", "A művelet elkezdődött...", érték, maxérték); super.start(); } /** Művelet végrehajtása */ @Override public void run() { if (vége) return; //már befejeződött if (javax.swing.SwingUtilities.isEventDispatchThread()) { int érték = this.érték; if (megszakítva || kész) { //művelet végének naplózása if (megszakítva) naplóz("Művelet: Megszakítás!"); else { naplóz("Művelet: Kész: "+érték); modell.setValue(érték); } monitor.close(); //állapotkijelző elrejtése gomb.setEnabled(true); //indító gomb engedélyezése vége = true; //művelet befejezve return; } naplóz("Művelet: "+érték); //művelet állapotának kijelzése modell.setValue(érték); monitor.setProgress(érték); //állapotkijelző léptetése megszakítva = monitor.isCanceled();//megszakítás lekérdezése if (megszakítva) { //és végrehajtása monitor.setNote("Megszakítás..."); this.érték = maxérték; //maradék kijelzése } else monitor.setNote("Hátra van még "+(maxérték-érték)); } else { int lépés; //aktuális haladás mértéke while (érték