作为研讨会,我被要求在文件上实施电话簿并使用设计模式。我选择了观察者。该实现是客户端 - 服务器。我创建了一个管理文件的服务器类。客户端与服务器通信,并且客户端线程注册到观察者。我的目标是每当有文件更新(删除,添加等)时,所有客户端的GUI刷新。 我想帮忙。
服务器类:
public class Server extends Application implements Observer {
//implements Observer
private TextArea ta = new TextArea();
private int clientNo = 0;
private int flag = 0;
private int lockId;
private RandomAccessFile raf;
@SuppressWarnings("rawtypes")
private ArrayList<HandleAClient> clients;
private HandleAClient clientThread;
//Specify the size of five string fields in the record
final static int NAME_SIZE = 32;
final static int STREET_SIZE = 32;
final static int CITY_SIZE = 20;
final static int STATE_SIZE = 2;
final static int ZIP_SIZE = 5;
final static int RECORD_SIZE = (NAME_SIZE + STREET_SIZE
+ CITY_SIZE + STATE_SIZE + ZIP_SIZE);
private int[] fromToSortChoices =
{ 0, NAME_SIZE, NAME_SIZE + STREET_SIZE ,
NAME_SIZE + STREET_SIZE + CITY_SIZE ,
NAME_SIZE + STREET_SIZE + CITY_SIZE + STATE_SIZE,
NAME_SIZE + STREET_SIZE + CITY_SIZE + STATE_SIZE + ZIP_SIZE
};
private Socket socket;
private ServerSocket serverSocket;
final static String fileName0 = "address0";
public static void main(String[] args)
{ launch(args);
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public void start(Stage primaryStage){
// Open or create a random access file
try
{
raf = new RandomAccessFile(fileName0 + ".dat", "rw");
raf.setLength(0);
this.clients = new ArrayList<Server.HandleAClient>();
}
catch (IOException e1)
{ System.out.print("Error: " + e1);
System.exit(0);
}
// Create a scene and place it in the stage
Scene scene = new Scene(new ScrollPane(ta), 450, 200);
primaryStage.setTitle("Server"); // Set the stage title
primaryStage.setScene(scene); // Place the scene in the stage
primaryStage.show(); // Display the stage
primaryStage.setAlwaysOnTop(true);
primaryStage.setOnCloseRequest(e->{
try{
socket.close();
serverSocket.close();
Platform.exit();
System.exit(0);
}
catch(Exception e1){
}});
new Thread( () ->{
try {
serverSocket = new ServerSocket(8000);
Platform.runLater(() ->
ta.appendText("Server started at " + new Date() + '\n'));
while(true){
socket = serverSocket.accept();
clientNo++;
Platform.runLater(() ->
ta.appendText("Starting thread for client " + clientNo + " at " + new Date() + '\n'));
InetAddress clientInetAddress = socket.getInetAddress();
Platform.runLater(() ->{
ta.appendText("Client " + clientNo + "'s host name is " + clientInetAddress.getHostName() + "\n");
ta.appendText("Client " + clientNo + "'s IP Address is " + clientInetAddress.getHostAddress() + "\n");
});
clientThread =
new HandleAClient(socket,clientNo);
Thread t = new Thread(clientThread);
clientThread.addObserver(Server.this);
clients.add(clientThread);
t.start();
}
}
catch(IOException ex) {
System.err.println(ex);
}
}).start();
}
class HandleAClient extends Observable implements Runnable {
//extends Observable
private Socket connectToClient;
private int id;
private long currentPosition = 0;
DataInputStream FromClient;
DataOutputStream ToClient;
public HandleAClient(Socket socket,int id) {
this.connectToClient = socket;
this.id = id;
}
public void run() {
try {
// Create data input and output streams
FromClient =
new DataInputStream(connectToClient.getInputStream());
ToClient =
new DataOutputStream(connectToClient.getOutputStream());
currentPosition = raf.getFilePointer();
ToClient.writeLong(currentPosition);
long fromPosition = raf.getFilePointer() - 2 * RECORD_SIZE;
long numberOfRecordsToCopy =
(raf.length()- fromPosition) / (2 * RECORD_SIZE);
long numberOfRecords;
while (true) {
System.out.println("server wait");
// synchronized (Thread.class) {
ToClient.writeLong(raf.length());
ToClient.flush();
String type = FromClient.readUTF();
switch (type) {
case ("Clear"):
{
raf.setLength(0);
setChanged();
notifyObservers();
}
break;
case ("Add"):
{
writeAddress(raf.length());
//currentPosition = raf.getFilePointer();
setChanged();
notifyObservers();
ToClient.writeLong(currentPosition);
}
break;
case ("First"):
{
System.out.println("server start first");
if (raf.length() > 0) readAddress(0);
currentPosition = raf.getFilePointer();
ToClient.writeLong(currentPosition);
System.out.println("server done first");
}
break;
case ("Next"):
{
currentPosition = FromClient.readLong();
if (currentPosition < raf.length()) {
readAddress(currentPosition);}
currentPosition = raf.getFilePointer();
ToClient.writeLong(currentPosition);
}
break;
case ("Previous"):
{
currentPosition = FromClient.readLong();
if (currentPosition - 2 * 2 * RECORD_SIZE > 0)
readAddress(currentPosition - 2 * 2 * RECORD_SIZE);
else if (raf.length() > 0) readAddress(0);
currentPosition = raf.getFilePointer();
ToClient.writeLong(currentPosition);
}
break;
case ("Last"):
{
long lastPosition = raf.length();
ToClient.writeLong(lastPosition);
if (lastPosition > 0)
readAddress(lastPosition - 2 * RECORD_SIZE);
currentPosition = raf.getFilePointer();
ToClient.writeLong(currentPosition);
}
break;
case ("Midst"):
{
numberOfRecords = (raf.length()) / (2 * RECORD_SIZE);
ToClient.writeLong(numberOfRecords);
if (numberOfRecords > 0)
readAddress((numberOfRecords/2)*(2*RECORD_SIZE));
currentPosition = raf.getFilePointer();
ToClient.writeLong(currentPosition);
}
break;
case "Update":
{
currentPosition = FromClient.readLong();
if (currentPosition > 0) {
currentPosition = currentPosition - 2*RECORD_SIZE;
ToClient.writeLong(currentPosition);}
writeAddress(currentPosition);
//currentPosition = raf.getFilePointer();
setChanged();
notifyObservers();
ToClient.writeLong(currentPosition);
}
break;
case "Delete":
{
currentPosition = FromClient.readLong();
numberOfRecords = (raf.length()) / (2 * RECORD_SIZE);
ToClient.writeLong(numberOfRecords);
if (numberOfRecords == 0) {
currentPosition = raf.getFilePointer();
ToClient.writeLong(currentPosition);
return;
}
else if (numberOfRecords == 1)
{
raf.setLength(0);
currentPosition = raf.getFilePointer();
ToClient.writeLong(currentPosition);
return;
}
fromPosition = currentPosition;
long toPosition = fromPosition - 2*RECORD_SIZE;
numberOfRecordsToCopy = (raf.length()- fromPosition) / (2 * RECORD_SIZE);
ToClient.writeLong(numberOfRecordsToCopy);
for (int i=0; i < numberOfRecordsToCopy; i++ )
{
readAddress(fromPosition);
writeAddress(toPosition);
fromPosition += 2*RECORD_SIZE;
toPosition += 2*RECORD_SIZE;
}
raf.setLength(raf.length() - 2*RECORD_SIZE);
ToClient.writeLong(raf.length());
readAddress(0);
currentPosition = raf.getFilePointer();
setChanged();
notifyObservers();
ToClient.writeLong(currentPosition);
}
break;
case "Insert":
{
currentPosition = FromClient.readLong();
if (raf.length() == 0)
{
writeAddress(raf.length());
ToClient.writeLong(raf.getFilePointer());
return;
}
fromPosition = currentPosition-2*RECORD_SIZE;
long currentFrom = raf.length() - 2*RECORD_SIZE;
numberOfRecordsToCopy = (raf.length()- fromPosition) / (2 * RECORD_SIZE);
ToClient.writeLong(numberOfRecordsToCopy);
for (int i=0; i < numberOfRecordsToCopy; i++ )
{
readAddress(currentFrom);
writeAddress(currentFrom + 2*RECORD_SIZE);
currentFrom -= 2*RECORD_SIZE;
}
writeAddress(fromPosition);
raf.setLength(raf.length() - 2*RECORD_SIZE);
readAddress(0);
currentPosition = raf.getFilePointer();
setChanged();
notifyObservers();
ToClient.writeLong(currentPosition);
}
break;
case "Duplicate":
{
numberOfRecords = (raf.length()) / (2 * RECORD_SIZE);
ToClient.writeLong(numberOfRecords);
for (int i=0; i < numberOfRecords; i++ )
{
readAddress(i*2*RECORD_SIZE);
writeAddress(raf.length());
}
if (numberOfRecords>0) readAddress(0);
setChanged();
notifyObservers();
ToClient.writeLong(currentPosition);
}
break;
case "Sort":
{
sortFile();
if (raf.length() > 0)
{
readAddress(0);
}
setChanged();
notifyObservers();
}
break;
}
//}
Platform.runLater(() ->{
ta.appendText("Done operation for client "+ this.id + "\n");
});
}
}
catch(IOException e) {
System.err.println(e);
}
}
private void sortFile() {
try {
int size = (int) (raf.length() / RECORD_SIZE / 2);
int ascORdes, from, to, idx;
raf.seek(0);
if (raf.length() == 0) return ;
ascORdes = FromClient.readBoolean() ? -1 : 1;
String fileToSort[];
fileToSort = new String[size];
for (int i = 0; i < size;i++)
{
fileToSort[i] =
FixedLengthStringIO.readFixedLengthString(RECORD_SIZE, raf);
}
idx = FromClient.readInt();
from = fromToSortChoices[idx];
to = fromToSortChoices[idx+1];
HeapSortaORd.heapSortaORd(fileToSort, ascORdes, from, to);
raf.seek(0);
for (int i = 0; i < size;i++)
{
FixedLengthStringIO.writeFixedLengthString(
fileToSort[i], RECORD_SIZE, raf);
}
}
catch (IOException e) {
e.printStackTrace();
}
}
private void readAddress(long position) {
try {
raf.seek(position);
String name =
FixedLengthStringIO.readFixedLengthString(NAME_SIZE, raf);
String street =
FixedLengthStringIO.readFixedLengthString(STREET_SIZE, raf);
String city =
FixedLengthStringIO.readFixedLengthString(CITY_SIZE, raf);
String state =
FixedLengthStringIO.readFixedLengthString(STATE_SIZE, raf);
String zip =
FixedLengthStringIO.readFixedLengthString(ZIP_SIZE, raf);
ToClient.flush();
ToClient.writeUTF(name);
ToClient.flush();
ToClient.writeUTF(street);
ToClient.flush();
ToClient.writeUTF(city);
ToClient.flush();
ToClient.writeUTF(state);
ToClient.flush();
ToClient.writeUTF(zip);
ToClient.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
private void writeAddress(long position) {
try
{ raf.seek(position);
String name = FromClient.readUTF();
String street = FromClient.readUTF();
String city = FromClient.readUTF();
String state = FromClient.readUTF();
String zip = FromClient.readUTF();
FixedLengthStringIO.writeFixedLengthString(name
== null ? " " : name, NAME_SIZE, raf);
FixedLengthStringIO.writeFixedLengthString(street
== null ? " " : street, STREET_SIZE, raf);
FixedLengthStringIO.writeFixedLengthString(city
== null ? " " : city, CITY_SIZE, raf);
FixedLengthStringIO.writeFixedLengthString(state
== null ? " " : state, STATE_SIZE, raf);
FixedLengthStringIO.writeFixedLengthString(zip
== null ? " " : zip, ZIP_SIZE, raf);
}
catch (IOException e1)
{ e1.printStackTrace();
}
}
}
@Override
public void update(Observable observable, Object object) {
this.flag = 0;
for (int i = 0; i < clients.size(); i++) {
System.out.println("File changed. Client " + clients.get(i).id + " back to first");
clients.get(i).currentPosition = 0;
}
}
}
客户端类:
public class Client extends Application
//extends Observable
{ // IO streams
DataOutputStream toServer = null;
DataInputStream fromServer = null;
Socket socket;
//Specify the size of five string fields in the record
final static int NAME_SIZE = 32;
final static int STREET_SIZE = 32;
final static int CITY_SIZE = 20;
final static int STATE_SIZE = 2;
final static int ZIP_SIZE = 5;
final static int RECORD_SIZE = (NAME_SIZE + STREET_SIZE
+ CITY_SIZE + STATE_SIZE + ZIP_SIZE);
final static String fileName0 = "address0";
// Text fields
private TextField jtfName = new TextField();
private TextField jtfStreet = new TextField();
private TextField jtfCity = new TextField();
private TextField jtfState = new TextField();
private TextField jtfZip = new TextField();
// Buttons
private Button jbtAdd = new Button("Add");
private Button jbtFirst = new Button("First");
private Button jbtNext = new Button("Next");
private Button jbtPrevious = new Button("Previous");
private Button jbtLast = new Button("Last");
private Button jbtMidst = new Button("Midst");
private Button jbtUpdate = new Button("Update");
private Button jbtDelete = new Button("Delete");
private Button jbtInsert = new Button("Insert");
private Button jbtClear = new Button("Clear");
private Button jbtDuplicate = new Button("Duplicate");
private Button jbtDoSort = new Button("Perform Sort");
private GridPane jpSortPanel;
private RadioButton jrbSortDecsend;
private RadioButton jrbSortAcsend;
private ToggleGroup bgSortType;
private ObservableList<String> sortChoices =
FXCollections.observableArrayList(
"Name", "Street", "City", "State", "Zip");
private GridPane mainPane =new GridPane();
@SuppressWarnings("rawtypes")
private ComboBox jcbSortChoices;
private DataOutputStream ToServer;
private DataInputStream FromServer;
private long fileLength;
private long currentPosition;
private long numberOfRecords;
private long numberOfRecordsToCopy;
private TextArea ta = new TextArea();
private int flag = 0;
@Override // Override the start method in the Application class
public void start(Stage primaryStage)
{
/** Make scene and add to Application **/
jtfName.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
jtfStreet.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
jtfCity.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
jtfState.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
jtfZip.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
// Panel jpAddress for holding labels & text fields
GridPane jpAddress = new GridPane();
String LabelColumn[]={"Name","Street","City"};
Label l[]=new Label[LabelColumn.length];
for(int i=0;i<LabelColumn.length;i++)
{
l[i] = new Label(LabelColumn[i]);
l[i].setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
}
jpAddress.addColumn(0,l);
// Panel jpStateZip for holding state and zip
GridPane jpStateZip = new GridPane();
jpStateZip.addRow(0, new Label("State"),jtfState,new Label("Zip"),jtfZip);
// Panel p3 for holding jtfCity and jpStateZip
GridPane p3 = new GridPane();
p3.addRow(0, jtfCity,jpStateZip);
growChildren(jpStateZip);
growChildren(p3);
jpAddress.addColumn(1, jtfName, jtfStreet,p3);
// Set the panel with line border
jpAddress.getStyleClass().add(
"{ -fx-border-color: black;-fx-border-width: 5;}");
growChildren(jpAddress);
// Add buttons to a panel
GridPane jpButton = new GridPane();
HBox hb = new HBox();
hb.getChildren().addAll(jbtAdd,jbtFirst,jbtNext,jbtPrevious,jbtLast,jbtMidst,jbtUpdate,jbtDelete,jbtInsert,jbtClear,jbtDuplicate);
jpButton.addRow(0, hb);
growChildren(jpButton);
// Add jpAddress and jpButton to the mainPane
mainPane.addColumn(0, jpAddress,jpButton,ta);
/* ============ sort Panel ============ */
jpSortPanel = new GridPane();
jrbSortAcsend = new RadioButton("Ascending");
jrbSortAcsend.setSelected(true);
jrbSortDecsend = new RadioButton("descending");
jcbSortChoices = new ComboBox<String>(sortChoices);
jcbSortChoices.getSelectionModel().selectFirst();
bgSortType = new ToggleGroup();
bgSortType.getToggles().addAll(jrbSortAcsend,jrbSortDecsend);
jpSortPanel.addColumn(0, jrbSortAcsend,jrbSortDecsend,jcbSortChoices);
growChildren(jpSortPanel);
/* ========== end of sort panel ======= */
jbtDoSort.setMaxWidth(Double.MAX_VALUE);
mainPane.addColumn(1, jpSortPanel,jbtDoSort);
growChildren(mainPane);
try {
socket = new Socket("localhost", 8000);
// Create an input stream to receive data from the server
FromServer = new DataInputStream(socket.getInputStream());
// Create an output stream to send data to the server
ToServer = new DataOutputStream(socket.getOutputStream());
currentPosition = FromServer.readLong();
primaryStage.setOnCloseRequest(e->{
try{
socket.close();
Platform.exit();
System.exit(0);
}
catch(Exception e1){
e1.printStackTrace();
}});
}
catch (IOException ex) {
ex.printStackTrace();
}
jbtClear.setOnAction(e ->
{
try {
fileLength = FromServer.readLong();
ToServer.writeUTF("Clear");
clearTextFields();
currentPosition = 0;
} catch (Exception e1) {
e1.printStackTrace();
}
System.out.println("client done clear");
});
jbtAdd.setOnAction(e ->
{
try {
fileLength = FromServer.readLong();
ToServer.writeUTF("Add");
ToServer.writeUTF(jtfName.getText());
ToServer.writeUTF(jtfStreet.getText());
ToServer.writeUTF(jtfCity.getText());
ToServer.writeUTF(jtfState.getText());
ToServer.writeUTF(jtfZip.getText());
currentPosition = FromServer.readLong();
System.out.println("client done add");
} catch (Exception e1) {
e1.printStackTrace();
}
});
jbtFirst.setOnAction(e ->
{
System.out.println("client start first");
try {
first();
System.out.println("client done first");
} catch (Exception e1) {
e1.printStackTrace();
}
});
jbtNext.setOnAction(e ->
{
try {
fileLength = FromServer.readLong();
ToServer.writeUTF("Next");
ToServer.writeLong(currentPosition);
if (currentPosition < fileLength) {
readAddress();}
currentPosition = FromServer.readLong();
System.out.println("client done next");
} catch (Exception e1) {
e1.printStackTrace();
}
});
jbtPrevious.setOnAction(e ->
{
try {
fileLength = FromServer.readLong();
ToServer.writeUTF("Previous");
ToServer.writeLong(currentPosition);
if (currentPosition - 2 * 2 * RECORD_SIZE > 0)
readAddress();
else if (fileLength > 0) readAddress();
currentPosition = FromServer.readLong();
System.out.println("client done previous");
} catch (Exception e1) {
e1.printStackTrace();
}
});
jbtLast.setOnAction(e ->
{
try {
fileLength = FromServer.readLong();
ToServer.writeUTF("Last");
long lastPosition = FromServer.readLong();
if (lastPosition > 0)
readAddress();
currentPosition = FromServer.readLong();
System.out.println("client done last");
} catch (Exception e1) {
e1.printStackTrace();
}
});
jbtMidst.setOnAction(e ->
{
try {
fileLength = FromServer.readLong();
ToServer.writeUTF("Midst");
numberOfRecords = FromServer.readLong();
if (numberOfRecords > 0)
readAddress();
currentPosition = FromServer.readLong();
System.out.println("client done midst");
} catch (Exception e1) {
e1.printStackTrace();
}
});
jbtUpdate.setOnAction(e ->
{
try {
fileLength = FromServer.readLong();
ToServer.writeUTF("Update");
ToServer.writeLong(currentPosition);
if (currentPosition > 0)
currentPosition = FromServer.readLong();
ToServer.writeUTF(jtfName.getText());
ToServer.writeUTF(jtfStreet.getText());
ToServer.writeUTF(jtfCity.getText());
ToServer.writeUTF(jtfState.getText());
ToServer.writeUTF(jtfZip.getText());
currentPosition = FromServer.readLong();
System.out.println("client done update");
} catch (Exception e1) {
e1.printStackTrace();
}
});
jbtDelete.setOnAction(e ->
{ try {
fileLength = FromServer.readLong();
ToServer.writeUTF("Delete");
ToServer.writeLong(currentPosition);
numberOfRecords = FromServer.readLong();
if (numberOfRecords == 0) {
currentPosition = FromServer.readLong();
return;
}
else if (numberOfRecords == 1)
{
clearTextFields();
currentPosition = FromServer.readLong();
return;
}
numberOfRecordsToCopy = FromServer.readLong();
for (int i=0; i < numberOfRecordsToCopy; i++ )
{
readAddress();
ToServer.writeUTF(jtfName.getText());
ToServer.writeUTF(jtfStreet.getText());
ToServer.writeUTF(jtfCity.getText());
ToServer.writeUTF(jtfState.getText());
ToServer.writeUTF(jtfZip.getText());
}
fileLength = FromServer.readLong();
readAddress();
currentPosition = FromServer.readLong();
System.out.println("client done delete");
}catch (Exception e1) {
e1.printStackTrace();
}
});
jbtInsert.setOnAction(e ->
{
try {
fileLength = FromServer.readLong();
ToServer.writeUTF("Insert");
ToServer.writeLong(currentPosition);
if (fileLength == 0)
{
ToServer.writeUTF(jtfName.getText());
ToServer.writeUTF(jtfStreet.getText());
ToServer.writeUTF(jtfCity.getText());
ToServer.writeUTF(jtfState.getText());
ToServer.writeUTF(jtfZip.getText());
currentPosition = FromServer.readLong();
System.out.println("client done insert");
return;
}
String recordToInsert[] = { jtfName.getText(), jtfStreet.getText(), jtfCity.getText(),
jtfState.getText(), jtfZip.getText()};
numberOfRecordsToCopy = FromServer.readLong();
for (int i=0; i < numberOfRecordsToCopy; i++ )
{
readAddress();
ToServer.writeUTF(jtfName.getText());
ToServer.writeUTF(jtfStreet.getText());
ToServer.writeUTF(jtfCity.getText());
ToServer.writeUTF(jtfState.getText());
ToServer.writeUTF(jtfZip.getText());
}
//readAddress();
jtfName.setText(recordToInsert[0]);
jtfStreet.setText(recordToInsert[1]);
jtfCity.setText(recordToInsert[2]);
jtfState.setText(recordToInsert[3]);
jtfZip.setText(recordToInsert[4]);
ToServer.writeUTF(jtfName.getText());
ToServer.writeUTF(jtfStreet.getText());
ToServer.writeUTF(jtfCity.getText());
ToServer.writeUTF(jtfState.getText());
ToServer.writeUTF(jtfZip.getText());
readAddress();
currentPosition = FromServer.readLong();
System.out.println("client done insert");
} catch (Exception e1) {
e1.printStackTrace();
}
});
jbtDuplicate.setOnAction(e ->
{
try {
fileLength = FromServer.readLong();
ToServer.writeUTF("Duplicate");
//ToServer.writeLong(currentPosition);
numberOfRecords = FromServer.readLong();
for (int i=0; i < numberOfRecords; i++ )
{
readAddress();
ToServer.writeUTF(jtfName.getText());
ToServer.writeUTF(jtfStreet.getText());
ToServer.writeUTF(jtfCity.getText());
ToServer.writeUTF(jtfState.getText());
ToServer.writeUTF(jtfZip.getText());
}
if (numberOfRecords>0) readAddress();
currentPosition = FromServer.readLong();
System.out.println("client done duplicate");
} catch (Exception e1) {
e1.printStackTrace();
}
});
jbtDoSort.setOnAction(e ->
{
try {
fileLength = FromServer.readLong();
ToServer.writeUTF("Sort");
ToServer.writeBoolean(jrbSortDecsend.isSelected());
ToServer.writeInt(jcbSortChoices.getSelectionModel().getSelectedIndex());
} catch (Exception e1) {
e1.printStackTrace();
}
if (fileLength > 0) readAddress();
System.out.println("client done sort");
});
/** Add to details and run Application **/
Scene scene = new Scene (mainPane, -100, -100);
primaryStage.setTitle("Complex Address System"); // Set the window title
primaryStage.setScene(scene); // Place the scene in the window
primaryStage.setAlwaysOnTop(true);
primaryStage.show(); // Display the window
primaryStage.setOnCloseRequest( new EventHandler<WindowEvent>(){
public void handle(WindowEvent event){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
System.exit(0);
}
});
}
private void first() {
try {
fileLength = FromServer.readLong();
ToServer.writeUTF("First");
ToServer.flush();
if (fileLength > 0) readAddress();
currentPosition = FromServer.readLong();
} catch (Exception e1) {
e1.printStackTrace();
}
}
@SuppressWarnings("static-access")
private void growChildren(GridPane pane)
{ pane.getChildren().forEach(chiled ->
{ pane.setHgrow(chiled, Priority.ALWAYS);
pane.setVgrow(chiled, Priority.ALWAYS);
});
}
private void readAddress() {
try {
String name = FromServer.readUTF();
String street = FromServer.readUTF();
String city = FromServer.readUTF();
String state = FromServer.readUTF();
String zip = FromServer.readUTF();
jtfName.setText(name);
jtfStreet.setText(street);
jtfCity.setText(city);
jtfState.setText(state);
jtfZip.setText(zip);
} catch (IOException e) {
e.printStackTrace();
}
}
private void clearTextFields() {
jtfName.setText(null);
jtfStreet.setText(null);
jtfCity.setText(null);
jtfState.setText(null);
jtfZip.setText(null);
}
public static void main(String[] args)
{ launch(args);
}
}