/* ** This file is part of Filius, a network construction and simulation software. ** ** Originally created at the University of Siegen, Institute "Didactics of ** Informatics and E-Learning" by a students' project group: ** members (2006-2007): ** André Asschoff, Johannes Bade, Carsten Dittich, Thomas Gerding, ** Nadja Haßler, Ernst Johannes Klebert, Michell Weyer ** supervisors: ** Stefan Freischlad (maintainer until 2009), Peer Stechert ** Project is maintained since 2010 by Christian Eibl <filius@c.fameibl.de> ** and Stefan Freischlad ** Filius is free software: you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation, either version 2 of the License, or ** (at your option) version 3. ** ** Filius is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ** PURPOSE. See the GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with Filius. If not, see <http://www.gnu.org/licenses/>. */ package filius.gui.anwendungssicht; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Observable; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import filius.software.clientserver.ClientBaustein; /** <p> Diese Klasse stellt die Benutzungsoberflaeche fuer das Client-Programm * einer einfachen Client-Server-Anwendung zur Verfuegung. </p> * <p> Nachrichten von der Anwendung werden nach dem Beobachtermuster durch * die Benachrichtigung der Beobachter angenommen und verarbeitet. </p> */ public class GUIApplicationClientBausteinWindow extends GUIApplicationWindow { private static final long serialVersionUID = 1L; /** * Textfeld fuer die Ausgabe gesendeter und empfangener Nachrichten sowie * fuer Fehlermeldungen */ private JTextArea taAusgabe; /** * Textfeld fuer die Adresse des Servers, zu dem die Verbindung hergestellt * werden soll */ private JTextField tfServerAdresse; /** * Textfeld zur Angabe des TCP-Ports, auf dem der Server auf eingehende * Nachrichten wartet */ private JTextField tfServerPort; /** Textbereich zur Eingabe der Nachrichten */ private JTextArea taSenden; /** Schaltflaeche zum initiieren des Verbindungsaufbaus */ private JButton btVerbinden; /** * Schaltflaeche zum Senden einer zuvor eingegebenen Nachricht */ private JButton btSenden; /** * Standard-Konstruktor, der automatisch zur Erzeugung der graphischen * Benutzungsoberflaeche fuer diese Anwendung aufgerufen wird. */ public GUIApplicationClientBausteinWindow(GUIDesktopPanel desktop, String appName) { super(desktop, appName); initialisiereKomponenten(); } /** Methode zur Initialisierung der graphischen Komponenten */ private void initialisiereKomponenten() { JPanel hauptPanel; JScrollPane scrollPane; Box hauptBox; Box hBox; JLabel label; hauptPanel = new JPanel(new BorderLayout()); hauptBox = Box.createVerticalBox(); hauptBox.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); hauptBox.add(Box.createVerticalStrut(5)); hBox = Box.createHorizontalBox(); label = new JLabel(messages.getString("clientbaustein_msg1")); label.setPreferredSize(new Dimension(100, label.getHeight())); hBox.add(label); tfServerAdresse = new JTextField(); tfServerAdresse.setPreferredSize(new Dimension(100, 20)); hBox.add(tfServerAdresse); hauptBox.add(hBox); hauptBox.add(Box.createVerticalStrut(5)); hBox = Box.createHorizontalBox(); label = new JLabel(messages.getString("clientbaustein_msg2")); label.setPreferredSize(new Dimension(100, label.getHeight())); hBox.add(label); tfServerPort = new JTextField(); tfServerPort.setPreferredSize(new Dimension(100, 20)); hBox.add(tfServerPort); hauptBox.add(hBox); hauptBox.add(Box.createVerticalStrut(5)); btVerbinden = new JButton(messages.getString("clientbaustein_msg3")); btVerbinden.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("verbinden")) { ((ClientBaustein) holeAnwendung()) .setZielIPAdresse(tfServerAdresse.getText()); ((ClientBaustein) holeAnwendung()).setZielPort(Integer .parseInt(tfServerPort.getText())); ((ClientBaustein) holeAnwendung()).verbinden(); } else { ((ClientBaustein) holeAnwendung()).trennen(); } aktualisieren(); } }); hauptBox.add(btVerbinden); hauptBox.add(Box.createVerticalStrut(5)); label = new JLabel(messages.getString("clientbaustein_msg4")); label.setPreferredSize(new Dimension(100, 20)); hauptBox.add(label); taSenden = new JTextArea(); scrollPane = new JScrollPane(taSenden); scrollPane.setPreferredSize(new Dimension(400, 50)); hauptBox.add(scrollPane); btSenden = new JButton(messages.getString("clientbaustein_msg5")); btSenden.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ((ClientBaustein) holeAnwendung()).senden(taSenden.getText()); taSenden.setText(""); } }); hauptBox.add(btSenden); hauptBox.add(Box.createVerticalStrut(5)); taAusgabe = new JTextArea(); taAusgabe.setEditable(false); scrollPane = new JScrollPane(taAusgabe); scrollPane.setPreferredSize(new Dimension(400, 200)); hauptBox.add(scrollPane); hauptBox.add(Box.createVerticalStrut(5)); hauptPanel.add(hauptBox, BorderLayout.CENTER); getContentPane().add(hauptPanel); pack(); aktualisieren(); } /** * Methode zum aktualisieren der Komponenten der graphischen * Benutzungsoberflaeche in Abhaengigkeit vom Zustand der Anwendung */ private void aktualisieren() { ClientBaustein client; client = (ClientBaustein) holeAnwendung(); tfServerAdresse.setText(client.getZielIPAdresse()); tfServerPort.setText("" + client.getZielPort()); if (client.istVerbunden()) { btVerbinden.setText(messages.getString("clientbaustein_msg6")); btVerbinden.setActionCommand("trennen"); btSenden.setEnabled(true); tfServerAdresse.setEditable(false); tfServerPort.setEditable(false); } else { btVerbinden.setText(messages.getString("clientbaustein_msg3")); btVerbinden.setActionCommand("verbinden"); btSenden.setEnabled(false); tfServerAdresse.setEditable(true); tfServerPort.setEditable(true); } } /** * Diese Methode wird automatisch ausgefuehrt, wenn eine Nachricht an * den Beobachter der Anwendung gesendet wird. Der Parameter arg enthaelt * die Nachricht, die von der Anwendung verschickt wurde. */ public void update(Observable o, Object arg) { if (arg != null) { this.taAusgabe.append(arg.toString() + "\n"); } aktualisieren(); } }