Я предполагаю, что вы хотели сказать:
Пользовательский интерфейс должен функционировать, пока программа проверяет 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: совместимость