javafx запускается один за другим - PullRequest
0 голосов
/ 18 декабря 2018

У меня проблема с моим кодом.Одним нажатием кнопки я бы хотел определить IP-адрес, а по этому IP-адресу два последовательных IP-адреса, но я также хочу проверить, доступны ли IP-адреса.Проверка занимает несколько секунд.Я хочу, чтобы IP-адреса отображались, а проверка должна выполняться в фоновом режиме.Как я могу это сделать?

   public void GetIP() {
        String mn = tfmn.getText();
        String d = "cachea." + mn + ".de.kaufland";

        try {
            InetAddress i = InetAddress.getByName(d);
            int intIP = ByteBuffer.wrap(i.getAddress()).getInt();

            intIP += 1496;

            i = InetAddress.getByName(String.valueOf(intIP));
            String ip = i.getHostAddress();

            tfip1.setText(ip);

            //Check IP
            boolean reachable = i.isReachable(1000);
            if (reachable) {
                tfipinfo1.setText("IP-Addresse reachable");
                tfipinfo1.setStyle("-fx-text-fill: green;");
            } else {
                tfipinfo1.setText("IP-Adresse ist not reachable");
                tfipinfo1.setStyle("-fx-text-inner-color: red;");
            }

            // next IP
            intIP += 1;

            InetAddress i2 = InetAddress.getByName(String.valueOf(intIP));
            ip = i2.getHostAddress();
            tfip2.setText(ip);

            //Check IP-Address
            boolean reachable2 = i2.isReachable(1000);
            if (reachable2) {
                tfipinfo2.setText("IP-Adresse ist erreichbar");
                tfipinfo2.setStyle("-fx-text-fill: green;");
            } else {
                tfipinfo2.setText("IP-Adresse ist nicht erreichbar");
                tfipinfo2.setStyle("-fx-text-inner-color: red;");
            }

            //next IP
            intIP += 1;

            InetAddress i3 = InetAddress.getByName(String.valueOf(intIP));
            ip = i3.getHostAddress();
            tfip3.setText(ip);

            //check IP
            boolean reachable3 = i3.isReachable(1000);
            if (reachable3) {
                tfipinfo3.setText("IP-Adresse ist erreichbar");
                tfipinfo3.setStyle("-fx-text-fill: green;");
            } else {
                tfipinfo3.setText("IP-Adresse ist nicht erreichbar");
                tfipinfo3.setStyle("-fx-text-inner-color: red;");
            }

          } catch (UnknownHostException ex) {
            ex.printStackTrace();

            Alert alert = new Alert(Alert.AlertType.ERROR);
            alert.setTitle("Error");
            alert.setHeaderText(null);
            alert.setContentText("Der Markt existiert nicht!");

            alert.showAndWait();

        } catch (IOException e) {
            e.printStackTrace();
        }
}

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Я предполагаю, что вы хотели сказать:

Пользовательский интерфейс должен функционировать, пока программа проверяет IP-адреса в фоновом режиме

это сделает программу неудерживайте во время проверки IP-адресов.Это может и должно быть достигнуто с помощью отдельных потоков, так как не рекомендуется использовать основной поток JavaFX для выполнения задач, отличных от обработки пользовательского интерфейса.

Классы, необходимые для достижения параллелизма в приложениях JavaFX, представлены в javafx.concurrentпакет.Класс, который будет использоваться в этом решении - Task.Ниже приведено решение для вашего сегмента кода.

public class IPChecker extends Task<Void>{
    private final InetAddress i;
    private TextField tf;

    public IPChecker(InetAddress i,TextField tf) {
        this.i = i;
        this.tf=tf;
    }

    @Override
    protected Void call() throws Exception{
        boolean reachable = i.isReachable(1000);
        Platform.runLater(() -> {
            if (reachable) {
                tf.setText("IP-Addresse reachable");
                tf.setStyle("-fx-text-fill: green;");
            } else {
                tf.setText("IP-Adresse ist not reachable");
                tf.setStyle("-fx-text-inner-color: red;");
            }
        });
        return null;
    }
}

