Форум программистов, компьютерный форум, киберфорум
Наши страницы
JavaFX
Войти
Регистрация
Восстановить пароль
 
AlxAbr
0 / 0 / 0
Регистрация: 05.05.2019
Сообщений: 8
1

Обращение к JavaScript из потока Java

05.05.2019, 08:45. Просмотров 474. Ответов 2

Доброго времени суток!
Уважаемые, помогите юнцу справиться с головной болью, которая возникла при использовании потоков в Java.
Суть такова, есть приложение на JavaFX, которое использует WebView и выводит мне html страничку, в которой прописана GoogleMap. Так же в этой html страничке имеется JavaScript код, который я бы хотел вызывать из своего приложения. Все работает как надо, пока я не решил воспользоваться потоком. Мне нужно примерно раз в 30сек, вызывать функции из JavaScript. Как я понял, это можно сделать либо через поток, либо через таймер. Но при таких манипуляциях выскакивает исключение. При чем обращение к скрипту работает допустим просто по нажатию кнопки, но мне нужно, что бы приложение само без моего ведома обращалась к скрипту и причем периодически. Помогите пожалуйста, весь гугл обшарил, нечего найти не смог (ну или я просто не понял, что нашел и пропустил). На код сильно не ругайтесь, я еще только учусь.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebEvent;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import netscape.javascript.JSObject;
 
import java.net.URL;
import java.util.Timer;
import java.util.TimerTask;
 
public class GoogleApp extends Application {
 
    private JSObject doc;
    private Scene scene;
    MyBrowser myBrowser;
    double lat = 55.016042;
    double lon = 82.945993;
    private Stage stage;
 
 
    public static void main(String[] args) {
        launch(args);
    }
 
    @Override
    public void start(Stage stage) throws Exception {
        this.stage = stage;
 
 
        myBrowser = new MyBrowser();
        Scene scene = new Scene(myBrowser);
 
        stage.setScene(scene);
        stage.setWidth(1300);
        stage.setHeight(840);
        stage.show();
        run.start();
    }
 
 
 
    public void createMarker(double LAT, double LON){
        String sLat2 = Double.toString(LAT);
        String sLng2 = Double.toString(LON);
 
        doc.eval("setMapCenter(" + sLat2 + ", " + sLng2 + ")");
        doc.eval("createMarker(" + sLat2 + ", " + sLng2 + ")");
    }
 
 
 
    Thread run = new Thread(new Runnable() {
        @Override
        public void run() {
            double LAT = 55.016042;
            double LON = 82.945993;
            int i = 0;
 
            while( true ){
                try {
                    createMarker(LAT, LON);
                    LAT += 0.01;
                    LON += 0.01;
                    i++;
                    Thread.sleep(1*1000);
                }
                catch (InterruptedException ex) {
                    break;
                }
 
 
            }
        }
    });
 
 
 
    class MyBrowser extends Pane {
 
