rendered paste bodyimport graphs.*;import java.awt.*;import java.awt.event.*;import java.io.*;import java.util.*;import javax.swing.*;import javax.swing.event.*;import javax.swing.filechooser.*;public class Inlupp2 extends JFrame implements ActionListener{class Plats implements Serializable{ private final int SIZE = 20; private String n; private int x, y; private boolean v; Plats(String namn, int xPosition, int yPosition) { n = namn; x = xPosition; y = yPosition; v = false; } int getSize() { return SIZE; } int getPositionX() { return x; } int getPositionY() { return y; } void paint(Graphics g) { Color c; if (v) c = Color.blue; else c = Color.red; g.setColor(c); g.fillOval(x, y, SIZE, SIZE); g.setColor(Color.black); g.drawString(n, x + getSize() + 2, y + 10); } void setVald(boolean vald) { v = vald; } boolean isVald() { return v; } public String toString() { return n; }}class Karta extends JPanel implements MouseListener{ private ImageIcon k; private ListGraph<Plats> platser = new ListGraph<Plats>(); //private LinkedList<Plats> markerade = new LinkedList<Plats>(); private Plats first; private Plats second; // En liten boolean som avgör om en ny markering ska läggas in på första private boolean markFirst = true; // Boolean för att avgöra om användaren ska lägga till en ny plats. private boolean v = false; private boolean saving = false; Karta() { addMouseListener(this); } void tömPlatser() { platser = new ListGraph<Plats>(); first = null; second = null; markFirst = true; } ListGraph<Plats> getPlatser() { return platser; } void setSaving(boolean b) { saving = b; if (b) removeMouseListener(this); else addMouseListener(this); } boolean isSaving() { return saving; } void setPlatser(ListGraph<Plats> ps) { platser = ps; repaint(); } void setMarkFirst(boolean b) { markFirst = b; } boolean isMarkFirst() { return markFirst; } Plats getFirst() { return first; } Plats getSecond() { return second; } void setFirst(Plats p) { first = p; } void setSecond(Plats p) { second = p; } boolean isTwoMarked() { return first != null && second != null; } void addPlats(String namn, int x, int y) { Plats p = new Plats(namn, x, y); platser.addNode(p); listModel.sortElement(p); setAltered(true); } boolean finnsKant() throws Exception { if (!isTwoMarked()) throw new Exception("Två platser måste vara markerade!"); return platser.pathExists(getFirst(), getSecond()); } void addKant(String namn, int tid) throws Exception { Plats p1 = getFirst(); Plats p2 = getSecond(); try { platser.connect(p1, p2, namn, tid); } catch (IllegalStateException ise) { throw new Exception("Det finns redan en förbindelse mellan " + p1 + " och " + p2 + "!"); } setAltered(true); avmarkera(); repaint(); } void avmarkera() { if (getFirst() != null) getFirst().setVald(false); if (getSecond() != null) getSecond().setVald(false); från.clearSelection(); till.clearSelection(); repaint(); } String getKantNamn() throws Exception, NoSuchElementException { if (!isTwoMarked()) throw new Exception(); String namn = platser. getEdgeName(getFirst(), getSecond()); if (namn == null) throw new Exception("Det finns inget namn!"); return namn; } int getKantTid() throws Exception, NoSuchElementException { if (!isTwoMarked()) throw new Exception(); int i = platser.getEdgeWeight(getFirst(), getSecond()); if (i == -1) throw new Exception("Det finns ingen tid!"); return i; } void setKantTid(int tid) throws Exception, NoSuchElementException, IllegalArgumentException { if (!isTwoMarked()) throw new Exception("Två platser måste vara markerade!"); platser.setEdgeWeight(getFirst(), getSecond(), tid); setAltered(true); } void setKartBild(ImageIcon image) { k = image; if (getLayout() == null) setBounds(0, 0, k.getIconWidth(), k.getIconHeight()); else { Dimension d = new Dimension(k.getIconWidth(), k.getIconHeight()); setPreferredSize(d); } } void setVäljPosition(boolean välj) { v = välj; } boolean isVäljPosition() { return v; } ImageIcon getKartBild() { return new ImageIcon(k.getImage()); } public void paintComponent(Graphics g) {// if (k == null) if (k == null || isSaving()) { g.setColor(getBackground()); g.fillRect(0, 0, getWidth(), getHeight()); } else { g.drawImage(k.getImage(), 0, 0, this); LinkedList<Plats> ps = platser.getNodes(); for (Plats p : ps) { p.paint(g); } } } public void mouseClicked(MouseEvent me) { int x = me.getX(); int y = me.getY(); // Sätt ut ny plats. if (isVäljPosition()) { String namn = JOptionPane. showInputDialog(this, "Vad heter platsen?"); setVäljPosition(false); if (namn == null || namn.length() < 1) { return; } // drar av lite för snyggare positionering addPlats(namn, x - 10, y - 10); repaint(); } // Tryck på plats, markera eller avmarkera (inte fler än 3) else// else if (markerade.size() < 3) { LinkedList<Plats> ps = platser.getNodes(); for (Plats p : ps) { if (p.getPositionX() <= x && p.getPositionY() <= y && p.getPositionX() + p.getSize() >= x && p.getPositionY() + p.getSize() >= y) { boolean ny = !p.isVald(); // Avmarkering if (!ny) { if (getFirst() != null && p == getFirst()) { p.setVald(false); setMarkFirst(true); setFirst(null); } else if (getSecond() != null && p == getSecond()) { p.setVald(false); setMarkFirst(false); setSecond(null); } if (getFirst() == null && getSecond() == null) setMarkFirst(true); } // Markering else { if (isMarkFirst() && ((getSecond() != null && p != getSecond()) || getSecond() == null)) { if (getFirst() != null) getFirst().setVald(false); p.setVald(true); setFirst(p); setMarkFirst(false); } else if (getSecond() == null && ((getFirst() != null && p != getFirst()) || getFirst() == null)) { p.setVald(true); setSecond(p); setMarkFirst(false); } } setCursor(Cursor.getDefaultCursor()); uppdateraListor(); repaint(); break; } } } } void uppdateraListor() { if (getFirst() != null) från.setSelectedValue(getFirst(), false); else från.clearSelection(); if (getSecond() != null) till.setSelectedValue(getSecond(), false); else till.clearSelection(); /* JList[] listor = new JList[] {från, till}; for (int i=0; i<2; i++) { else if (markerade.size() > i) listor[i].setSelectedValue(markerade.get(i), false); else listor[i].clearSelection(); } */ } public void mouseEntered(MouseEvent me) { if (isVäljPosition()) setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)); else setCursor(Cursor.getDefaultCursor()); } public void mouseExited(MouseEvent me) { setCursor(Cursor.getDefaultCursor()); } public void mousePressed(MouseEvent me) { } public void mouseReleased(MouseEvent me) { } }class SortedListModel extends DefaultListModel{ void sortElement(Plats p) { System.out.println("y0"); boolean added = false; for (int i=0; i<size() && !added; i++) { Plats p2 = (Plats) get(i); if (p.toString().compareTo(p2.toString()) < 0) { insertElementAt(p, i); added = true; } } if (!added) addElement(p); }} private JButton bHitta = new JButton("Hitta väg"); private JButton bVisa = new JButton("Visa förbindelse"); private JButton bNod = new JButton("Ny plats"); private JButton bKant = new JButton("Ny förbindelse"); private JButton bVärde = new JButton("Ändra tid"); private Karta karta = new Karta(); private SortedListModel listModel = new SortedListModel(); private JList från = new JList(listModel); private JList till = new JList(listModel); private JPanel nyKant = new JPanel(); private JPanel nyKantRubrik = new JPanel(); private JLabel nyKantRubrikLabel = new JLabel(); private JPanel nyKantNamn = new JPanel(); private JLabel nyKantNamnLabel = new JLabel("Namn:"); private JTextField nyKantNamnText = new JTextField(20); private JPanel nyKantTid = new JPanel(); private JLabel nyKantTidLabel = new JLabel("Tid:"); private JTextField nyKantTidText = new JTextField(20); private JPanel hittaStig = new JPanel(); private JTextArea hittaStigText = new JTextArea(); private JMenuBar mbar = new JMenuBar(); private JMenu arkiv = new JMenu("Arkiv"); private JMenu operationer = new JMenu("Operationer"); private JMenuItem arkivKarta = new JMenuItem("Hämta karta"); private JMenuItem arkivÖppna = new JMenuItem("Öppna..."); private JMenuItem arkivSpara = new JMenuItem("Spara"); private JMenuItem arkivSparaSom = new JMenuItem("Spara som..."); private JMenuItem arkivAvsluta = new JMenuItem("Avsluta"); private JMenuItem operationHitta = new JMenuItem("Hitta väg..."); private JMenuItem operationVisa = new JMenuItem("Visa förbindelse..."); private JMenuItem operationNod = new JMenuItem("Ny plats..."); private JMenuItem operationKant = new JMenuItem("Ny förbindelse..."); private JMenuItem operationVärde = new JMenuItem("Ändra tid..."); private JFileChooser filDialog = new JFileChooser(); private File aktuellFil = null; private boolean altered = false; // Varför inte privat, main startar ju programmet. private Inlupp2() { super("Kalle och Carls inlupp2!"); addComponents(); addActions(); showFrame(); } private void addComponents() { setLayout(new BorderLayout()); JPanel frånPanel = new JPanel(new BorderLayout()); JScrollPane spFrån = new JScrollPane(); spFrån.getViewport().add(från); från.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); frånPanel.add(new JLabel("Från:"), BorderLayout.NORTH); frånPanel.add(spFrån, BorderLayout.CENTER); JPanel tillPanel = new JPanel(new BorderLayout()); JScrollPane spTill = new JScrollPane(); spTill.getViewport().add(till); till.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); tillPanel.add(new JLabel("Till:"), BorderLayout.NORTH); tillPanel.add(spTill, BorderLayout.CENTER); från.setFixedCellWidth(80); till.setFixedCellWidth(80); JScrollPane spKarta = new JScrollPane(); spKarta.getViewport().add(karta); JPanel pKnappar = new JPanel(new FlowLayout(FlowLayout.CENTER)); pKnappar.add(bHitta); pKnappar.add(bVisa); pKnappar.add(bNod); pKnappar.add(bKant); pKnappar.add(bVärde); add(frånPanel, BorderLayout.WEST); add(tillPanel, BorderLayout.EAST); add(spKarta, BorderLayout.CENTER); add(pKnappar, BorderLayout.NORTH); /* try { karta.setKartBild(new ImageIcon("europa.gif")); } catch (Exception e) { viewException(e); } karta.addPlats("Paris", 10, 10); karta.addPlats("Stockholm", 110, 110); karta.addPlats("London", 210, 210); */ nyKant.setLayout(new BoxLayout(nyKant, BoxLayout.Y_AXIS)); nyKantRubrik.add(nyKantRubrikLabel); nyKantNamn.add(nyKantNamnLabel); nyKantNamn.add(nyKantNamnText); nyKantTid.add(nyKantTidLabel); nyKantTid.add(nyKantTidText); nyKant.add(nyKantRubrik); nyKant.add(nyKantNamn); nyKant.add(nyKantTid); hittaStig.setLayout(new BoxLayout(hittaStig, BoxLayout.Y_AXIS)); JScrollPane hittaStigScroll = new JScrollPane(); hittaStigScroll.getViewport().add(hittaStigText); hittaStig.add(hittaStigScroll); arkiv.add(arkivKarta); arkiv.add(arkivÖppna); arkiv.add(arkivSpara); arkiv.add(arkivSparaSom); arkiv.add(arkivAvsluta); operationer.add(operationHitta); operationer.add(operationVisa); operationer.add(operationNod); operationer.add(operationKant); operationer.add(operationVärde); mbar.add(arkiv); mbar.add(operationer); setJMenuBar(mbar); FileNameExtensionFilter filter = new FileNameExtensionFilter( "JPG, GIF, PNG, CKI", "jpg", "gif", "png", "cki"); filDialog.setFileFilter(filter); } public void actionPerformed(ActionEvent ae) { Object source = ae.getSource(); if (source == bNod || source == operationNod) nyPlats(); else if (source == bKant || source == operationKant) nyKant(); else if (source == bVisa || source == operationVisa) visaKant(); else if (source == bVärde || source == operationVärde) ändraTid(); else if (source == bHitta || source == operationHitta) hittaStig(); else if (source == arkivKarta) nyKarta(); else if (source == arkivÖppna) öppna(); else if (source == arkivSpara) spara(); else if (source == arkivSparaSom) sparaSom(); else if (source == arkivAvsluta) stäng(); } private void addActions() { bNod.addActionListener(this); operationNod.addActionListener(this); bKant.addActionListener(this); operationKant.addActionListener(this); bVisa.addActionListener(this); operationVisa.addActionListener(this); bVärde.addActionListener(this); operationVärde.addActionListener(this); bHitta.addActionListener(this); operationHitta.addActionListener(this); arkivKarta.addActionListener(this); arkivÖppna.addActionListener(this); arkivSpara.addActionListener(this); arkivSparaSom.addActionListener(this); arkivAvsluta.addActionListener(this); från.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent lse) { listmarkering(lse, från); } }); till.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent lse) { listmarkering(lse, till); } }); } private void showFrame() { setVisible(true); pack(); int w = getWidth(); int h = getHeight(); Dimension screen = getToolkit().getScreenSize(); if (w > screen.getWidth()) w -= 100; if (h > screen.getHeight()) h -= 100; setSize(new Dimension(w, h)); int x = (int) (screen.getWidth() - w) / 2; int y = (int) (screen.getHeight() - h) / 2; setLocation(x, y); } void setAltered(boolean b) { altered = b; } boolean isAltered() { return altered; } private void nyPlats() { karta.setVäljPosition(true); } /* * Tyvärr har felmeddelanden hamnat både här och uppe i kartan. */ private void nyKant() { if (!karta.isTwoMarked()) { viewException("Två platser måste vara markerade!"); return; } try { if (karta.finnsKant()) { Plats p1 = karta.getFirst(); Plats p2 = karta.getSecond(); throw new Exception("Det finns redan en förbindelse mellan " + p1 + " och " + p2 + "!"); } visaKantDialog(true, true, true, "Ny förbindelse"); } catch (Exception e) { viewException(e); return; } String namn = nyKantNamnText.getText(); int tid = 0; try { if (namn == null || namn.length() < 1) throw new Exception("Du måste skriva ett namn!"); tid = Integer.parseInt(nyKantTidText.getText()); } catch (NumberFormatException e) { viewException("Du måste skriva ett heltal som tid!"); nyKant(); } catch (Exception e) { viewException(e); nyKant(); } try { karta.addKant(namn, tid); // Töm nyKantNamnText.setText(""); nyKantTidText.setText(""); } catch (Exception e) { viewException(e); } } private void visaKantDialog(boolean ändraNamn, boolean ändraTid, boolean question, String titel) throws Exception { nyKantNamnText.setEditable(ändraNamn); nyKantTidText.setEditable(ändraTid); if (!karta.isTwoMarked()) new Exception("Två platser måste vara markerade!"); nyKantRubrikLabel.setText("Förbindelse från " + karta.getFirst() + " till " + karta.getSecond()); if (question) JOptionPane.showMessageDialog(this, nyKant, titel, JOptionPane.OK_CANCEL_OPTION); else JOptionPane.showMessageDialog(this, nyKant, titel, JOptionPane.OK_OPTION); } private void visaKant() { if (!karta.isTwoMarked()) { viewException("Två platser måste vara markerade!"); return; } try { String namn = karta.getKantNamn(); int tid = karta.getKantTid(); nyKantNamnText.setText(namn); nyKantTidText.setText(tid + ""); visaKantDialog(false, false, false, "Förbindelseinformation"); } catch (NoSuchElementException nee) { viewException(nee); } catch (Exception e) { viewException("Det finns ingen förbindelse mellan " + karta.getFirst() + " och " + karta.getSecond() + "!"); } karta.avmarkera(); } private void ändraTid() { if (!karta.isTwoMarked()) { viewException("Två platser måste vara markerade!"); return; } try { String namn = karta.getKantNamn(); int tid = karta.getKantTid(); nyKantNamnText.setText(namn); nyKantTidText.setText(tid + ""); visaKantDialog(false, true, true, "Ändra tid"); } catch (Exception e) { viewException("Det finns ingen förbindelse mellan " + karta.getFirst() + " och " + karta.getSecond() + "!"); return; } int tid = 0; try { tid = Integer.parseInt(nyKantTidText.getText()); karta.setKantTid(tid); } catch (NumberFormatException e) { viewException("Du måste skriva ett heltal som tid!"); nyKant(); } catch (NoSuchElementException nsee) { viewException("Det finns ingen förbindelse mellan " + karta.getFirst() + " och " + karta.getSecond() + "!"); } catch (Exception e) { viewException(e); } karta.avmarkera(); } private void hittaStig() { if (!karta.isTwoMarked()) { viewException("Två platser måste vara markerade!"); return; } // Fyll i resultat i hittaStigText JOptionPane.showMessageDialog(this, hittaStig, "Från " + karta.getFirst() + " till " + karta.getSecond(), JOptionPane.OK_OPTION); } private void listmarkering(ListSelectionEvent lse, JList lista) { if (!lse.getValueIsAdjusting()) { int index = lista.getSelectionModel().getMinSelectionIndex(); if (index == -1) { lista.clearSelection(); return; } Plats p = (Plats) listModel.getElementAt(index); //LinkedList<Plats> l = karta.getMarkerade(); p.setVald(true); if (lista == från) { if (karta.getFirst() != null) karta.getFirst().setVald(false); karta.setFirst(p); if (karta.getSecond() != null && karta.getSecond() == p) { karta.setSecond(null); till.clearSelection(); } } else if (lista == till) { if (karta.getSecond() != null) karta.getSecond().setVald(false); karta.setSecond(p); if (karta.getFirst() != null && karta.getFirst() == p) { karta.setMarkFirst(true); karta.setFirst(null); från.clearSelection(); } } p.setVald(true); karta.repaint(); } } private void nyKarta() { if (kollaSpara() && filDialog.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { karta.tömPlatser(); File fil = filDialog.getSelectedFile(); karta.setKartBild(new ImageIcon(fil.getAbsolutePath())); karta.repaint(); setAltered(true); } } private boolean kollaSpara() { if (isAltered()) { String msg = "Du har osparade ändringar,\nVill du spara dem?"; int svar = JOptionPane.showConfirmDialog(this, msg); if (svar == JOptionPane.YES_OPTION) return spara(); if (svar == JOptionPane.CANCEL_OPTION) return false; } return true; } private void öppna() { if (!kollaSpara()) return; // Om kartan inte har markerade platser, skugga knappar? int svar = filDialog.showOpenDialog(this); if (svar == JFileChooser.APPROVE_OPTION) { try { karta.tömPlatser(); File fil = filDialog.getSelectedFile(); aktuellFil = fil; ObjectInputStream in = new ObjectInputStream(new FileInputStream(fil)); ImageIcon k = (ImageIcon) in.readObject(); Object o; while ((o = in.readObject()) != null) System.out.println("o.class:" + o.getClass().getName()); //ListGraph<Plats> platser = (ListGraph<Plats>) in.readObject(); in.close(); setAltered(false); } catch (Exception e) { viewException(e); } } } private boolean spara() { if (aktuellFil == null) return sparaSom(); else return spara(aktuellFil); } private boolean spara(File fil) { try { ImageIcon k = karta.getKartBild(); ListGraph<Plats> platser = karta.getPlatser(); if (karta.getFirst() != null) karta.getFirst().setVald(false); if (karta.getSecond() != null) karta.getSecond().setVald(false); ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(fil)); karta.setSaving(true); out.writeObject(k); out.writeaObject(platser); karta.setSaving(false); out.flush(); out.close(); if (karta.getFirst() != null) karta.getFirst().setVald(true); if (karta.getSecond() != null) karta.getSecond().setVald(true); setAltered(false); } catch (Exception e) { viewException(e); return false; } return true; } private boolean sparaSom() { int svar = filDialog.showSaveDialog(this); if (svar == JFileChooser.APPROVE_OPTION) { File fil = filDialog.getSelectedFile(); return spara(fil); } return false; } // Spara? Stäng. private void stäng() { if (kollaSpara()) System.exit(0); } private void viewException(String reason) { viewException(new Exception(reason)); } private void viewException(Exception e) { e.printStackTrace(); JOptionPane.showMessageDialog(this, e.getMessage(), "Fel!", JOptionPane.WARNING_MESSAGE); } public void processWindowEvent(WindowEvent we) { if (we.getID() == we.WINDOW_CLOSING) { stäng(); } } public static void main(String[] arguments) { new Inlupp2(); }}