/* | |||||
* To change this license header, choose License Headers in Project Properties. | |||||
* To change this template file, choose Tools | Templates | |||||
* and open the template in the editor. | |||||
*/ | |||||
package kommunikation; | |||||
import javax.swing.JOptionPane; | |||||
import kommunikation.controller.ConnectController; | |||||
import kommunikation.controller.GrafikController; | |||||
import kommunikation.controller.ReceiveAdapter; | |||||
import kommunikation.controller.SendController; | |||||
import kommunikation.transmitter.BilderKom; | |||||
import kommunikation.view.ViewChat; | |||||
/** | |||||
* Builder Class | |||||
* @author Alexander_Christoph | |||||
*/ | |||||
public class Start | |||||
{ | |||||
public Start() | |||||
{ | |||||
Object[] options = {"Client","Server"}; | |||||
int selected = JOptionPane.showOptionDialog(null,"Wollen Sie Client oder Server sein","Konfiguration",JOptionPane.DEFAULT_OPTION,JOptionPane.QUESTION_MESSAGE,null, options, options[0]); | |||||
if(selected < 0) | |||||
{ | |||||
JOptionPane.showMessageDialog(null, "Sie müssen entweder Client oder Server sein. Bitte starten Sie das Programm erneut und wählen eine Option","Fehler", JOptionPane.ERROR_MESSAGE); | |||||
} | |||||
else | |||||
{ | |||||
ViewChat view = new ViewChat(); | |||||
BilderKom model = new BilderKom(selected); | |||||
model.registerEvents(); | |||||
if(selected == 1) | |||||
{ | |||||
view.setTitle("Server"); | |||||
} | |||||
view.getGrafikViewChat().setModel(model.getModel()); | |||||
GrafikController gcontrol= new GrafikController(view.getGrafikViewChat(),model); | |||||
gcontrol.registerEvents(); | |||||
ConnectController control = new ConnectController(view,model); | |||||
control.registerEvents(); | |||||
SendController send = new SendController(view,model); | |||||
send.registerEvents(); | |||||
ReceiveAdapter adapter = new ReceiveAdapter(view,model); | |||||
adapter.registerEvents(); | |||||
view.setVisible(true); | |||||
} | |||||
} | |||||
/** | |||||
* @param args the command line arguments | |||||
*/ | |||||
public static void main(String[] args) | |||||
{ | |||||
new Start(); | |||||
} | |||||
} |
/* | |||||
* To change this license header, choose License Headers in Project Properties. | |||||
* To change this template file, choose Tools | Templates | |||||
* and open the template in the editor. | |||||
*/ | |||||
package kommunikation.controller; | |||||
import java.awt.event.ActionEvent; | |||||
import java.awt.event.ActionListener; | |||||
import javax.swing.JOptionPane; | |||||
import kommunikation.transmitter.BilderKom; | |||||
import kommunikation.transmitter.Transmitter; | |||||
import kommunikation.view.ViewChat; | |||||
/** | |||||
* | |||||
* @author Alexander_Christoph | |||||
*/ | |||||
public class ConnectController implements ActionListener | |||||
{ | |||||
ViewChat view; | |||||
BilderKom model; | |||||
public ConnectController(ViewChat view, BilderKom model) | |||||
{ | |||||
this.view = view; | |||||
this.model = model; | |||||
} | |||||
public void registerEvents() | |||||
{ | |||||
view.getBtnConnect().addActionListener(this); | |||||
} | |||||
@Override | |||||
public void actionPerformed(ActionEvent arg0) | |||||
{ | |||||
try | |||||
{ | |||||
String ip = view.getTfIp().getText(); | |||||
int port = Integer.parseInt(view.getTfPort().getText()); | |||||
model.setIpPort(ip, port); | |||||
} | |||||
catch(NumberFormatException ex) | |||||
{ | |||||
JOptionPane.showMessageDialog(null, "Bitte geben sie eine Zahl ein","Fehler", JOptionPane.ERROR_MESSAGE); | |||||
} | |||||
view.getTaChat().append("Verbinde\n"); | |||||
model.start(); | |||||
} | |||||
} |
/* | |||||
* To change this license header, choose License Headers in Project Properties. | |||||
* To change this template file, choose Tools | Templates | |||||
* and open the template in the editor. | |||||
*/ | |||||
package kommunikation.controller; | |||||
import java.awt.Point; | |||||
import java.awt.event.MouseEvent; | |||||
import java.awt.event.MouseListener; | |||||
import java.awt.event.MouseMotionListener; | |||||
import kommunikation.transmitter.BilderKom; | |||||
import kommunikation.transmitter.Figur; | |||||
import kommunikation.view.GrafikView; | |||||
/** | |||||
* | |||||
* @author le | |||||
*/ | |||||
public class GrafikController implements MouseMotionListener, MouseListener | |||||
{ | |||||
private GrafikView view; | |||||
private BilderKom model; | |||||
private Figur f; | |||||
private Boolean neu; | |||||
private Boolean ersterPunkt; | |||||
private Point zwischenSpeicher; | |||||
public GrafikController(GrafikView view, BilderKom model) | |||||
{ | |||||
this.view = view; | |||||
this.model = model; | |||||
neu = true; | |||||
zwischenSpeicher = new Point(); | |||||
ersterPunkt = true; | |||||
} | |||||
public void registerEvents() | |||||
{ | |||||
view.addMouseMotionListener(this); | |||||
view.addMouseListener(this); | |||||
} | |||||
@Override | |||||
public void mouseDragged(MouseEvent evt) | |||||
{ | |||||
Point p = evt.getPoint(); | |||||
view.drawPoint(p); | |||||
f.addPoint(p); | |||||
if(!ersterPunkt) | |||||
{ | |||||
view.line(zwischenSpeicher, p); | |||||
} | |||||
zwischenSpeicher = p; | |||||
ersterPunkt = false; | |||||
} | |||||
@Override | |||||
public void mouseMoved(MouseEvent e) | |||||
{ | |||||
} | |||||
@Override | |||||
public void mouseClicked(MouseEvent e) | |||||
{ | |||||
} | |||||
@Override | |||||
public void mousePressed(MouseEvent e) | |||||
{ | |||||
if(neu) | |||||
{ | |||||
f = new Figur(); | |||||
neu = false; | |||||
} | |||||
} | |||||
@Override | |||||
public void mouseReleased(MouseEvent evt) | |||||
{ | |||||
if (evt.getButton() == MouseEvent.BUTTON3) | |||||
{ | |||||
view.doPrint(); | |||||
} | |||||
model.addFigur(f); | |||||
model.senden(f); | |||||
neu = true; | |||||
ersterPunkt = true; | |||||
} | |||||
@Override | |||||
public void mouseEntered(MouseEvent e) | |||||
{ | |||||
} | |||||
@Override | |||||
public void mouseExited(MouseEvent e) | |||||
{ | |||||
} | |||||
} |
/* | |||||
* To change this license header, choose License Headers in Project Properties. | |||||
* To change this template file, choose Tools | Templates | |||||
* and open the template in the editor. | |||||
*/ | |||||
package kommunikation.controller; | |||||
import java.util.Observable; | |||||
import java.util.Observer; | |||||
import java.util.logging.Logger; | |||||
import kommunikation.transmitter.BilderKom; | |||||
import kommunikation.transmitter.Figur; | |||||
import kommunikation.view.ViewChat; | |||||
/** | |||||
* | |||||
* @author Alexander_Christoph | |||||
*/ | |||||
public class ReceiveAdapter implements Observer | |||||
{ | |||||
ViewChat view; | |||||
BilderKom model; | |||||
Logger lg =Logger.getLogger("observer"); | |||||
public ReceiveAdapter(ViewChat view, BilderKom model) | |||||
{ | |||||
this.view = view; | |||||
this.model = model; | |||||
} | |||||
public void registerEvents() | |||||
{ | |||||
model.addObserver(this); | |||||
} | |||||
@Override | |||||
public void update(Observable arg0, Object arg1) | |||||
{ | |||||
lg.info("in update"); | |||||
Object obj; | |||||
obj = model.getNachricht(); | |||||
if(obj instanceof String) | |||||
{ | |||||
String text = obj.toString() + "\n"; | |||||
view.getTaChat().append("Freund: " + text); | |||||
} | |||||
if(obj instanceof Figur) | |||||
{ | |||||
model.addFigurFremd((Figur)obj); //muss eventuell noch gezeichnet werden nachdem es hinzugefügt wurde !!! | |||||
view.repaint(); | |||||
} | |||||
} | |||||
} | |||||
/* | |||||
* To change this license header, choose License Headers in Project Properties. | |||||
* To change this template file, choose Tools | Templates | |||||
* and open the template in the editor. | |||||
*/ | |||||
package kommunikation.controller; | |||||
import java.awt.event.ActionEvent; | |||||
import java.awt.event.ActionListener; | |||||
import kommunikation.transmitter.BilderKom; | |||||
import kommunikation.view.ViewChat; | |||||
/** | |||||
* | |||||
* @author Alexander_Christoph | |||||
*/ | |||||
public class SendController implements ActionListener | |||||
{ | |||||
ViewChat view; | |||||
BilderKom model; | |||||
public SendController(ViewChat view, BilderKom model) | |||||
{ | |||||
this.view = view; | |||||
this.model = model; | |||||
} | |||||
public void registerEvents() | |||||
{ | |||||
view.getTfMessage().addActionListener(this); | |||||
} | |||||
@Override | |||||
public void actionPerformed(ActionEvent arg0) | |||||
{ | |||||
String text = view.getTfMessage().getText(); | |||||
view.getTaChat().append("Ich: "+ text+"\n"); | |||||
model.senden(text); | |||||
view.getTfMessage().setText(""); | |||||
} | |||||
} |
/* | |||||
* To change this license header, choose License Headers in Project Properties. | |||||
* To change this template file, choose Tools | Templates | |||||
* and open the template in the editor. | |||||
*/ | |||||
package kommunikation.logger; | |||||
import java.util.logging.LogRecord; | |||||
import java.util.logging.SimpleFormatter; | |||||
/** | |||||
* | |||||
* @author nobody | |||||
*/ | |||||
public class MyFormatter extends SimpleFormatter | |||||
{ | |||||
public MyFormatter() | |||||
{ | |||||
} | |||||
@Override | |||||
public String format(LogRecord record) | |||||
{ | |||||
String str = "| " + record.getMillis() + " | " + record.getLevel()+ " | " + record.getSourceClassName() + " | " + record.getMessage() + " |\n"; | |||||
return str; | |||||
} | |||||
} |
package kommunikation.logger; | |||||
/** | |||||
* | |||||
* @author nobody | |||||
*/ | |||||
import java.io.File; | |||||
import java.io.IOException; | |||||
import java.util.logging.ConsoleHandler; | |||||
import java.util.logging.FileHandler; | |||||
import java.util.logging.Level; | |||||
import java.util.logging.Logger; | |||||
public class OhmLogger | |||||
{ | |||||
private static Logger lg = null; | |||||
public static Logger getLogger() | |||||
{ | |||||
if (lg == null) | |||||
{ | |||||
lg = Logger.getLogger("OhmLogger"); | |||||
initLogger(); | |||||
} | |||||
return lg; | |||||
} | |||||
private static void initLogger() | |||||
{ | |||||
try | |||||
{ | |||||
// Besser: Die Log-Datei über eine Properties-Dateieinstellbar machen | |||||
// Hier wird in das temporäre Verzeichnis desBetriebssytems geloggt. | |||||
String datei = System.getProperty("java.io.tmpdir") + File.separator + "log.txt"; | |||||
FileHandler fh = new FileHandler(datei); | |||||
ConsoleHandler ch = new ConsoleHandler(); | |||||
lg.setUseParentHandlers(false); | |||||
// Text-Ausgabe --> SimpleFormatter | |||||
// Standard = Default: XMLFormatter --> xml-Format | |||||
//fh.setFormatter(new SimpleFormatter()); | |||||
lg.addHandler(fh); | |||||
// besser eigener Formatter: | |||||
ch.setFormatter(new MyFormatter()); | |||||
lg.addHandler(ch); | |||||
lg.setLevel(Level.ALL); | |||||
} | |||||
catch (IOException ioex) | |||||
{ | |||||
System.err.println(ioex); | |||||
} | |||||
} | |||||
} |
/* | |||||
* To change this license header, choose License Headers in Project Properties. | |||||
* To change this template file, choose Tools | Templates | |||||
* and open the template in the editor. | |||||
*/ | |||||
package kommunikation.transmitter; | |||||
import java.io.File; | |||||
import java.io.IOException; | |||||
import java.util.List; | |||||
import java.util.Observable; | |||||
import java.util.Observer; | |||||
import java.util.function.Supplier; | |||||
import java.util.logging.Level; | |||||
import java.util.logging.Logger; | |||||
import kommunikation.logger.OhmLogger; | |||||
/** | |||||
* | |||||
* @author nobody | |||||
*/ | |||||
public class BilderKom extends Observable implements Observer | |||||
{ | |||||
protected static final Logger lg = OhmLogger.getLogger(); | |||||
private GrafikModel grafik; | |||||
private Transmitter trans; | |||||
public BilderKom(int modus ) | |||||
{ | |||||
trans = new Transmitter(modus); | |||||
grafik = new GrafikModel(); | |||||
} | |||||
public void registerEvents() | |||||
{ | |||||
trans.addObserver(this); | |||||
} | |||||
public GrafikModel getModel() | |||||
{ | |||||
return grafik; | |||||
} | |||||
public void start() | |||||
{ | |||||
trans.start(); | |||||
} | |||||
public void setIpPort(String ip,int port) | |||||
{ | |||||
trans.setIpPort(ip, port); | |||||
} | |||||
public void senden(Object nachricht) | |||||
{ | |||||
trans.senden(nachricht); | |||||
} | |||||
public Object getNachricht() | |||||
{ | |||||
return trans.getNachricht(); | |||||
} | |||||
public void addFigur(Figur f) | |||||
{ | |||||
grafik.addFigur(f); | |||||
} | |||||
public void addFigurFremd(Figur f) | |||||
{ | |||||
grafik.addFigurFremd(f); | |||||
} | |||||
public List<Figur> getFigur() | |||||
{ | |||||
return grafik.getFigur(); | |||||
} | |||||
public void speichereFiguren(File datei) | |||||
{ | |||||
try | |||||
{ | |||||
grafik.speichereFiguren(datei); | |||||
} | |||||
catch (IOException ex) | |||||
{ | |||||
Logger.getLogger(BilderKom.class.getName()).log(Level.SEVERE, null, ex); | |||||
} | |||||
} | |||||
@SuppressWarnings("unchecked") | |||||
public void ladeFiguren(File dateiname) | |||||
{ | |||||
try | |||||
{ | |||||
grafik.ladeFiguren(dateiname); | |||||
} | |||||
catch (IOException | ClassNotFoundException ex) | |||||
{ | |||||
lg.severe((Supplier<String>) ex); | |||||
} | |||||
} | |||||
@Override | |||||
public void update(Observable o, Object arg) | |||||
{ | |||||
this.setChanged(); | |||||
this.notifyObservers(); | |||||
} | |||||
} |
/* | |||||
* To change this license header, choose License Headers in Project Properties. | |||||
* To change this template file, choose Tools | Templates | |||||
* and open the template in the editor. | |||||
*/ | |||||
package kommunikation.transmitter; | |||||
import java.io.IOException; | |||||
import java.io.ObjectInputStream; | |||||
import java.io.ObjectOutputStream; | |||||
import java.net.Socket; | |||||
/** | |||||
* | |||||
* @author Alexander_Christoph | |||||
*/ | |||||
public class Client extends Kommunikationspartner | |||||
{ | |||||
public Client() | |||||
{ | |||||
this.ip = "127.0.0.0"; | |||||
lg.info("Client erstellt"); | |||||
} | |||||
@Override | |||||
public void verbinde() | |||||
{ | |||||
try | |||||
{ | |||||
Socket s = new Socket(ip, port); // Achtung: blockiert! | |||||
lg.info("Client: socket erstellt"); | |||||
out = new ObjectOutputStream(s.getOutputStream()); | |||||
in = new ObjectInputStream(s.getInputStream()); | |||||
lg.info("Client: Stream initialisiert"); | |||||
} | |||||
catch (IOException ex) | |||||
{ | |||||
lg.severe(ex.toString()); | |||||
} | |||||
} | |||||
} |
/* | |||||
* To change this license header, choose License Headers in Project Properties. | |||||
* To change this template file, choose Tools | Templates | |||||
* and open the template in the editor. | |||||
*/ | |||||
package kommunikation.transmitter; | |||||
import java.awt.Point; | |||||
import java.io.Serializable; | |||||
import java.util.ArrayList; | |||||
import java.util.Collections; | |||||
import java.util.List; | |||||
/** | |||||
* | |||||
* @author nobody | |||||
*/ | |||||
public class Figur implements Serializable | |||||
{ | |||||
private ArrayList<Point> punkte; | |||||
public Figur() | |||||
{ | |||||
punkte = new ArrayList<>(); | |||||
} | |||||
public void addPoint(Point p) | |||||
{ | |||||
punkte.add(p); | |||||
} | |||||
public List<Point> getPunkte() | |||||
{ | |||||
return Collections.unmodifiableList(punkte); | |||||
} | |||||
} |
/* | |||||
* To change this license header, choose License Headers in Project Properties. | |||||
* To change this template file, choose Tools | Templates | |||||
* and open the template in the editor. | |||||
*/ | |||||
package kommunikation.transmitter; | |||||
import java.io.BufferedInputStream; | |||||
import java.io.BufferedOutputStream; | |||||
import java.io.File; | |||||
import java.io.FileInputStream; | |||||
import java.io.FileNotFoundException; | |||||
import java.io.FileOutputStream; | |||||
import java.io.IOException; | |||||
import java.io.ObjectInputStream; | |||||
import java.io.ObjectOutputStream; | |||||
import java.util.ArrayList; | |||||
import java.util.Collections; | |||||
import java.util.List; | |||||
import java.util.Observable; | |||||
import java.util.logging.Logger; | |||||
import kommunikation.logger.OhmLogger; | |||||
/** | |||||
* | |||||
* @author le | |||||
*/ | |||||
public class GrafikModel extends Observable | |||||
{ | |||||
private ArrayList<Figur> figuren; | |||||
private ArrayList<Figur> figurenFremd; | |||||
private static final Logger lg = OhmLogger.getLogger(); | |||||
public GrafikModel() | |||||
{ | |||||
figuren = new ArrayList<>(); | |||||
figurenFremd = new ArrayList<>(); | |||||
} | |||||
public void addFigurFremd(Figur f) | |||||
{ | |||||
figurenFremd.add(f); | |||||
lg.info("fremde Figur wurde hinzugefügt"); | |||||
} | |||||
public void addFigur(Figur f) | |||||
{ | |||||
figuren.add(f); | |||||
lg.info("Figur wurde hinzugefügt"); | |||||
} | |||||
public List<Figur> getFigur() | |||||
{ | |||||
return Collections.unmodifiableList(figuren); | |||||
} | |||||
public List<Figur> getFigurFremd() | |||||
{ | |||||
return Collections.unmodifiableList(figurenFremd); | |||||
} | |||||
public void speichereFiguren(File datei) throws FileNotFoundException, IOException | |||||
{ | |||||
FileOutputStream fos = new FileOutputStream(datei); | |||||
BufferedOutputStream bos = new BufferedOutputStream(fos); | |||||
ObjectOutputStream oos = new ObjectOutputStream(bos); | |||||
oos.writeObject(figuren); | |||||
oos.flush(); | |||||
oos.close(); | |||||
} | |||||
public void ladeFiguren(File dateiname) throws FileNotFoundException, IOException, ClassNotFoundException | |||||
{ | |||||
FileInputStream fis = new FileInputStream(dateiname); | |||||
BufferedInputStream buffin = new BufferedInputStream(fis); | |||||
ObjectInputStream ois = new ObjectInputStream(buffin); | |||||
figuren = (ArrayList<Figur>) ois.readObject(); | |||||
ois.close(); | |||||
} | |||||
} |
/* | |||||
* To change this license header, choose License Headers in Project Properties. | |||||
* To change this template file, choose Tools | Templates | |||||
* and open the template in the editor. | |||||
*/ | |||||
package kommunikation.transmitter; | |||||
import java.io.IOException; | |||||
import java.io.ObjectInputStream; | |||||
import java.io.ObjectOutputStream; | |||||
import java.util.logging.Logger; | |||||
import kommunikation.logger.OhmLogger; | |||||
/** | |||||
* | |||||
* @author Alexander_Christoph | |||||
*/ | |||||
public abstract class Kommunikationspartner | |||||
{ | |||||
protected static final Logger lg = OhmLogger.getLogger(); | |||||
protected int port; | |||||
protected String ip; | |||||
protected Object nachricht; | |||||
protected Figur figur; | |||||
protected ObjectInputStream in; | |||||
protected ObjectOutputStream out; | |||||
public Kommunikationspartner() | |||||
{ | |||||
port = 35000; | |||||
ip = ""; | |||||
} | |||||
public abstract void verbinde(); | |||||
public void senden(Object nachricht) | |||||
{ | |||||
try | |||||
{ | |||||
out.writeObject(nachricht); | |||||
} | |||||
catch (IOException ex) | |||||
{ | |||||
lg.severe(ex.toString()); | |||||
} | |||||
lg.info("Grafik versendet"); | |||||
} | |||||
public void empfangen() | |||||
{ | |||||
try | |||||
{ | |||||
lg.info("Warte auf Nachricht ..."); | |||||
nachricht = in.readObject(); | |||||
lg.info("Nachricht empfangen"); | |||||
} | |||||
catch (IOException | ClassNotFoundException ex) | |||||
{ | |||||
lg.severe(ex.toString()); | |||||
} | |||||
} | |||||
public Object getNachricht() | |||||
{ | |||||
return nachricht; | |||||
} | |||||
public void setPort(int port) | |||||
{ | |||||
this.port = port; | |||||
lg.info("Port auf " + port + " gesetzt" ); | |||||
} | |||||
public void setIp(String ip) | |||||
{ | |||||
this.ip = ip; | |||||
lg.info("Ip auf " + ip + " gesetzt" ); | |||||
} | |||||
} |
/* | |||||
* To change this license header, choose License Headers in Project Properties. | |||||
* To change this template file, choose Tools | Templates | |||||
* and open the template in the editor. | |||||
*/ | |||||
package kommunikation.transmitter; | |||||
import java.io.BufferedInputStream; | |||||
import java.io.BufferedOutputStream; | |||||
import java.io.IOException; | |||||
import java.io.ObjectInputStream; | |||||
import java.io.ObjectOutputStream; | |||||
import java.net.ServerSocket; | |||||
import java.net.Socket; | |||||
import static kommunikation.transmitter.Kommunikationspartner.lg; | |||||
/** | |||||
* | |||||
* @author Alexander_Christoph | |||||
*/ | |||||
public class Server extends Kommunikationspartner | |||||
{ | |||||
public Server() | |||||
{ | |||||
lg.info("Server erstellt"); | |||||
} | |||||
@Override | |||||
public void verbinde() | |||||
{ | |||||
try | |||||
{ | |||||
ServerSocket sSocket = new ServerSocket(port); | |||||
lg.info("Server: Warte auf Verbindung ..."); | |||||
Socket s = sSocket.accept(); | |||||
lg.info("Server: Verbindung akzeptiert"); | |||||
out = new ObjectOutputStream(s.getOutputStream()); | |||||
in = new ObjectInputStream(s.getInputStream()); | |||||
} | |||||
catch (IOException ex) | |||||
{ | |||||
lg.severe(ex.toString()); | |||||
} | |||||
} | |||||
} |
/* | |||||
* To change this license header, choose License Headers in Project Properties. | |||||
* To change this template file, choose Tools | Templates | |||||
* and open the template in the editor. | |||||
*/ | |||||
package kommunikation.transmitter; | |||||
import java.util.Observable; | |||||
import java.util.logging.Logger; | |||||
import javax.swing.JOptionPane; | |||||
import kommunikation.logger.OhmLogger; | |||||
/** | |||||
* | |||||
* @author Alexander_Christoph | |||||
*/ | |||||
public class Transmitter extends Observable implements Runnable | |||||
{ | |||||
protected static final Logger lg = OhmLogger.getLogger(); | |||||
private Kommunikationspartner kom; | |||||
private Boolean verbindung; | |||||
private Thread thd; | |||||
public Transmitter(int modus) | |||||
{ | |||||
if (modus == 0) | |||||
{ | |||||
kom = new Client(); | |||||
} | |||||
if (modus == 1) | |||||
{ | |||||
kom = new Server(); | |||||
} | |||||
verbindung = false; | |||||
thd = null; | |||||
} | |||||
public void start() | |||||
{ | |||||
if (thd == null) | |||||
{ | |||||
thd = new Thread(this); | |||||
thd.start(); | |||||
} | |||||
} | |||||
@Override | |||||
public void run() | |||||
{ | |||||
while (true) | |||||
{ | |||||
if (!verbindung) | |||||
{ | |||||
kom.verbinde(); | |||||
verbindung = true; | |||||
} | |||||
synchronized (this) | |||||
{ | |||||
kom.empfangen(); | |||||
} | |||||
lg.info("empfangen"); | |||||
this.setChanged(); | |||||
this.notifyObservers(); | |||||
} | |||||
} | |||||
public void setIpPort(String ip, int port) | |||||
{ | |||||
kom.setPort(port); | |||||
kom.setIp(ip); | |||||
} | |||||
public void senden(Object nachricht) | |||||
{ | |||||
if (verbindung) | |||||
{ | |||||
kom.senden(nachricht); | |||||
} | |||||
else | |||||
{ | |||||
JOptionPane.showMessageDialog(null, "Bauen Sie zuerst eine Verbindung auf", "Keine Verbindung", JOptionPane.INFORMATION_MESSAGE); | |||||
} | |||||
} | |||||
public Object getNachricht() | |||||
{ | |||||
return kom.getNachricht(); | |||||
} | |||||
} |
/* | |||||
* To change this license header, choose License Headers in Project Properties. | |||||
* To change this template file, choose Tools | Templates | |||||
* and open the template in the editor. | |||||
*/ | |||||
package kommunikation.view; | |||||
import java.awt.Color; | |||||
import java.awt.Dimension; | |||||
import java.awt.Graphics; | |||||
import java.awt.Graphics2D; | |||||
import java.awt.Point; | |||||
import java.awt.geom.Line2D; | |||||
import java.awt.geom.Rectangle2D; | |||||
import java.awt.print.PageFormat; | |||||
import java.awt.print.Printable; | |||||
import java.awt.print.PrinterException; | |||||
import java.awt.print.PrinterJob; | |||||
import java.util.logging.Logger; | |||||
import javax.print.attribute.HashPrintRequestAttributeSet; | |||||
import javax.print.attribute.standard.DialogTypeSelection; | |||||
import javax.swing.JComponent; | |||||
import javax.swing.JOptionPane; | |||||
import kommunikation.transmitter.Figur; | |||||
import kommunikation.transmitter.GrafikModel; | |||||
/** | |||||
* | |||||
* @author le | |||||
*/ | |||||
public class GrafikView extends JComponent implements Printable | |||||
{ | |||||
private final static Dimension EINS = new Dimension(1, 1); | |||||
private final static Logger lg = Logger.getLogger("mvcGrafik"); | |||||
private Rectangle2D.Float pixel; | |||||
private Line2D.Float linie; | |||||
private GrafikModel model; | |||||
public GrafikView() | |||||
{ | |||||
pixel = new Rectangle2D.Float(); | |||||
linie = new Line2D.Float(); | |||||
this.setBackground(Color.WHITE); | |||||
} | |||||
public void setModel(GrafikModel model) | |||||
{ | |||||
this.model = model; | |||||
} | |||||
public void drawPoint(Point p) | |||||
{ | |||||
Graphics2D g2 = (Graphics2D) this.getGraphics(); | |||||
pixel.setFrame(p, EINS); | |||||
g2.draw(pixel); | |||||
g2.dispose(); // VERY, VERY WICHTIG | |||||
} | |||||
@Override | |||||
public void paintComponent(Graphics g) | |||||
{ | |||||
if (model == null) | |||||
{ | |||||
lg.severe("keine Referenz auf Model vorhanden"); | |||||
return; | |||||
} | |||||
super.paintComponent(g); | |||||
Graphics2D g2 = (Graphics2D) g; | |||||
Point zwischenSpeicher = new Point(); | |||||
for (Figur f : model.getFigur()) | |||||
{ | |||||
g2.setColor(Color.BLACK); | |||||
Boolean first = true; | |||||
for (Point p : f.getPunkte()) | |||||
{ | |||||
pixel.setFrame(p, EINS); | |||||
g2.draw(pixel); | |||||
if(!first) | |||||
{ | |||||
linie.setLine(zwischenSpeicher, p); | |||||
g2.draw(linie); | |||||
} | |||||
zwischenSpeicher = p; | |||||
first = false; | |||||
} | |||||
} | |||||
for (Figur f : model.getFigurFremd()) | |||||
{ | |||||
Boolean first = true; | |||||
g2.setColor(Color.RED); | |||||
for (Point p : f.getPunkte()) | |||||
{ | |||||
pixel.setFrame(p, EINS); | |||||
g2.draw(pixel); | |||||
if(!first) | |||||
{ | |||||
linie.setLine(zwischenSpeicher, p); | |||||
g2.draw(linie); | |||||
} | |||||
zwischenSpeicher = p; | |||||
first = false; | |||||
} | |||||
} | |||||
} | |||||
public void line(Point p1, Point p2) | |||||
{ | |||||
Graphics2D g2 = (Graphics2D) this.getGraphics(); | |||||
Line2D.Float lin = new Line2D.Float(p1, p2); | |||||
g2.draw(lin); | |||||
g2.dispose(); | |||||
} | |||||
public void doPrint() | |||||
{ | |||||
HashPrintRequestAttributeSet printSet = | |||||
new HashPrintRequestAttributeSet(); | |||||
printSet.add(DialogTypeSelection.NATIVE); | |||||
PrinterJob pj = PrinterJob.getPrinterJob(); | |||||
pj.setPrintable(this); | |||||
// Druckdialog | |||||
if (pj.printDialog(printSet)) | |||||
{ | |||||
try | |||||
{ | |||||
pj.print(printSet); | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
JOptionPane.showMessageDialog(this, ex.toString()); | |||||
} | |||||
} | |||||
} | |||||
@Override | |||||
public int print(Graphics gp, PageFormat pf, int pageIndex) throws PrinterException | |||||
{ | |||||
Graphics2D g2p = (Graphics2D) gp; | |||||
Logger lg = Logger.getLogger("mvcGrafik"); | |||||
lg.info("pgIndex: " + Integer.toString(pageIndex)); | |||||
if (pageIndex == 0) | |||||
{ | |||||
g2p.translate(pf.getImageableX(), pf.getImageableY()); | |||||
g2p.scale(pf.getImageableWidth()/this.getWidth(), | |||||
pf.getImageableHeight() / this.getHeight()); | |||||
super.print(g2p); | |||||
lg.info("Druck ist möglich"); | |||||
return Printable.PAGE_EXISTS; | |||||
} | |||||
else | |||||
{ | |||||
lg.info("Druck ist unmöglich"); | |||||
return Printable.NO_SUCH_PAGE; | |||||
} | |||||
} | |||||
} |
<?xml version="1.0" encoding="UTF-8" ?> | |||||
<Form version="1.3" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JFrameFormInfo"> | |||||
<Properties> | |||||
<Property name="defaultCloseOperation" type="int" value="3"/> | |||||
<Property name="title" type="java.lang.String" value="Client"/> | |||||
</Properties> | |||||
<SyntheticProperties> | |||||
<SyntheticProperty name="formSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,2,119,0,0,3,37"/> | |||||
<SyntheticProperty name="formSizePolicy" type="int" value="0"/> | |||||
<SyntheticProperty name="generateSize" type="boolean" value="true"/> | |||||
<SyntheticProperty name="generateCenter" type="boolean" value="true"/> | |||||
</SyntheticProperties> | |||||
<AuxValues> | |||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/> | |||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/> | |||||
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/> | |||||
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/> | |||||
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/> | |||||
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/> | |||||
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/> | |||||
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/> | |||||
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/> | |||||
</AuxValues> | |||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/> | |||||
<SubComponents> | |||||
<Component class="javax.swing.JTextField" name="tfMessage"> | |||||
<Properties> | |||||
<Property name="text" type="java.lang.String" value="Nachricht"/> | |||||
<Property name="toolTipText" type="java.lang.String" value=""/> | |||||
</Properties> | |||||
<Constraints> | |||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription"> | |||||
<BorderConstraints direction="Last"/> | |||||
</Constraint> | |||||
</Constraints> | |||||
</Component> | |||||
<Container class="javax.swing.JPanel" name="pnlConnect"> | |||||
<Constraints> | |||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription"> | |||||
<BorderConstraints direction="First"/> | |||||
</Constraint> | |||||
</Constraints> | |||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignFlowLayout"/> | |||||
<SubComponents> | |||||
<Component class="javax.swing.JLabel" name="lblPort"> | |||||
<Properties> | |||||
<Property name="text" type="java.lang.String" value="PORT"/> | |||||
</Properties> | |||||
</Component> | |||||
<Component class="javax.swing.JTextField" name="tfPort"> | |||||
<Properties> | |||||
<Property name="columns" type="int" value="6"/> | |||||
<Property name="text" type="java.lang.String" value="port"/> | |||||
</Properties> | |||||
</Component> | |||||
<Component class="javax.swing.JLabel" name="lblIp"> | |||||
<Properties> | |||||
<Property name="text" type="java.lang.String" value="IP_ADRESSE"/> | |||||
</Properties> | |||||
</Component> | |||||
<Component class="javax.swing.JTextField" name="tfIp"> | |||||
<Properties> | |||||
<Property name="columns" type="int" value="15"/> | |||||
<Property name="text" type="java.lang.String" value="ip-Adresse"/> | |||||
</Properties> | |||||
</Component> | |||||
<Component class="javax.swing.JButton" name="btnConnect"> | |||||
<Properties> | |||||
<Property name="text" type="java.lang.String" value="Connect"/> | |||||
</Properties> | |||||
</Component> | |||||
</SubComponents> | |||||
</Container> | |||||
<Container class="javax.swing.JPanel" name="pnlChat"> | |||||
<Constraints> | |||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription"> | |||||
<BorderConstraints direction="Center"/> | |||||
</Constraint> | |||||
</Constraints> | |||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridLayout"> | |||||
<Property name="columns" type="int" value="2"/> | |||||
<Property name="rows" type="int" value="0"/> | |||||
</Layout> | |||||
<SubComponents> | |||||
<Container class="javax.swing.JScrollPane" name="jScrollPane2"> | |||||
<AuxValues> | |||||
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/> | |||||
</AuxValues> | |||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/> | |||||
<SubComponents> | |||||
<Component class="javax.swing.JTextArea" name="taChat"> | |||||
<Properties> | |||||
<Property name="columns" type="int" value="20"/> | |||||
<Property name="rows" type="int" value="5"/> | |||||
</Properties> | |||||
</Component> | |||||
</SubComponents> | |||||
</Container> | |||||
<Container class="kommunikation.view.GrafikView" name="grafikViewChat"> | |||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout"> | |||||
<Property name="useNullLayout" type="boolean" value="true"/> | |||||
</Layout> | |||||
</Container> | |||||
</SubComponents> | |||||
</Container> | |||||
</SubComponents> | |||||
</Form> |
/* | |||||
* To change this license header, choose License Headers in Project Properties. | |||||
* To change this template file, choose Tools | Templates | |||||
* and open the template in the editor. | |||||
*/ | |||||
package kommunikation.view; | |||||
/** | |||||
* | |||||
* @author Alexander_Christoph | |||||
*/ | |||||
public class ViewChat extends javax.swing.JFrame | |||||
{ | |||||
/** | |||||
* @return the grafikViewChat | |||||
*/ | |||||
public kommunikation.view.GrafikView getGrafikViewChat() | |||||
{ | |||||
return grafikViewChat; | |||||
} | |||||
/** | |||||
* @return the btnConnect | |||||
*/ | |||||
public javax.swing.JButton getBtnConnect() | |||||
{ | |||||
return btnConnect; | |||||
} | |||||
/** | |||||
* @return the taChat | |||||
*/ | |||||
public javax.swing.JTextArea getTaChat() | |||||
{ | |||||
return taChat; | |||||
} | |||||
/** | |||||
* @return the tfIp | |||||
*/ | |||||
public javax.swing.JTextField getTfIp() | |||||
{ | |||||
return tfIp; | |||||
} | |||||
/** | |||||
* @return the tfMessage | |||||
*/ | |||||
public javax.swing.JTextField getTfMessage() | |||||
{ | |||||
return tfMessage; | |||||
} | |||||
/** | |||||
* @return the tfPort | |||||
*/ | |||||
public javax.swing.JTextField getTfPort() | |||||
{ | |||||
return tfPort; | |||||
} | |||||
/** | |||||
* Creates new form ViewServer | |||||
*/ | |||||
public ViewChat() | |||||
{ | |||||
initComponents(); | |||||
} | |||||
/** | |||||
* This method is called from within the constructor to initialize the form. | |||||
* WARNING: Do NOT modify this code. The content of this method is always | |||||
* regenerated by the Form Editor. | |||||
*/ | |||||
@SuppressWarnings("unchecked") | |||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents | |||||
private void initComponents() | |||||
{ | |||||
tfMessage = new javax.swing.JTextField(); | |||||
pnlConnect = new javax.swing.JPanel(); | |||||
lblPort = new javax.swing.JLabel(); | |||||
tfPort = new javax.swing.JTextField(); | |||||
lblIp = new javax.swing.JLabel(); | |||||
tfIp = new javax.swing.JTextField(); | |||||
btnConnect = new javax.swing.JButton(); | |||||
pnlChat = new javax.swing.JPanel(); | |||||
jScrollPane2 = new javax.swing.JScrollPane(); | |||||
taChat = new javax.swing.JTextArea(); | |||||
grafikViewChat = new kommunikation.view.GrafikView(); | |||||
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); | |||||
setTitle("Client"); | |||||
tfMessage.setText("Nachricht"); | |||||
tfMessage.setToolTipText(""); | |||||
getContentPane().add(tfMessage, java.awt.BorderLayout.PAGE_END); | |||||
lblPort.setText("PORT"); | |||||
pnlConnect.add(lblPort); | |||||
tfPort.setColumns(6); | |||||
tfPort.setText("port"); | |||||
pnlConnect.add(tfPort); | |||||
lblIp.setText("IP_ADRESSE"); | |||||
pnlConnect.add(lblIp); | |||||
tfIp.setColumns(15); | |||||
tfIp.setText("ip-Adresse"); | |||||
pnlConnect.add(tfIp); | |||||
btnConnect.setText("Connect"); | |||||
pnlConnect.add(btnConnect); | |||||
getContentPane().add(pnlConnect, java.awt.BorderLayout.PAGE_START); | |||||
pnlChat.setLayout(new java.awt.GridLayout(0, 2)); | |||||
taChat.setColumns(20); | |||||
taChat.setRows(5); | |||||
jScrollPane2.setViewportView(taChat); | |||||
pnlChat.add(jScrollPane2); | |||||
pnlChat.add(grafikViewChat); | |||||
getContentPane().add(pnlChat, java.awt.BorderLayout.CENTER); | |||||
setSize(new java.awt.Dimension(805, 631)); | |||||
setLocationRelativeTo(null); | |||||
}// </editor-fold>//GEN-END:initComponents | |||||
/** | |||||
* @param args the command line arguments | |||||
*/ | |||||
public static void main(String args[]) | |||||
{ | |||||
/* Set the Nimbus look and feel */ | |||||
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> | |||||
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. | |||||
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html | |||||
*/ | |||||
try | |||||
{ | |||||
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) | |||||
{ | |||||
if ("Nimbus".equals(info.getName())) | |||||
{ | |||||
javax.swing.UIManager.setLookAndFeel(info.getClassName()); | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
catch (ClassNotFoundException ex) | |||||
{ | |||||
java.util.logging.Logger.getLogger(ViewChat.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); | |||||
} | |||||
catch (InstantiationException ex) | |||||
{ | |||||
java.util.logging.Logger.getLogger(ViewChat.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); | |||||
} | |||||
catch (IllegalAccessException ex) | |||||
{ | |||||
java.util.logging.Logger.getLogger(ViewChat.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); | |||||
} | |||||
catch (javax.swing.UnsupportedLookAndFeelException ex) | |||||
{ | |||||
java.util.logging.Logger.getLogger(ViewChat.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); | |||||
} | |||||
//</editor-fold> | |||||
//</editor-fold> | |||||
//</editor-fold> | |||||
//</editor-fold> | |||||
/* Create and display the form */ | |||||
java.awt.EventQueue.invokeLater(new Runnable() | |||||
{ | |||||
public void run() | |||||
{ | |||||
new ViewChat().setVisible(true); | |||||
} | |||||
}); | |||||
} | |||||
// Variables declaration - do not modify//GEN-BEGIN:variables | |||||
private javax.swing.JButton btnConnect; | |||||
private kommunikation.view.GrafikView grafikViewChat; | |||||
private javax.swing.JScrollPane jScrollPane2; | |||||
private javax.swing.JLabel lblIp; | |||||
private javax.swing.JLabel lblPort; | |||||
private javax.swing.JPanel pnlChat; | |||||
private javax.swing.JPanel pnlConnect; | |||||
private javax.swing.JTextArea taChat; | |||||
private javax.swing.JTextField tfIp; | |||||
private javax.swing.JTextField tfMessage; | |||||
private javax.swing.JTextField tfPort; | |||||
// End of variables declaration//GEN-END:variables | |||||
} |