import java.awt.Component; import java.awt.event.ActionEvent; import java.util.ArrayList; import java.util.Enumeration; import java.util.Hashtable; import java.util.Vector; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JTextArea; import javax.swing.JTextField; public class DVRouter extends Hub implements Runnable { Hashtable table = new Hashtable(); Thread thread; JTextArea tableArea; JButton autoButton; /*************************************************************************** * create all components (buttons, sliders, views, etc and arrange them */ public Component createComponents() { JPanel basePane = new JPanel(); basePane.setLayout(new BoxLayout(basePane, BoxLayout.Y_AXIS)); receivedField = new JTextField(10); basePane.add(receivedField); JButton sendButton = new JButton("Send"); sendButton.addActionListener(this); autoButton = new JButton("Start"); autoButton.addActionListener(this); JPanel buttonPane = new JPanel(); buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.X_AXIS)); buttonPane.add(sendButton); buttonPane.add(autoButton); basePane.add(buttonPane); basePane.add(createLights()); tableArea = new JTextArea(10, 8); basePane.add(tableArea); return basePane; } public void start() { System.out.println("Start in class DVRouter"); goOn = false; thread = new Thread(this); //thread.start(); } public void sendInfo() { System.out.println(node.getName() + " sends messages"); // hole List mit allen angeschlossenen Knoten Vector successors = node.getSuccessors(); String text = node.getName() + ":*:" + buildMessage(); for (int i = 0; i < successors.size(); i++) { // Link zu dem nächsten Knoten Link l = (Link) successors.elementAt(i); // Knoten zu diesem Link Node to = l.getNode(); // Nachricht schicken showNodes.sendMessage(node, to, text); // Sende Indikator einschalten sendLabel.setIcon(playImageIcon); } // Falls keine Verbindungen vorhanden sind, // Anzeige und dabei Lebenszähler aktualisieren if( successors.size() == 0 ) { aktualisiereTabellenAnzeige(); } } public void run() { System.out.println("Run in class DVRouter"); while (goOn) { sendInfo(); Sleep.sleep(5000, 12000); } } public void receiveMessage(Node sendNode, String text) { receivedField.setText(sendNode.getName() + "-> " + text); receiveLabel.setIcon(playImageIcon); triggerLabel(receiveLabel); String parts[] = text.split(":", 3); String sender = parts[0]; String empfaenger = parts[1]; table.put(sender, new DVInfo(sendNode.getName(), 1)); if (parts[2].indexOf(";") > 0) { // Zerlege Nachricht in Tabellen-Einträge String[] infos = parts[2].split(";"); for (String info : infos) { // Zerlege Tabellen-Eintrag String[] ip = info.split("\\+"); String dest = ip[0]; // Ich selbst? if (dest.equals(node.getName())) continue; int dist = Integer.parseInt(ip[1]); if (table.containsKey(dest)) { // Falls Eintrag schon vorhanden, nur // kleinerer Distanz überschreiben DVInfo i2 = table.get(dest); if (dist < i2.getDistance()) { table.put(dest, new DVInfo(sender, dist + 1)); } } else { table.put(dest, new DVInfo(sender, dist + 1)); } } } aktualisiereTabellenAnzeige(); } private void aktualisiereTabellenAnzeige() { // Nun Anzeige aktualisieren tableArea.setText(""); Enumeration keys = table.keys(); ArrayList oldies = new ArrayList(); while (keys.hasMoreElements()) { String k = keys.nextElement(); DVInfo info = table.get(k); String t = k + ": " + info.getNextHop() + " "; t += info.getLiveCounter() + " "; for( int i=0; i keys = table.keys(); while (keys.hasMoreElements()) { String k = keys.nextElement(); DVInfo info = table.get(k); text += k + "+" + info.getDistance() + ";"; } return text; } public void actionPerformed(ActionEvent event) { String eventText = event.getActionCommand(); System.out.println("Event: " + event + " " + eventText); if (eventText.equals("Send")) { sendInfo(); } else if (eventText.equals("Start")) { goOn = true; autoButton.setText( "Stop"); thread.start(); } else if (eventText.equals("Stop")) { goOn = false; autoButton.setText( "Start"); } } }