Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

lucasseribeiro

O JavaFX 12 vem sem a classe "Application"!!!

Recommended Posts

Olá, fórum!!

 

Ó... eu gostaria de criar uns applicativos em JavaFX e, um belo dia, comprei um livro e fui ao site baixar as versões atuais, bisoiar release notes (vai queu entendo alguma coisa)... E, de repente, me deparei com um detalhe: o JavaFX 12, que baixei em gluonhq.com/products/javafx/, não vinha com as classes principais, como Application, Scene, Stage & cia... Algo mudou? Estou baixando do lugar errado? Realidade alternativa? Ou não precisa mais dessas classes? É ilegal? O Toffoli proibiu?

 

O livro não fala como obter o JavaFX, assume que a pessoa já tem!

 

Grato

Lucas Ribeiro

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quase resolvido...

 

A saber: as classes de que preciso, Application, Scene e Stage, estão nos módulos javafx.graphics e javafx.controls, "assim como ensina o tutorial default https://openjfx.io/openjfx-docs/#install-javafx"... a questão é que eu estava errando na adição dos módulos...

 

Pois estou fazendo na unha, no pluma (bloco de notas) do mate-desktop, usando um shell script como compilador e executor dos códigos, para simplificar. O shell ficou assim:

#!/bin/bash

export AQUI=/home/lucasribeiro/Sistemas/oficina/software/agenda
export FX=$AQUI/javafx-sdk-12.0.2/lib
export JDK_BIN=$AQUI/jdk-12.0.2/bin

$JDK_BIN/javac --module-path $FX --add-modules javafx.controls,javafx.graphics $AQUI/HelloFX.java
$JDK_BIN/java  --module-path $FX --add-modules javafx.controls,javafx.graphics $AQUI/HelloFX

Só que ainda diz não encontrar a classe HelloFX, como na exception abaixo: 

~# ag
Error: Could not find or load main class .home.lucasribeiro.Sistemas.oficina.software.agenda.HelloFX
Caused by: java.lang.ClassNotFoundException: /home/lucasribeiro/Sistemas/oficina/software/agenda/HelloFX

Mas o importante é que já encontrou os módulos, a questão da classe principal, vou dar outro rali pra resolver...

 

Grato

