Это слишком просто ...
Шаг 1:
connect mobile to laptop (PC)
find adb path in Eclipse or Go Tast manager (<kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Esc</kbd>) -> process -> adb.exe -> right-click -> open file location -> copy the path of the open window (like D:\.....)
Шаг 2:
open cmd and change directory like C:, D:, E:, and G:
1: C:\Users\UMT>D:
2: D:\> cd (past path of adb) like (ANDROID eclipse\Eclipse Setup\adt-bundle-windows-x86_64-202\sdk\plat-form-tools) and press enter
3: Then type `adb tcpip 5555`. Press <kbd>Enter</kbd> ... make sure your mobile connects to the PC
Шаг 3:
Open new cmd and same above, go to the adb directory and type
adb connect 192.168.x.x(device ip):5555
press enter now connect it.
IP-адрес устройства: настройка -> О телефоне -> Состояние -> IP-адрес
Вы создаете экземпляр контроллера «вручную» с помощью
MainController mc = new MainController();
@FXML
-но заданные поля инициализируются FXMLLoader
, когда он создает контроллер для вас как часть процесса загружая файл FXML. Поскольку созданный вами контроллер не является экземпляром контроллера, созданным FXMLLoader
, его @FXML
-занятые поля неинициализируются (т. Е. Они являются нулевыми), и, следовательно, вы получаете исключение нулевого указателя.
Вы может получить ссылку на контроллер, созданный FXMLLoader
, вызвав getController()
в экземпляре FXMLLoader
после вызова load()
.
Если вы хотите, чтобы один контроллер связывался с другим, затем передайте ссылку на один контроллер на другой контроллер, определив соответствующие методы во втором контроллере:
public class ConnectionErrorController implements Initializable {
private MainController mainController ;
public void setMainController(MainController mainController) {
this.mainController = mainController ;
}
// ...
@Override
public void initialize(URL location, ResourceBundle resources) {
infoLabel.setText("Connection lost, please try again");
tryButton.setText("try again");
exitButton.setText("exit");
tryButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
WebEngine webEngine = mainController.getContentPaneController().getVideoWebView().getEngine(); // 1
ToggleButton playButton = mainController.getControlPaneController().getPlayButton(); // 2
if (mainController.testInet()) {
mainController.play(webEngine, playButton);
} else {
// obviously you can now do something better than the "public static field hack" here:
MainController.exist = false;
}
tryButton.getScene().getWindow().hide();
}
});
// ...
}
}
Предполагая, что вы загружаете второй файл fxml в методе в MainController
, вы можете просто сделать что-то например:
public class MainController {
// ...
public void showConnectionErrorWindow(String fileName) {
FXMLLoader loader = new FXMLLoader(getClass().getResource("path/to/ConnectionError.fxml"));
Parent root = loader.load();
ConnectionErrorController connectionErrorController = loader.getController();
connectionErrorController.setMainController(this);
Scene scene = new Scene(root);
Stage stage = new Stage();
// etc...
}
// ...
}
Обратите внимание, что есть гораздо более элегантные способы решения этой проблемы, такие как передача функции ConnectionErrorController
обратного вызова (в форме лямбда-выражения) для обработки вызова play(...)
, которые избегают жесткой связи между ConnectionErrorController
и MainController
. Однако, поскольку вы, кажется, новичок в Java, этот более простой подход может быть более подходящим.
См. Параметры передачи JavaFX FXML для получения дополнительной информации о передаче значений контроллерам.