No SceneBuilder está tudo ok, quando dou um Preview abre normalmente, mas quando abro pela aplicação fica pensando trava a aplicação e demora uns 10 seg para abrir, depois que abre fica normal, é só na primeira abertura, se puderem ajudar nessa agradeço.
Na aplicação chamo o fxml (esse que está lento) da seguinte forma:
Na tela principal do sistema tenho um botão que chama o FXML:
@FXML
private void btnRDIOnAction(ActionEvent event) throws SQLException {
try {
//Aponta o caminho da viewFXML
FXMLLoader fXMLLoader = new FXMLLoader();
fXMLLoader.load(getClass().getResource("/br/com/pcp/view/telas/inventario/formTelaINVRdi.fxml").openStream());
//Adiciona o FXML ao StackPane da tela principal
AnchorPane acMain = fXMLLoader.getRoot();
spConteudo.getChildren().clear();
spConteudo.getChildren().add(acMain);
} catch (IOException ex) {
Logger.getLogger(controlTelaInventario.class.getName()).log(Level.SEVERE, null, ex);
}
}
Já fiz o teste retirando os metodos que popula os combobox e a tableview do initialize e mesmo assim, a tela estando sem método nenhum inicializando demora para carregar.
A grande vantagem do Java e’ justamente essa, você vai cavando o código e acaba encontrando o erro.
Muito dificil erro invisivel em Java, tipo aqueles do Delphi.
Debuga seu codigo com calma e você encontrara’. Em tudo existe o bonus e o onus e esse quando acontece é o onus do programador.
Nenhuma empresa vai contratar um programador pra desenvolver e outro pra achar os erros do programa desse ou daquele programador.
Constantemente passo por isso, e sempre encontrei e encontro o erro, as vezes chego a pensar que seja algum bug da jre que claro existem, mas são bem raros.
Já em relação a bug em bibliotecas de terceiros são mais comuns.
Quando a Oracle permitia a gente testar o JavaFX e reportar o bug diretamente para o Kevin Rushforth estava ótimo, coisa de uma semana e os caras arrumavam. Mas a Oracle cortou esse barato, o negocio agora e’ fazer parte do openJFX e se tiver bug já fala diretamente com o desenvolvedor e boa.
@Mike, estou achando que é isso, pq retirei esse método e a tela carregou normal, da uma olhada como estou fazendo, será que tem outra forma para popular meu JFXComboBox? que seja mais rápido, ressalto que essa tabela “material” que uso para popular o JFXComboBox tem uns 17 mil registros mas a consulta direto no BD roda em milésimos, somente na aplicação JavaFX que fica lento:
Método responsável por popular o JFXComboBox:
//Carrega combobox
private void carregaComboBoxMaterial() {
try {
txtMaterial.getItems().addAll("");
List<String> lista = new ArrayList<>();
Connection conn = dbConexao.getConnection();
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("SELECT Material FROM material");
while (rs.next()) {
lista.add(rs.getString("Material"));
//Adiciona a lista ao JFXComboBox
txtMaterial.setItems(FXCollections.observableArrayList(lista));
}
dbConexao.close((com.mysql.jdbc.Connection) conn, st, rs);
} catch (Exception e) {
System.err.println("Erro carregaMaterial: " + e);
}
}
Ai chamo esse método lá no public void initialize:
Você traz 17mil de uma vez só? Ai você mata a aplicação mesmo
A consulta na aplicação deve estar rápida também, a demora é do tempo que o JavaFX utiliza para colocar os seus registros no combo. Não que o JavaFX seja lento, mas que é normal demorar para colocar esse tanto de registros.
O jeito correto para não impactar negativamente a performance, seria fazer um carregamento Lazy (retardado, preguiçoso ou on demand), ou seja, conforme vai abaixando o scroll do combo, você vai consultando no banco os próximos registros.