        WebView webView = new WebView();
        WebEngine webEngine = webView.getEngine();
 
 
        public MyBrowser() {
            webView.setMaxWidth(1300);
            webView.setMaxHeight(800);
 
            webView.setMinWidth(1300);
            webView.setMinHeight(800);
 
            final URL urlGoogleMaps = getClass().getResource("demo.html");
            webEngine.load(urlGoogleMaps.toExternalForm());
 
 
            webEngine.setOnAlert(new EventHandler<WebEvent<String>>() {
                @Override
                public void handle(WebEvent<String> e) {
                    System.out.println(e.toString());
                }
            });
 
 
            getChildren().add(webView);
 
            Button start = new Button("START");
 
            doc = (JSObject) webEngine.executeScript("window");
            doc.setMember("app", MyBrowser.this);
 
            start.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent arg0) {
 
                }
            });
 
            HBox toolbar  = new HBox();
            toolbar.getChildren().addAll(start);
 
            getChildren().addAll(toolbar);
        }
    }
 
}
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    <style type="text/css">
        html { height: 100% }
        body { height: 100% ; margin: 0; padding: 0 }
        #map_canvas { height: 100% }
    </style>
    <script type="text/javascript"
            src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDw-9xQR-AX7i1k10M7MIJ-AZ2UT_umGZk&sensor=false">
    </script>
    <script type="text/javascript">
        var map;
        var marker;
 
        function get_click_position(event){
            var location = event.latLng;
            var lat = location.lat();
            var lng = location.lng();
            setMarkerPosition(lat, lng);
            app.handle(lat, lng);
        }
 
 
        function setMarkerPosition(lat, lng) {
            var clickLatLng = new google.maps.LatLng(lat, lng);
            marker.setPosition(clickLatLng);
        }
 
 
        function startJumping(){
            marker.setAnimation(google.maps.Animation.BOUNCE);
        }
 
 
        function stopJumping(){
            marker.setAnimation(google.maps.Animation.BOUNCE);
        }
 
 
        function setMapCenter(lat, lng) {
            var latlng = new google.maps.LatLng(lat, lng);
            map.setCenter(latlng);
        }
 
 
        function switchSatellite() {
            var mapOptions = {
                mapTypeId: google.maps.MapTypeId.SATELLITE
            };
            map.setOptions(mapOptions);
            setLightMarkerIcon();
        }
 
 
        function switchRoadmap() {
            var mapOptions = {
                mapTypeId: google.maps.MapTypeId.ROADMAP
            };
            map.setOptions(mapOptions);
            setDarkMarkerIcon();
        }
 
 
        function switchHybrid() {
            var mapOptions = {
                mapTypeId: google.maps.MapTypeId.HYBRID
            };
            map.setOptions(mapOptions);
            setLightMarkerIcon();
        }
 
 
        function switchTerrain() {
            var mapOptions = {
                mapTypeId: google.maps.MapTypeId.TERRAIN
            };
            map.setOptions(mapOptions);
            setDarkMarkerIcon();
        }
 
 
        function createMarker(lat, lng){
            var newMarker;
            var pos = new google.maps.LatLng(lat, lng);
            newMarker = new google.maps.Marker({
                position: pos,
                map: map,
                //icon: "img/Pin.png"
            });
        }
 
 
        function initialize() {
            var defLatLng = new google.maps.LatLng(55.016042, 82.945993);
            var mapOptions = {
                center: defLatLng,
                zoom: 10,
                mapTypeId: google.maps.MapTypeId.ROADMAP,
                disableDefaultUI: true,
                panControl: false
            };
            map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);
            google.maps.event.addListener(map, 'click', get_click_position);
 
            app.handle(0, 0);
        }
 
 
        function setDarkMarkerIcon() {
            marker.setIcon("img/Pin.png");
        }
 
 
        function setLightMarkerIcon() {
            marker.setIcon("img/Pin_s.png");
        }
 
    </script>
</head>
<body onload="initialize()">
<div id="map_canvas" style="width:100%; height:100%"></div>
</body>
</html>
Собственно само исключение:
Exception in thread "Thread-4" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-4
at com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:279)
at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:423)
at com.sun.javafx.webkit.prism.PrismInvoker.checkEventThread(PrismInvoker.java:62)
at com.sun.webkit.dom.JSObject.eval(JSObject.java:72)
at GoogleApp.createMarker(GoogleApp.java:54)
at GoogleApp$1.run(GoogleApp.java:69)
at java.lang.Thread.run(Thread.java:748)
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.05.2019, 08:45
Ответы с готовыми решениями:

Обращение к элементу WinForms из потока, отличного от потока, в котором это элемент был создан
Пишу приложение, котором при загрузке формы в textbox на этой форме заносятся данные. Причем данных...

Java и javascript. Передать переменную из Java в Javascript
Здравствуйте,уважаемые форумчане! Я начинающий программист. Разбираюсь в создании JSP страниц....

Обращение из потока к контролу
Приветствую! Сегодня у меня печальный день((( Пол дня потратил чтобы решить проблему, так и не...

Обращение к переменной из потока
Что то не пойму, меняю переменною(int j объявленную в public в основном потоке) из потока...

Обращение к ListView из потока
Доброго времени суток. Не могу разобраться с доступом к listView с другого потока. Пишу прокси...

2
korvin_
2765 / 2037 / 366
Регистрация: 28.04.2012
Сообщений: 6,948
05.05.2019, 22:17 2
Цитата Сообщение от AlxAbr Посмотреть сообщение
весь гугл обшарил, нечего найти не смог (ну или я просто не понял, что нашел и пропустил)
https://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm
0
AlxAbr
0 / 0 / 0
Регистрация: 05.05.2019
Сообщений: 8
09.05.2019, 17:45  [ТС] 3
Добавлено через 6 минут
Цитата Сообщение от korvin_ Посмотреть сообщение
Сообщение от AlxAbr
весь гугл обшарил, нечего найти не смог (ну или я просто не понял, что нашел и пропустил)
https://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm
__________________
Не могли бы вы пожалуйста пояснить, я не особо понимаю, как мне реализовать это для WebView.
0
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.05.2019, 17:45

Обращение к Label из потока
Доброго времени! Форма, на форме кнопка запуска и 2 штуки label, видимый &quot;работаю&quot; и невидимый...

Обращение к контролу из потока
Помогите пожалуйста разобраться с обращением к контролам из потока. Приведенный под спойлером для...

Обращение к контролу из потока
Подскажите, как следует обращаться к контролу из другого потока? Например в этом случае: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.