All pastes #741358 Raw Edit

AIMMOTH

public java v1 · immutable
·published 2007-10-18 17:12 UTC
rendered paste body
import 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();	}}