Невозможно обновить JTextField с помощью RMI - PullRequest
0 голосов
/ 22 ноября 2018

в надежде, что кто-то может помочь с этим, так как он сейчас жарит мой мозг.Я новичок в 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, но это тоже не работает

...