в надежде, что кто-то может помочь с этим, так как он сейчас жарит мой мозг.Я новичок в RMI, так что это может быть основной любительской ошибкой.
Итак, у меня есть многоуровневая система, в которой пользовательский интерфейс создает интерфейс для прикладного уровня и вызывает функцию getRecord, используя RMI.Это, в свою очередь, создает интерфейс для уровня данных, который извлекает информацию из базы данных, возвращая ее в appLayer, который возвращает ее пользовательскому интерфейсу.Это отлично работает, и JTextFields обновляются отлично.
Проблема в том, что когда я пытаюсь отправить эту информацию обратно через applayer в другой интерфейс.Когда он достигает нового интерфейса, я могу вывести информацию на консоль, но он НЕ БУДЕТ обновлять JTextFields на этом интерфейсе, и я не могу понять, почему бы и нет.
Мой основной интерфейс:
IPatientRecord testRecord;
IAppLayer appLayer;
public class MainOffice extends JFrame {
private JPanel MainPanel;
private JPanel Background;
private JPanel TopPanel;
private JPanel LeftPanel;
private JPanel RightPanel;
private JTextField searchTextBox;
private JButton searchButton;
private JTextField NHSRegistrationNoTextField;
private JTextField patientNameTextField;
private JTextField addressTextField;
private JTextField postCodeTextField;
private JTextField conditionTextField;
private JButton confirmAndSendButton;
public MainOffice() {
add(MainPanel);
setSize(400, 400);
try {
Registry patientRegistry = LocateRegistry.getRegistry(1096);
Registry registry = LocateRegistry.getRegistry(1099);
testRecord = (IPatientRecord) patientRegistry.lookup("patientRecord");
appLayer = (IAppLayer) registry.lookup("appLayer");
System.out.println("Patient Record Interface Ready");
}
catch (Exception ex) {
System.out.println("Exception Creating Patient Record Interface: " + ex.getMessage());
}
searchButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
testRecord = appLayer.getPatientRecord(Integer.parseInt(searchTextBox.getText()));
System.out.println("Test Record " + testRecord.getName());
updateForm();
System.out.println("Patient returned to Main Office " + testRecord.getName());
}
catch (Exception ex) {
System.out.println("Exception in Search Button: " + ex.getMessage());
}
}
});
confirmAndSendButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
System.out.println("Patient: " + testRecord.getName());
System.out.println("Confirm and send pressed/nDetails sent: " + testRecord.getName());
appLayer.sendToAmbulance(testRecord);
}
catch (Exception ex) {
System.out.println("confirm and Send Exception: " + ex.getMessage());
}
}
});
}
public void updateForm() {
try{
NHSRegistrationNoTextField.setText(String.valueOf(testRecord.getNhsRegistrationNo()));
patientNameTextField.setText(testRecord.getName());
addressTextField.setText(testRecord.getAddress());
postCodeTextField.setText(testRecord.getPostCode());
conditionTextField.setText(testRecord.getCondition());
}
catch (RemoteException rex) {
System.out.println("Update form exception: " + rex.getMessage());
}
}
public static void main (String args[] ) {
MainOffice mainOffice = new MainOffice();
mainOffice.setVisible(true);
}
Мой приложение LAyer:
public class AppLayer implements IAppLayer {
List ambulances;
List hospitals;
Dictionary ambulanceDictionary;
IPatientRecord patientRecord;
public AppLayer() throws RemoteException{
ambulances = new ArrayList();
hospitals = new ArrayList();
ambulanceDictionary = new Hashtable();
}
@Override
public IPatientRecord getPatientRecord(int nhsNo) throws RemoteException {
try {
Registry registry = LocateRegistry.getRegistry(null,1098);
IDataLayer dataLayer = (IDataLayer) registry.lookup("dataLayer");
patientRecord = dataLayer.getPatientRecord(nhsNo);
System.out.println("Patient returned: " + patientRecord.getName());
//sendToAmbulance(patientRecord);
return patientRecord;
}
catch (Exception ex) {
System.out.println("Error in AppLayer: " + ex.getMessage() + " /n/nSee getPatientRecord in AppLayer");
return null;
}
}
Функция i Используется для отправки на другой пользовательский интерфейс: пользовательский интерфейс сначала регистрируется в приложении, используя другую функцию.При этом эта информация используется для отправки записи нужному клиенту.Интерфейс главного офиса вызывает это через интерфейс applayer
public void sendToAmbulance(IPatientRecord patientRecord) {
Enumeration keys = ambulanceDictionary.keys();
Enumeration elements = ambulanceDictionary.elements();
int port = Integer.parseInt(keys.nextElement().toString());
String callSign = ambulanceDictionary.get(port).toString();
try {
System.out.println("Searching on port: " + port);
Registry registry2 = LocateRegistry.getRegistry(port);
System.out.println("Looking up callSign: " + callSign);
System.out.println("made it here");
IAmbulance ambulance = (IAmbulance) registry2.lookup(callSign);
System.out.println("and here");
ambulance.Update(patientRecord);
System.out.println("maybe here");
if (ambulance.Update(patientRecord)){
ambulanceDictionary.remove(port);
System.out.println(callSign + "removed from list");
System.out.println("");
}
else{
System.out.println("Failed to update ambulance " + callSign);
}
}
catch (Exception ex) {
System.out.println("Exception in sendToAmbulance: " + ex.getMessage());
}
}
Вышеуказанная функция вызывает Обновление для скорой помощи
public Boolean Update(IPatientRecord patientRecord) {
try {
NHSRegistrationNoTextField.setText(String.valueOf(patientRecord.getNhsRegistrationNo()));
patientNameTextField.setText(patientRecord.getName());
addressTextField.setText(patientRecord.getAddress());
postCodeTextField.setText(patientRecord.getPostCode());
conditionTextField.setText(patientRecord.getCondition());
ReadyStatusTxt.setText("ON CALL");
return true;
}
catch (Exception ex) {
System.out.println("Exception in Update: " + ex.getMessage());
return false;
}
}
Она даже не обновляет ReadyStatusTxt.setText ("«По вызову»), но возвращает true!
Я столько всего перепробовал.Первоначально я не использовал интерфейс записи пациента между слоями, мне было лень, но я обновил его, чтобы каждый отдельный слой проходил через интерфейс пациента, и он все еще работает так же, как и раньше.
Я добавил отдельную функцию к машине скорой помощи, которая затем вызывала бы базу данных снова, извлекала бы для себя детали, а затем обновляла их, и она все равно не будет обновляться.
Это так же просто, как яне могу запустить обновление из внешнего класса
О, и еще одна вещь, если я поставлю System.out.Println (PatientRecord.getName ());в вышеупомянутой функции это печатает ******* имя, которое я хочу обновить вышеупомянутый JtextField.Я попытался сначала сохранить это в Strings, а затем добавить его в JtextField, но это тоже не работает