import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.WindowConstants; /** * Luokka Asetusdialogi, joka periytyy luokasta JDialog ja toteuttaa * luokan ActionListener. Asetusdialogi avataan menusta ja siitä * voidaan asettaa ohjelmaan ötököiden minimi- ja maksimiarvot * sekä vuorojen maksimimäärä. * * @author Karoliina Tiuraniemi * @version 1.0, 18.1.2009 * */ public class Asetusdialogi extends JDialog implements ActionListener{ private Ikkuna ikkuna; private JComboBox minimiCombo; private int minimi; private JComboBox maksimiCombo; private int maksimi; private JComboBox vuoroCombo; private int vuoro; private Nappi ok; private Nappi cancel; private static final long serialVersionUID = 1L; /** * Konstruktori, joka luo uuden asetusdialogin. * @param ikkuna jonka asetuksia muutetaan * @param modal dialogiin on pakko reagoida ennen kuin * pääsee sulkemaan sen tai käsittelemään ikkunaa. */ public Asetusdialogi(Ikkuna ikkuna, boolean modal){ super(ikkuna, modal); System.out.println("luodaan uusi asetus"); this.ikkuna = ikkuna; this.setTitle("Asetukset"); Asetuspaneeli paneeli = new Asetuspaneeli(); paneeli.setLayout(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); c.gridwidth = 1; c.gridheight = 1; c.weightx = 0.0; c.weighty = 0.0; c.anchor = GridBagConstraints.WEST; c.ipadx = 0; c.ipady = 0; // 1. rivin yläpuolelle vähän enemmän tilaa c.insets = new Insets(10,2,2,2); // solu (0,0) alkaa tästä c.gridx = 0; c.gridy = 0; JLabel minimiLabel = new JLabel("Ötököiden minimimäärä"); paneeli.add(minimiLabel, c); // solu (1,0) alkaa tästä c.gridx++; String[] minimiMaara = { "1", "5", "10", "15", "20" }; this.minimiCombo = new JComboBox(minimiMaara); this.minimiCombo.setSelectedIndex(0); this.minimi = Integer.parseInt(minimiMaara[0]); this.minimiCombo.addActionListener(this); paneeli.add(minimiCombo, c); // muiden rivien ympärillä tasaisesti tilaa c.insets = new Insets(2,2,2,2); // solu (0,1) alkaa tästä c.gridx = 0; c.gridy++; JLabel maksimiLabel = new JLabel("Ötököiden maksimimäärä"); paneeli.add(maksimiLabel, c); // solu (1,1) alkaa tästä c.gridx++; String[] maksimiMaara = { "5", "10", "15", "20", "25", "30" }; this.maksimiCombo = new JComboBox(maksimiMaara); // asetetaan oletusvalinta this.maksimiCombo.setSelectedIndex(1); // alustetaan luokan attribuutti oletusvalinnalla this.maksimi = Integer.parseInt(maksimiMaara[1]); this.maksimiCombo.addActionListener(this); paneeli.add(this.maksimiCombo, c); // viimeisen rivin alapuolella enemmän tilaa c.insets = new Insets(2,2,10,2); // solu (0,2) alkaa tästä c.gridx = 0; c.gridy++; JLabel vuoroLabel = new JLabel("Vuorojen maksimimäärä"); paneeli.add(vuoroLabel, c); // solu (1,2) alkaa tästä c.gridx++; String[] vuorojenMaara = { "1", "5", "10", "15", "20", "25", "30" }; this.vuoroCombo = new JComboBox(vuorojenMaara); this.vuoroCombo.setSelectedIndex(1); this.vuoro = Integer.parseInt(vuorojenMaara[1]); this.vuoroCombo.addActionListener(this); paneeli.add(this.vuoroCombo, c); this.add(BorderLayout.CENTER, paneeli); Asetuspaneeli nappipaneeli = new Asetuspaneeli(); FlowLayout f = new FlowLayout(); // tasataan loppuun f.setAlignment(FlowLayout.TRAILING); // määritellään nappien vaakasuoraksi väliksi 5 pikseliä f.setHgap(5); // otetaan käyttöön uusi layout nappipaneeli.setLayout(f); MouseListener kuuntelija = new AsetusKuuntelija(); this.ok = new Nappi("OK"); this.ok.addMouseListener(kuuntelija); nappipaneeli.add(this.ok); this.cancel = new Nappi("Peruuta"); this.cancel.addMouseListener(kuuntelija); nappipaneeli.add(this.cancel); this.add(BorderLayout.SOUTH, nappipaneeli); this.pack(); this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); this.setLocationRelativeTo(null); } /** * Metodi, joka ottaa talteen comboboxin arvon * @param e ActionEvent */ public void actionPerformed(ActionEvent e) { JComboBox combo = (JComboBox)e.getSource(); String teksti = (String)combo.getSelectedItem(); System.out.println("comboboxin arvo on " + teksti); int arvo = Integer.parseInt(teksti); if (combo.equals(this.minimiCombo)){ this.minimi = arvo; } else if (combo.equals(this.maksimiCombo)){ this.maksimi = arvo; } else if (combo.equals(this.vuoroCombo)){ this.vuoro = arvo; } System.out.println("Minimin arvo on " + this.minimi); System.out.println("Maksimin arvo on " + this.maksimi); System.out.println("Vuoromaksimin arvo on " + this.vuoro); } private class AsetusKuuntelija extends Kuuntelija { public void mouseClicked(MouseEvent e){ Peli peli = Asetusdialogi.this.ikkuna.annaPeli(); int taso = peli.annaTaso(); if (e.getSource() instanceof Nappi){ // talletetaan omaan muuttujaansa klikattu nappi Nappi nappi = (Nappi) e.getSource(); // jos on klikattu nappia ok if (nappi.equals(Asetusdialogi.this.ok)){ // lopetetaan peli peli.lopetaPeli(); // poistetaan asetusdialogi näkyvistä Asetusdialogi.this.setVisible(false); Asetusdialogi.this.dispose(); // aloitetaan uusi peli samalla tasolla Asetusdialogi.this.ikkuna.asetaPeli(new Peli(taso, Asetusdialogi.this.vuoro)); Asetusdialogi.this.ikkuna.asetaMatikka( new Matikka(Asetusdialogi.this.maksimi, Asetusdialogi.this.minimi)); Asetusdialogi.this.ikkuna.uusiLasku(); } else if (nappi.equals(Asetusdialogi.this.cancel)){ // poistetaan asetusdialogi näkyvistä Asetusdialogi.this.setVisible(false); Asetusdialogi.this.dispose(); // ei tehdä mitään muutoksia } } } } /** * Sisäluokka Asetuspaneeli, joka periytyy luokasta JPanel. * Määrittelee asetusdialogin taustavärin. * @author tiuranik * */ private class Asetuspaneeli extends JPanel { private static final long serialVersionUID = 1L; /** * Metodi, joka piirtää asetuspaneelin grafiikan. * @param g Graphics */ public void paintComponent(Graphics g){ // graphics olio tyyppimuunnetaan graphics 2D:ksi Graphics2D g2 = (Graphics2D) g; // määritellään käytetty väri, johon värjätään g2.setPaint(Varit.TUMMANVIHREA); // määritellään paneelin kokoinen neliö, jonka sisälle värjäys tulee int leveys = this.getWidth(); int korkeus = this.getHeight(); Rectangle r = new Rectangle(0,0,leveys,korkeus); // kutsutaan graphic-oliota, joka täyttää neliön. g2.fill(r); } } }