/** Chapter 13 Programming Challenge 1, Scrollable Tax Calculator */ import java.awt.*; import java.awt.event.*; import javax.swing.event.*; import javax.swing.*; public class TaxCalc extends JFrame { // Klasa prosiruje JFrame - ima nekog prozora public static final int MINIMUM = 1; // Konstante se definisu sa public static final public static final int MAXIMUM = 10; // public static final int INITTAX = 2; // private double pPrice; // Privatna polja, pTax je inicijalizovano na private double pSaleTax; // vrednost INITTAX private int pTax = INITTAX; // JTextField price = new JTextField (12); // Delovi prozora [frejma] i njihova inicijalizacija JSlider scroll = new JSlider (MINIMUM,MAXIMUM,INITTAX); // odgovarajucim konstruktorima. Za detalje bi morale da se JTextField taxRate = new JTextField (4); // procesljaju ove klase, sto meni nije bilo bas najmilije JTextField calc = new JTextField (12); // dok sam raadio zadatke... public TaxCalc () { // Konstruktor nase klase. super ("Tax Calculation"); // Ovaj string ce stajati kao naziv programa [prozora, frejma] setSize (250, 150); // Ovo su dimenzije prozora i setResizable (false); // postavili smo fiksnu velicinu, ne moze se promeniti. addPanels(); // Poziv metode, implementacija je nize u kodu. addWindowListener (new WindowAdapter() { // Ovaj deo obezbedjuje da kada kliknemo na close public void windowClosing (WindowEvent e) { // prozora [gornji desni ugao] System.exit(0); // program zavrsava sa radom. } // ... }); // ... setVisible (true); // I da, prozor treba biti vidljiv. } // void addPanels () { // Evo metode za konfigurisanje prozora [frejma] Panel panel0 = new Panel (); // Prvi panel. Sadrzi cenu i panel0.add (new JLabel ("Price: ", 2)); // panel0.add (price); // getContentPane().add ("North", panel0); // smesten je u gornjem delu prozora. Panel panel2 = new Panel (); // Drugi panel sadrzi vec definisani scroll [to je slider]. panel2.add (scroll); // scroll.setMajorTickSpacing (2); // Ovo je podesavanje koraka slajdera, tako da scroll.setMinorTickSpacing (1); // radi sa celobrojnim vrednostima. panel2.add (new JLabel ("Tax Rate:", 2)); // Dodatak: Brojcano predstavljena procentualna taksa, panel2.add (taxRate); // taxRate.setEnabled(false); // u ovaj TextField se ne moze unositi, sluzi samo za prikaz. getContentPane().add ("Center", panel2); // Dodajmo i ovaj panel nasem prozoru. Panel panel3 = new Panel (); // Treci panel. panel3.add (new JLabel ("Sales Tax: ", 2)); // Sadrzi vec definisani TextField - calc. panel3.add (calc); // Takodje je read-only i predstavlja ukupnu taksu. calc.setEnabled(false); // getContentPane().add ("South", panel3); // Dodajmo panel. price.addActionListener (new TextFieldListener()); // Osluskivaci. Pomocu njih u stvari hvatamo promene koje scroll.addChangeListener (new SliderListener()); // se desavaju u prozoru [promena cene i promena % takse]. } private class TextFieldListener implements ActionListener { // Privatne klase koje obradjuju dogadjaje u nasem prozoru. public void actionPerformed (ActionEvent e) { // Metoda koja to zapravo radi. pPrice = Double.parseDouble (price.getText()); // Pretvaranje Stringa [unesene cene] u realan broj. pTax = scroll.getValue(); // "Hvatanje" procentualne takse sa slidera. taxRate.setText ("" + pTax); // Ispis procentualne takse. pSaleTax = pPrice*pTax/100; // Racun ukupne takse. calc.setText("" + pSaleTax); // Ispis ukupne takse. } } private class SliderListener implements ChangeListener { // Ova klasa je za obradu dogadjaja na klizacu [slideru]. public void stateChanged (ChangeEvent e) { // Prethodna je bila za polje u kome se unosi cena. pPrice = Double.parseDouble (price.getText()); // pTax = scroll.getValue(); // Telo je identicno, tako da se bilo promenom cene, taxRate.setText ("" + pTax); // bilo promenom % takse, nama menja i ukupna taksa. pSaleTax = pPrice*pTax/100; // calc.setText("" + pSaleTax); // } } public static void main(String[] args) // Glavni program samo kreira frejm [prozor] { // i dat je u samom zadatku TaxCalc tc = new TaxCalc(); } }