Lucas Ribeiro

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por lucasseribeiro
      Bons dias, fórum!
       
      Procurei uma área específica para o JavaFX e não encontrei... Estou aprendendo a usar essa biblioteca, está ficando interessante, se assemelha às tecnologias web com as quais tenho muita familiaridade pois uso há anos. Mas o CSS do JavaFX é diferente daquele do consórcio W3, e não estou encontrando material para entender esse -fx-CSS... A referência CSS da Oracle (https://docs.oracle.com/javase/8/javafx/api/javafx/scene/doc-files/cssref.html) é obscura e não contém as infos que preciso, apesar de esclarecer muitas coisas... Passa uma impressão de que eles não querem que todos saibam!
      Por exemplo: ao estilizar uma menu-bar, mudei seu background, alterei a cor da fonte dos menus, mas eles ficaram colados uns nos outros, e eu não entendi como escolher a propriedade CSS adequada do FX para controlar a distância dos menus. Pude usar um padding, mas ao executar, quando abrimos um menu, os outros ainda são empurrados pois ainda que suas inscrições estejam separadas, os botões do menu ainda estão colados. O tutoriais não abordam o CSS do FX em profundidade, focam-se nos objetivos dos projetos e suas abordagens...
      Rsrs, podia ter no W3Schools... Alguém pode me ajudar com isso???
       
      Grato desde já!
       
      Lucas Ribeiro
    • Por Silva Mateus
      Olá estou com um problema em minhas classes Java. Quando tento criar um novo "Fornecedor", o console me resulta o Caused by: java.lang.StackOverflowError. 
      Aqui estão as minhas classes que interagem entre si. Se alguém poder me auxiliar na resolução deste problema, agradeço. 
      package view; import application.Main; import javafx.fxml.FXML; import javafx.scene.control.Label; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.TextField; import javafx.scene.control.cell.PropertyValueFactory; import javafx.stage.Stage; import model.Fornecedor; import model.Produto; public class FornecedorOverViewController { @FXML private TableView<Fornecedor> tabelaFornecedor; @FXML private TableColumn<Fornecedor, Integer> idFornecedor; @FXML private TableColumn<Fornecedor, String> nomeFornecedor; @FXML private TableColumn<Fornecedor, String> telefoneFornecedor; @FXML private Label nome; @FXML private Label telefone; public FornecedorOverViewController() { } int i = 0; private Main main; @FXML private void initialize() { nomeFornecedor.setCellValueFactory( cellData -> cellData.getValue().nomeProperty()); telefoneFornecedor.setCellValueFactory( cellData -> cellData.getValue().telefoneProperty()); idFornecedor.setCellValueFactory(new PropertyValueFactory<>("id")); showFornecedorDetails(null); tabelaFornecedor.getSelectionModel().selectedItemProperty().addListener( (observable, oldValue, newValue) -> showFornecedorDetails(newValue)); } public void setMainI(Main main) { this.main = main; tabelaFornecedor.setItems(main.getFornecedorData()); } private void showFornecedorDetails(Fornecedor fornecedor) { if (fornecedor != null) { nome.setText(fornecedor.getNome()); telefone.setText(fornecedor.getTelefone()); } else { nome.setText(" "); telefone.setText(" "); } } @FXML private void handleDeleteFornecedor() { int selectedIndex = tabelaFornecedor.getSelectionModel().getSelectedIndex(); if (selectedIndex >= 0) { tabelaFornecedor.getItems().remove(selectedIndex); } else { } } @FXML private void handleNewFornecedor() { Fornecedor newFornecedor = new Fornecedor(null,0); boolean okClicked = main.showFornecedorEditDialog(newFornecedor); if (okClicked) { main.getFornecedorData().add(newFornecedor); } } } package application; import java.io.IOException; import javafx.application.Application; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.fxml.FXMLLoader; import javafx.scene.Scene; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.BorderPane; import javafx.stage.Modality; import javafx.stage.Stage; import model.Categoria; import model.Fornecedor; import model.Produto; import model.Usuario; import view.FornecedorEditDialog; import view.FornecedorOverViewController; import view.LoginController; import view.ProdutoEditDialog; import view.ProdutoOverViewController; import view.RootLayoutController; public class Main extends Application { private Stage primaryStage; private BorderPane rootLayout; private AnchorPane loginLayout; private ObservableList<Produto> produtoData = FXCollections.observableArrayList(); private ObservableList<Fornecedor> fornecedorData = FXCollections.observableArrayList(); private ObservableList<Usuario> usuarioData = FXCollections.observableArrayList(); private ObservableList<Categoria> categoriaData = FXCollections.observableArrayList(); public Main() { int i =0; produtoData.add(new Produto("Skol", 5.99, ++i,199)); produtoData.add(new Produto("Budweiser", 8.99, ++i,2002)); produtoData.add(new Produto("Heineken", 12.00, ++i,22)); i = 0; fornecedorData.add(new Fornecedor("Ambev", ++i)); fornecedorData.add(new Fornecedor("Cervejaria Heineken", ++i)); fornecedorData.add(new Fornecedor("Coca-Cola", ++i)); fornecedorData.add(new Fornecedor("Fonte-Ijuí", ++i)); i = 0; usuarioData.add(new Usuario("mateus", "m16s97aa")); usuarioData.add(new Usuario("dala", "123456")); usuarioData.add(new Usuario("root", "654321")); categoriaData.add(new Categoria("Cerveja", ++i)); categoriaData.add(new Categoria("Vinho", ++i)); categoriaData.add(new Categoria("Vodka", ++i)); categoriaData.add(new Categoria("Cachaca", ++i)); i = 0; } @Override public void start(Stage primaryStage) { this.primaryStage = primaryStage; this.primaryStage.setTitle("Wine And Beer"); login(); /* if(click) { initRootLayout(); showProdutosOverView(); } */ } public void initRootLayout() { try { // Load root layout from fxml file. FXMLLoader loader = new FXMLLoader(); loader.setLocation(Main.class.getResource("/view/RootLayout.fxml")); rootLayout = (BorderPane) loader.load(); // Show the scene containing the root layout. Scene scene = new Scene(rootLayout); primaryStage.setScene(scene); // Give the controller access to the main app. RootLayoutController controller = loader.getController(); controller.setMain(this); primaryStage.show(); } catch (IOException e) { e.printStackTrace(); } /* // Try to load last opened person file. File file = getPersonFilePath(); if (file != null) { loadPersonDataFromFile(file); } */ } public void logar() { primaryStage.close(); initRootLayout(); showProdutosOverView(); //return true; } public void login() { try { // Load root layout from fxml file. FXMLLoader loader = new FXMLLoader(); loader.setLocation(Main.class.getResource("/view/Login.fxml")); loginLayout = (AnchorPane) loader.load(); // Show the scene containing the root layout. Scene scene = new Scene(loginLayout); primaryStage.setScene(scene); // Give the controller access to the main app. LoginController controller = loader.getController(); controller.setMain(this); primaryStage.show(); } catch (IOException e) { e.printStackTrace(); } } public void showProdutosOverView() { try { // Load person overview. FXMLLoader loader = new FXMLLoader(); loader.setLocation(Main.class.getResource("/view/Produto.fxml")); AnchorPane personOverview = (AnchorPane) loader.load(); // Set person overview into the center of root layout. rootLayout.setCenter(personOverview); // Give the controller access to the main app. ProdutoOverViewController controller = loader.getController(); controller.setMain(this); } catch (IOException e) { e.printStackTrace(); } } public Stage getPrimaryStage() { return primaryStage; } public ObservableList<Produto> getProdutoData() { return produtoData; } public ObservableList<Fornecedor> getFornecedorData(){ return fornecedorData; } public ObservableList<Usuario> getUsuarioData(){ return usuarioData; } public ObservableList<Categoria> getCategoriaData(){ return categoriaData; } public static void main(String[] args) { launch(args); } public boolean showProdutoEditDialog(Produto produto) { try { // Load the fxml file and create a new stage for the popup dialog. FXMLLoader loader = new FXMLLoader(); loader.setLocation(Main.class.getResource("/view/ProdutoEditDialog.fxml")); AnchorPane page = (AnchorPane) loader.load(); // Create the dialog Stage. Stage dialogStage = new Stage(); dialogStage.setTitle("Editar Produto"); dialogStage.initModality(Modality.WINDOW_MODAL); dialogStage.initOwner(primaryStage); // dialogStage.getIcons().add(new Image("file:resources/images/edit.png")); Scene scene = new Scene(page); dialogStage.setScene(scene); // Set the person into the controller. ProdutoEditDialog controller = loader.getController(); controller.setDialogStage(dialogStage); controller.setProduto(produto); controller.lotarCombo(fornecedorData, categoriaData); controller.setMain(this); // Show the dialog and wait until the user closes it dialogStage.showAndWait(); return controller.isOkClicked(); } catch (IOException e) { e.printStackTrace(); return false; } } public boolean showFornecedorEditDialog(Fornecedor fornecedor) { try { // Load the fxml file and create a new stage for the popup dialog. FXMLLoader loader = new FXMLLoader(); loader.setLocation(Main.class.getResource("/view/FornecedorEditDialog.fxml")); AnchorPane page = (AnchorPane) loader.load(); // Create the dialog Stage. Stage dialogStage = new Stage(); dialogStage.setTitle("Editar Fornecedor"); dialogStage.initModality(Modality.WINDOW_MODAL); dialogStage.initOwner(primaryStage); Scene scene = new Scene(page); dialogStage.setScene(scene); // Set the person into the controller. FornecedorEditDialog controller = loader.getController(); controller.setDialogStage(dialogStage); controller.setFornecedor(fornecedor); controller.setMain(this); // Show the dialog and wait until the user closes it dialogStage.showAndWait(); return controller.isOkClicked(); } catch (IOException e) { e.printStackTrace(); return false; } } } package view; import application.Main; import javafx.fxml.FXML; import javafx.scene.control.TextField; import javafx.stage.Stage; import model.Fornecedor; import model.Produto; public class FornecedorEditDialog { @FXML private TextField nome; @FXML private TextField telefone; private Stage dialogStage; private Main main; private int id; private Fornecedor fornecedor; private boolean okClicked = false; @FXML private void initialize() { } public void setDialogStage(Stage dialogStage) { this.dialogStage = dialogStage; } public void setMain(Main main) { this.main = main; id = main.getFornecedorData().size(); id = id+1; } public void setFornecedor(Fornecedor fornecedor) { this.fornecedor = fornecedor; nome.setText(fornecedor.getNome()); telefone.setText(fornecedor.getTelefone()); } public boolean isOkClicked() { return isOkClicked(); } @FXML private void handleOk() { if (isInputValid()) { fornecedor.setNome(nome.getText()); fornecedor.setTelefone(telefone.getText()); if(fornecedor.getId() == 0) { fornecedor.setId(this.id); } okClicked = true; dialogStage.close(); } } @FXML private void handleCancel() { dialogStage.close(); } private boolean isInputValid() { String errorMessage = ""; if (nome.getText() == null || nome.getText().length() == 0) { errorMessage += "Produto Invalido!\n"; } if (telefone.getText() == null || telefone.getText().length() == 0) { errorMessage += "Preco invalidos!\n"; } if (errorMessage.length() == 0) { return true; } else { // Show the error message. return false; } } }  
    • Por klonder
      Olá a todos!
      Todos sabemos o quanto é difícil para o Java retornar, de modo fácil, a idade no formato: anos, meses e dias. Não estou me referindo a retornar o tempo entre duas datas em anos, o mesmo tempo em meses ou o mesmo em dias. Refiro-me a retornar quanto tempo uma determinada pessoa tem de vida, exemplo: 30 anos, 12 meses e 4 dias de vida.
      Sabemos ainda que existem os anos bissextos, o que complica o cálculo em algumas situações. O JAVA não nos ajuda de modo automático, como em alguma outra linguagem.
      Pensando nisso, desenvolvi um método que analisa as diversas situações e resolvi compartilhar, para outros colegas e para minhas consultas futuras. O método recebe como parâmetro uma data no formato yyyy-MM-dd (escolhi esse formato pois já vem do banco de dados) e retorna a idade no formato: 30a 4m 2d.
      JAVAFX: Retornar idade em anos, meses e dias:
      public String Idade(String dt_nasc) {//yyyy-MM-dd Calendar calHoje = GregorianCalendar.getInstance(); int diah = calHoje.get(Calendar.DAY_OF_MONTH); int mesh = calHoje.get(Calendar.MONTH) + 1; int anoh = calHoje.get(Calendar.YEAR); // Data do nascimento. String[] quebraDN = dt_nasc.split("-"); int dian = Integer.valueOf(quebraDN[2]); int mesn = Integer.valueOf(quebraDN[1]); int anon = Integer.valueOf(quebraDN[0]); String strNiver = anoh+"-"+mesn+"-"+dian; Calendar calNiver = Calendar.getInstance(); try { calNiver.setTime(new SimpleDateFormat("yyyy-MM-dd").parse(strNiver)); } catch (ParseException ex) { Logger.getLogger(FormataData.class.getName()).log(Level.SEVERE, null, ex); } int anos = (calHoje.getTimeInMillis() < calNiver.getTimeInMillis())? (anoh-anon-1):anoh-anon ; int meses; int dias; meses = mesh - mesn; if (meses > 0) {//Verificando se já fez aniversário ou não if (diah < dian) { meses--; } } else if (meses < 0) {//Se o mês atual for menor que o mês do aniversário meses = 12 + meses;//Lembrar que meses está negativo, por isso a soma; //Da mesma forma, vamos comparar o dia atual com o dia do aniversário, para sabermos se o mês está completo ou não: if (diah < dian) { meses--; } } else {//Se o mês atual for o mês do aniversário: if (diah<dian) { meses = 11; } } dias = diah - dian; if (dias < 0) {//Se dia hoje menor que dia do niver, somar os dias desde o mês anterior: if (mesh==5||mesh==7||mesh==8||mesh==10||mesh==12) { dias = 30-dian+diah; } else if (mesh==1||mesh==2||mesh==4||mesh==6||mesh==9||mesh==11) { dias = 31-dian+diah; } else {//Verificando se o ano é bissexto ou não: Esse else é para o mês 3, cujo anterior é fevereiro: if (anoh%4 == 0) { dias = 29-dian+diah; } else { dias = 28-dian+diah; } } } System.out.println(anos+"a "+meses+"m "+dias+"d"); return anos+"a "+meses+"m "+dias+"d"; } Basta invocar o método através do evento de algum outro objeto, ou mesmo durante execução.
      Divirtam-se!
    • Por klonder
      Olá a todos!
       
      Sou iniciante em JavaFx. Após inúmeras pesquisas, encontrei um código em JavaFX que altera as cores das linhas de uma TableView de acordo com os dados retornados pelo banco de dados. Utilizando CSS, é possível alterar background, cor das letras, etc...
      @FXML private TableView tvOrcMedPrescricao; //Referência ao id da TableView (colocar o código dentro de: public void initialize(URL url, ResourceBundle rb) {) tvOrcMedPrescricao.setRowFactory(tv -> { return new TableRow<objPrescricao>() { @Override public void updateItem(objPrescricao item, boolean empty) { super.updateItem(item, empty) ; if (item == null) { setStyle(""); } else if (item.getVia().equals("ENDOVENOSA")) { setStyle("-fx-text-background-color: #AAA;"); //setStyle("-fx-background-color: #0080FF;"); } else { //setStyle("-fx-background-color: #0080FF;"); } } }; }); Espero que seja útil!
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.