import java.util.List; import java.util.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; import static javax.swing.JOptionPane.*; public class Dialog extends JFrame{ JButton nyKnapp, tidKnapp, visaKnapp; JTextArea display; JComboBox sorteringslista; List personStartnr = new ArrayList(); List personNamn = new ArrayList(); List personÅlder = new ArrayList(); List personTid = new ArrayList(); PersonNamnCompare namnCompare = new PersonNamnCompare(); PersonÅlderCompare ålderCompare = new PersonÅlderCompare(); PersonTidCompare tidCompare = new PersonTidCompare(); Dialog(){ super("DSV Kista Marathon"); JPanel nordPanel = new JPanel(); nordPanel.setLayout(new BoxLayout(nordPanel, BoxLayout.Y_AXIS)); add(nordPanel, BorderLayout.NORTH); JPanel rad1 = new JPanel(); JPanel rad2 = new JPanel(); rad1.setLayout(new FlowLayout(FlowLayout.RIGHT)); rad2.setLayout(new FlowLayout(FlowLayout.RIGHT)); nordPanel.add(rad1); nordPanel.add(rad2); nyKnapp = new JButton("Ny"); nyKnapp.addActionListener(new NyLyssnare()); tidKnapp = new JButton("Tid"); tidKnapp.addActionListener(new TidLyssnare()); String[] sorteringsString = { "Startnr", "Namn", "Ålder", "Tid"}; sorteringslista = new JComboBox(sorteringsString); rad1.add(nyKnapp); rad1.add(tidKnapp); rad1.add(new JLabel("Sortering:")); rad1.add(sorteringslista); visaKnapp = new JButton("Visa"); visaKnapp.addActionListener(new VisaLyssnare()); rad2.add(visaKnapp); display = new JTextArea(); display.setEditable(false); JScrollPane scroll = new JScrollPane(display); scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); add(scroll, BorderLayout.CENTER); setVisible(true); setMinimumSize(new Dimension (256, 133)); setSize(256, 320); setDefaultCloseOperation(EXIT_ON_CLOSE); setLocation(600,300); } class NyLyssnare implements ActionListener{ public void actionPerformed(ActionEvent aev){ NyFormular nyForm = new NyFormular(personStartnr.size()+1); for(;;){ try{ if (showFormular(nyForm, "Ny Tävlande")) return; String namn = nyForm.getNamn(); String land = nyForm.getLand(); if (land.isEmpty() || namn.isEmpty()) throw new MissingFormatArgumentException("Land or Namn is empty"); int ålder = nyForm.getÅlder(); if (ålder < 18 || ålder > 100) throw new IllegalArgumentException(); int pos = personNamn.size()+1; Person per = new Person(pos, namn, land, ålder); binaryAdd(personNamn, per, namnCompare); binaryAdd(personÅlder, per, ålderCompare); personStartnr.add(per); break; } catch (NumberFormatException e){ showError("Ålder måste innehålla numeriskt värde"); } catch (MissingFormatArgumentException e){ showError("Namn och/eller land saknar innehåll"); } catch (IllegalArgumentException e){ showError("Tävlande måste vara minst 18 och högst 100 år"); } } } } class TidLyssnare implements ActionListener{ public void actionPerformed(ActionEvent aev){ TidFormular tidForm = new TidFormular(); for(;;){ try { if (showFormular(tidForm, "Registrera Tid")) return; int startnr=tidForm.getStartnr(); double tempTid = tidForm.getTid(); double tid = (double)(Math.round(tempTid*100))/100; if (startnr<1 || startnr>personStartnr.size()) throw new IllegalArgumentException(); Person per = personStartnr.get(startnr-1); boolean ifAdd=(per.getTid()==-1?true:false); per.setTid(tid); if (ifAdd) binaryAdd(personTid, per, tidCompare); break; } catch (NumberFormatException e){ showError("Startnr och tid måste innehålla ett numeriskt värde"); } catch (IllegalArgumentException e){ showError("Startnummret är ogiltigt"); } } } } static final int STARTNR=0, NAMN=1, ÅLDER=2, TID=3; class VisaLyssnare implements ActionListener{ public void actionPerformed(ActionEvent aev){ int val =sorteringslista.getSelectedIndex(); display.setText(""); switch (val) { case STARTNR: printPerson(personStartnr);break; case NAMN: printPerson(personNamn);break; case ÅLDER: printPerson(personÅlder);break; case TID: printPerson(personTid);break; } } } void printPerson(List pList){ for (Person p: pList) display.append(p+"\n"); } void binaryAdd(List pList, Person per, Comparator comp){ int pos = Collections.binarySearch(pList, per, comp); if (pos<0) pos=-pos-1; pList.add(pos,per); } boolean showFormular(Formular f, String titel){ int ret = showConfirmDialog(Dialog.this, f, titel, OK_CANCEL_OPTION); if (ret!=YES_OPTION) return true; return false; } void showError(String str){ showMessageDialog(Dialog.this, str, "Error", ERROR_MESSAGE); } class PersonNamnCompare implements Comparator{ public int compare(Person p1, Person p2){ String str1 = p1.getNamn(); String str2 = p2.getNamn(); return str1.compareTo(str2); } } class PersonÅlderCompare implements Comparator{ public int compare(Person p1, Person p2){ return p1.getÅlder() - p2.getÅlder(); } } class PersonTidCompare implements Comparator{ public int compare(Person p1, Person p2){ Double first = p1.getTid(); Double second = p2.getTid(); return first.compareTo(second); } } public static void main (String[]args){ new Dialog(); } }