public void GetIP() {
    String mn = tfmn.getText();
    String d = "cachea." + mn + ".de.kaufland";

    try {
        InetAddress i = InetAddress.getByName(d);
        int intIP = ByteBuffer.wrap(i.getAddress()).getInt();

        intIP += 1496;

        i = InetAddress.getByName(String.valueOf(intIP));
        String ip = i.getHostAddress();

        tfip1.setText(ip);

        //Check IP
        Thread t1=new Thread(new IPChecker(i,tfipinfo1));
        t1.start();

        // next IP
        intIP += 1;

        InetAddress i2 = InetAddress.getByName(String.valueOf(intIP));
        ip = i2.getHostAddress();
        tfip2.setText(ip);

        //Check IP-Address
        Thread t2=new Thread(new IPChecker(i2,tfipinfo2));
        t2.start();

        //next IP
        intIP += 1;

        InetAddress i3 = InetAddress.getByName(String.valueOf(intIP));
        ip = i3.getHostAddress();
        tfip3.setText(ip);

        //check IP
        Thread t3=new Thread(new IPChecker(i3,tfipinfo3));
        t3.start();

    } catch (UnknownHostException ex) {
        ex.printStackTrace();

        Alert alert = new Alert(Alert.AlertType.ERROR);
        alert.setTitle("Error");
        alert.setHeaderText(null);
        alert.setContentText("Der Markt existiert nicht!");

        alert.showAndWait();

    } catch (IOException e) {
        e.printStackTrace();
    }
}

Я создал класс с именем IPChecker для выполнения действий, которые необходимо выполнить в фоновом режиме.Этот класс требует, чтобы вы передали объект InetAddress и TextField объекты, над которыми должна выполняться работа.

Почему этот Platform.runLater() вызывается в функции call()?

Это сделано потому, что не рекомендуется выполнять операции пользовательского интерфейса JavaFX в отдельном потоке, отличном от потока приложения JavaFX.Таким образом, чтобы убедиться, что связанные с пользовательским интерфейсом операции выполняются в потоке приложения JavaFX, мы вызываем их внутри Platform.runLater()

Ссылки

Задача - ЗадачаЧто модифицирует граф сцены

JavaFX: совместимость

0 голосов
/ 18 декабря 2018

вы делаете:

ip = i2.getHostAddress();
tfip2.setText(ip);

//Check IP-Address
boolean reachable2 = i2.isReachable(1000);

, поэтому заказ составляет

  • получить адрес
  • отображать адрес
  • проверить адрес

вам просто нужно сделать:

...
tfip1.setText(ip);

// next IP
intIP += 1;

InetAddress i2 = InetAddress.getByName(String.valueOf(intIP));
ip = i2.getHostAddress();
tfip2.setText(ip);
//Check IP
boolean reachable = i.isReachable(1000);
if (reachable) {
  tfipinfo1.setText("IP-Addresse reachable");
  tfipinfo1.setStyle("-fx-text-fill: green;");
} else {
  tfipinfo1.setText("IP-Adresse ist not reachable");
  tfipinfo1.setStyle("-fx-text-inner-color: red;");
}

//Check IP-Address
boolean reachable2 = i2.isReachable(1000);
if (reachable2) {
  tfipinfo2.setText("IP-Adresse ist erreichbar");
  tfipinfo2.setStyle("-fx-text-fill: green;");
} else {
  tfipinfo2.setText("IP-Adresse ist nicht erreichbar");
  tfipinfo2.setStyle("-fx-text-inner-color: red;");
}
...

вы также можете сделать проверку вашего IP-адреса в другой теме

у вас будет что-то вроде:

class IPChecker extends Task {
    @Override
    public Object call() throws IOException, InterruptedException{
        //your ip checker algo
        return null;
    }
}

и назовите его:

...
tfip1.setText(ip);
new Thread(new IPChecker()).start();
...

, так что ваша воля выглядит так:

public void GetIP() {
    String mn = tfmn.getText();
    String d = "cachea." + mn + ".de.kaufland";

    try {
        InetAddress i = InetAddress.getByName(d);
        int intIP = ByteBuffer.wrap(i.getAddress()).getInt();

        intIP += 1496;

        i = InetAddress.getByName(String.valueOf(intIP));
        String ip = i.getHostAddress();

        tfip1.setText(ip);

        //Check IP
        new Thread(new IPChecker1()).start();

        // next IP
        intIP += 1;

        InetAddress i2 = InetAddress.getByName(String.valueOf(intIP));
        ip = i2.getHostAddress();
        tfip2.setText(ip);

        //Check IP-Address
        new Thread(new IPChecker2()).start();

        //next IP
        intIP += 1;

        InetAddress i3 = InetAddress.getByName(String.valueOf(intIP));
        ip = i3.getHostAddress();
        tfip3.setText(ip);

        //check IP
        new Thread(new IPChecker3()).start();

      } catch (UnknownHostException ex) {
        ex.printStackTrace();

        Alert alert = new Alert(Alert.AlertType.ERROR);
        alert.setTitle("Error");
        alert.setHeaderText(null);

вы также можете определить другой конструктор для записи new IPChecker(ip1)и так далее

...