segunda-feira, 25 de julho de 2011

Small Note about Layouting in JavaFX

When I start to test JavaFX 2.0 API, the first problem that I found was layouting.

In JFX 1.3 I usually use binds to determinate layout position by computing bounds values from nodes of a scene or node.

But in my first project a big surprise when used y.setTranslateX(x.getTranslateX()+x.getWidht()). Widht always was 0 (zero). By default I always create all nodes and UI components before to put they in scene.

Posting a bug report to JavaFX 2.0 team a received an answer that was enlightening to me and can be to many other programers.

Amy Fowler added a comment - Jul, 14 2011 12:25 AM
The size of resizable nodes (Regions, Panes, Controls) depends on CSS being applied since style information (fonts, padding, etc) contributes to the preferred and ultimately (after layout) the actual size of such nodes. CSS cannot be applied until nodes are connected to a Scene because stylesheets are set at the Scene level. Currently CSS is not applied until the first pulse on the scene, which doesn't happen until the Scene is visible on the screen.

Binds in practice

One of the best features of JavaFX Script (in my opinion) was the operator "bind".

With the language's change in version 2.0 this operator was changed to a special type of data. But with great versatility.

As stated in the title of the post, we'll see it in practice. Below is an application that will demonstrate some of its applications.
public class Properties extends Application {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Application.launch(Properties.class, args);
}
private Rectangle rect1;
private Rectangle rect2;
private Rectangle rect3;
private TextBox edit1;
private TextBox edit2;

@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Hello World");
Group root = new Group();
Scene scene = new Scene(root, 300, 250, Color.LIGHTGREEN);
Button btn = new Button();
btn.setLayoutX(40);
btn.setLayoutY(130);
btn.setText("Rectangles");
btn.setOnAction(new EventHandler() {

public void handle(ActionEvent event) {
TranslateTransition tt = new TranslateTransition(Duration.valueOf(3000),rect1);
RotateTransition rt = new RotateTransition(Duration.valueOf(3000), rect1);
tt.toXProperty().set(600);
tt.toYProperty().set(500);
tt.cycleCountProperty().set(3);
rt.cycleCountProperty().set(3);
rt.setToAngle(720);
tt.autoReverseProperty().set(true);
tt.play();
rt.play();
}
});
Button btn1 = new Button();
btn1.setLayoutX(40);
btn1.setLayoutY(150);
btn1.setText("edits");
btn1.setOnAction(new EventHandler() {

public void handle(ActionEvent event) {
edit1.setLayoutX(100);
edit1.setLayoutY(200);
edit2.textProperty().bindBidirectional(edit1.textProperty());
}
});

rect1 = new Rectangle(100,100);
rect2 = new Rectangle(100,100);
rect3 = new Rectangle(200,150,100,100);
rect2.translateXProperty().bind(rect1.translateXProperty().add(rect1.widthProperty()).add(20));
rect2.layoutYProperty().bind(rect1.layoutYProperty());
rect2.rotateProperty().bind(rect1.rotateProperty().divide(2));
rect3.rotateProperty().bind(rect1.rotateProperty().multiply(2));

edit1 = new TextBox("edit1");
edit2 = new TextBox();

edit2.layoutXProperty().bind(edit1.layoutXProperty());
edit2.layoutYProperty().bind(edit1.layoutYProperty().add(edit1.heightProperty()).add(10));

root.getChildren().addAll(rect1,rect2,rect3,edit1,edit2);
root.getChildren().addAll(btn,btn1);
primaryStage.setScene(scene);
primaryStage.setVisible(true);
}
}






The application places at the window three rectangles. The first (rect1) receive position and rotation changes by Transition's (more about them at ).
The second rectangle will take their properties translateX, translateY and rotation accompanying object rect1 properties. The property translateY will be binding directly, translateX will add to it also rect1 width, keeping the same distance between the two rectangles. Since the rotation property of the object rect2 monitor the same object rect1 property, but a rate of half of its "speed".
Instead, the object rect3 monitor the rotation of the object rect1, but with double his "speed".

Since the objects and edit1 edit2 will accompany the text property of each other through a "bindBidirectional." So with a single method the ability to add accompaniments bidirectional, where the changes made to reflect a property directly to another and vice versa.

These are simple examples but they demonstrate the capacity and capability of the classes that implements the Property.

Even more,

Bind´s na Prática

Uma das melhores funcionalidades do JavaFX Script (na minha opinião) era o operador "bind".

Com a mudança da linguagem na versão 2.0 este operador foi alterado para um tipo especial de dado. Porém de grande versatilidade.

Como dito no título do post, vamos vê-lo na prática. Abaixo temos uma aplicação que demonstrará algumas de suas aplicações.

public class Properties extends Application {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Application.launch(Properties.class, args);
}
private Rectangle rect1;
private Rectangle rect2;
private Rectangle rect3;
private TextBox edit1;
private TextBox edit2;

@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Hello World");
Group root = new Group();
Scene scene = new Scene(root, 300, 250, Color.LIGHTGREEN);
Button btn = new Button();
btn.setLayoutX(40);
btn.setLayoutY(130);
btn.setText("Rectangles");
btn.setOnAction(new EventHandler() {

public void handle(ActionEvent event) {
TranslateTransition tt = new TranslateTransition(Duration.valueOf(3000),rect1);
RotateTransition rt = new RotateTransition(Duration.valueOf(3000), rect1);
tt.toXProperty().set(600);
tt.toYProperty().set(500);
tt.cycleCountProperty().set(3);
rt.cycleCountProperty().set(3);
rt.setToAngle(720);
tt.autoReverseProperty().set(true);
tt.play();
rt.play();
}
});
Button btn1 = new Button();
btn1.setLayoutX(40);
btn1.setLayoutY(150);
btn1.setText("edits");
btn1.setOnAction(new EventHandler() {

public void handle(ActionEvent event) {
edit1.setLayoutX(100);
edit1.setLayoutY(200);
edit2.textProperty().bindBidirectional(edit1.textProperty());
}
});

rect1 = new Rectangle(100,100);
rect2 = new Rectangle(100,100);
rect3 = new Rectangle(200,150,100,100);
rect2.translateXProperty().bind(rect1.translateXProperty().add(rect1.widthProperty()).add(20));
rect2.layoutYProperty().bind(rect1.layoutYProperty());
rect2.rotateProperty().bind(rect1.rotateProperty().divide(2));
rect3.rotateProperty().bind(rect1.rotateProperty().multiply(2));

edit1 = new TextBox("edit1");
edit2 = new TextBox();

edit2.layoutXProperty().bind(edit1.layoutXProperty());
edit2.layoutYProperty().bind(edit1.layoutYProperty().add(edit1.heightProperty()).add(10));

root.getChildren().addAll(rect1,rect2,rect3,edit1,edit2);
root.getChildren().addAll(btn,btn1);
primaryStage.setScene(scene);
primaryStage.setVisible(true);
}
}



A aplicação coloca na janela três retangulos. O primeiro deles (rect1) receber alterações de posicionamento e rotação através de Transition's (mais sobre eles em ).
O segundo retângulo terá suas propriedades translateX, translateY e rotation acompanhando as propriedades do objeto rect1. A propriedade translateY será companhada diretamente, já a translateX somará também a largura do objeto rect1, mantendo sempre a mesma distância entre os dois retângulos. Já a propriedade rotation do objeto rect2 acompanhará a mesma propriedade do objeto rect1, mas numa razão da metade de sua "velocidade".
Ao contrário, o objeto rect3 acompanhará a rotação do objeto rect1, porém com o dobro de sua "velocidade".

Já os objetos edit1 e edit2 passará a acompanhar o propriedade text um do outro, através de um "bindBidirectional". Assim com um único método acrescentamos a capacidade de acompanhamentos bidirecionais, onde as alterações feitas em uma propriedade refletem diretamente em outra e vice-versa.

São exemplos simples mas demonstram a capacidade e potencialidade das classes que implementa a interface Property.

Até mais,

quinta-feira, 14 de julho de 2011

JDK 7

O JDK7 tem uma relação direta com o desenvolvimento JavaFX pois será nele que futuramente faremos nossas aplicações.

O link abaixo trás as pequenas, mas valiosas, mudanças na sintaxe introduzidas pelo Projeto Coin.


JDK7 has a direct relation with JavaFX development because will be in it that we´ll create our applications in future.

The bellow link bring the little, but valueable, sintaxe changes introduced by Project Coin.

quarta-feira, 6 de julho de 2011

Mostrando o progesso do Carregamento de uma Imagem / Showing Image Load Progress

Um post interessante de como apresentar na aplicação o progresso do carregamento de imagens.

One interesting post about how to show the loading progress for images.


getting-percentage-of-image-loading-in-javafx-2-0

Utilizando TableView

Uno de los principales componentes visuales incorporados en JavaFX 2.0 (1.3 estaba en la vista previa) fue el TableView.

Que ofrece un gran apoyo en la presentación de los datos en formato de tabla, a partir de un estándar de rendimiento para una personalización completa de cada celda.

Al principio hay que tener en cuenta que una tabla está formada por filas y columnas, y cada intersección que forman una celda.

Por definición, un JavaFX TableView tiene la fuente de datos para su formación un ObservableList de objecto con una estructura específica, que yo llamo la frecuencia JavaFxBean. A JavaFxBean tiene una estrecha estructura de JavaBeans, pero sus atributos son descendientes (extensiones) de la interfaz javafx.beans.Property (StringProperty, IntegerProperty, BooleanProperty, OBJECTPROPERTY). De acuerdo con la documentación de la API 2.0 que tiene este formato:
public class Person {
private StringProperty firstName;
public void setFirstName(String value) { firstName.set(value); }
public String getFirstName() { return firstName.get(); }
public StringProperty firstNameProperty() {
if (firstName == null) firstName = new StringProperty();
return firstName;
}

private StringProperty lastName;
public void setLastName(String value) { lastName.set(value); }
public String getLastName() { return lastName.get(); }
public StringProperty lastNameProperty() {
if (lastName == null) lastName = new StringProperty();
return lastName;
}
}

En mi ejemplo utilizo una clase JPA TbTlmkChamada que es recuperada por la clase TbTlmkChamadaJpaController. A medida que lo JPA sólo permite la utilización de determinados tipos de atributos (en el que los descendientes de los Property´s no se ajustan a) He creado una clase (Proxy) TbTlmkChamadaFxBean con el fin de recibir los objetos de base de datos. Esta clase sólo tiene los mismos atributos que la clase original, pero con los descendientes de los tipos de javafx.beans.Property.

Bueno, no han tocado el TableView. El momento es ahora.

Para una vista básica, podemos crear un estándar TableView con el siguiente formato:
TbTlmkChamadaJpaController control = new TbTlmkChamadaJpaControllerImpl(telemarketingserver.TelemarketingServer.emf);

tabela = new TableView();
List<TbTlmkChamada> findTbTlmkChamadaEntities = control.findTbTlmkChamadaEntities();

List<TbTlmkChamadaFxBean> lista = new ArrayList<TbTlmkChamadaFxBean>();
for (int i=0;i < TbTlmkChamadaEntities.size();i++) {
lista.add(new TbTlmkChamadaFxBean(findTbTlmkChamadaEntities.get(i)));
}
ObservableList<TbTlmkChamadaFxBean> chamadas = FXCollections.observableList(lista);
tabela.setItems(chamadas);
TableColumn<Integer> codigoCol = new TableColumn<Integer>("Código");
codigoCol.setProperty("codigo");
TableColumn<String> dadosCol = new TableColumn<String>("Dados");
dadosCol.setProperty("dados");
TableColumn<Date> dataCol = new TableColumn<Date>("Data");
dataCol.setProperty("proxChamada");

final TableColumn<TbTlmkFila> filaCol = new TableColumn<TbTlmkFila>("Fila");
filaCol.setProperty("fila");


tabela.getColumns().addAll(codigoCol,dadosCol,filaCol,dataCol);
tabela.setPrefWidth(800);
getChildren().add(tabela);

que se traducirá en una tabla como ésta:

Como usted puede ver las columnas se colocó en segundo lugar la clase atributos TbTlmkChamadaFxBean (utilizando su método toString ()).

Ahora usted puede mejorar el funcionamiento de esta tabla. Inicialmente, el orden de las filas (en el código de ejemplo para la columna):
codigoCol.setComparator(new Comparator() {

@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
});

Con estas líneas de código que establece la comparación utilizada por el columna codigoCol para comparar el valor de los objetos.

También puede modificar el contenido visible de cada célula, como en el siguiente código:
filaCol.setCellFactory(new Callback<TableColumn<TbTlmkFila>, TableCell<TbTlmkFila>>() {

@Override
public TableCell<TbTlmkFila> call(TableColumn<TbTlmkFila> param) {
TableCell<TbTlmkFila> cell = new TableCell<TbTlmkFila>() {
@Override public void updateItem(TbTlmkFila value, boolean empty) {
super.updateItem(value, empty);

if (empty) {
setNode(null);
} else {
VBox vbox = new VBox(5);
vbox.getChildren().add(new Label(value.getNome()));
vbox.getChildren().add(new Label(value.getCliente().getNome()));
vbox.setStyle("-fx-background-color:#FF0000;");
setNode(vbox);
}
}
};
return cell;



}
});

Utilizando el método setCellFactory és possible crear CellFactory´s personalizado para cada columna. Lo que no está bien documentada en la API de JavaFX 2.0 es la forma de acceder al valor del objeto en relación con la célula. Esto se hace escribiendo en la UpdateItem método. Dentro de este método es donde se establece lo que se presentará en cada celda.

El resultado de este código es el siguiente tabla:

como resultado de CellFactory una columna es un objeto de nodo de clase, la imaginación de los desarrolladores es el límite de lo que se puede presentar en una celda: Región, ListView, Button, de otros TableView. Las posibilidades son infinitas.

Espero que este mensaje puede ser útil a alguien como lo fue para mí.

Buenos códigos a todos.

terça-feira, 5 de julho de 2011

Using TableView

first I apologize for my English. Google Translate helps me offer this english version.

One of the major visual components embedded in JavaFX 2.0 (1.3 was in the preview) was the TableView.

It offers a great support in the presentation of data in table format, from a performance standard to a full customization of each cell.

Initially we must bear in mind that a table is made up of rows and columns and each intersection they form a cell.

By definition a TableView JavaFX has the data source for their formation ObservableList an object with a specific structure, which I call the commonly JavaFxBean. A JavaFxBean has a structure close to JavaBeans, but their attributes are descendants (extensions) interface javafx.beans.Property (StringProperty, IntegerProperty, BooleanProperty, OBJECTPROPERTY). According to the 2.0 API documentation it has this format:
public class Person {
private StringProperty firstName;
public void setFirstName(String value) { firstName.set(value); }
public String getFirstName() { return firstName.get(); }
public StringProperty firstNameProperty() {
if (firstName == null) firstName = new StringProperty();
return firstName;
}

private StringProperty lastName;
public void setLastName(String value) { lastName.set(value); }
public String getLastName() { return lastName.get(); }
public StringProperty lastNameProperty() {
if (lastName == null) lastName = new StringProperty();
return lastName;
}
}

In my example JPA TbTlmkChamada use a class that is recovered by the class TbTlmkChamadaJpaController. As the JPA only allows the creation of specific types of attributes (in which the descendants of Property do not fit) I created a class (Proxy) TbTlmkChamadaFxBean in order to receive the database objects. This class just has the same attributes as the original class, but with the descendants of javafx.beans.Property types.

Well have not touched the TableView. The time is now.

For a basic view, we can create a TableView standard with the following format:

TbTlmkChamadaJpaController control = new TbTlmkChamadaJpaControllerImpl(telemarketingserver.TelemarketingServer.emf);

tabela = new TableView();
List<TbTlmkChamada> findTbTlmkChamadaEntities = control.findTbTlmkChamadaEntities();

List<TbTlmkChamadaFxBean> lista = new ArrayList<TbTlmkChamadaFxBean>();
for (int i=0;i < TbTlmkChamadaEntities.size();i++) {
lista.add(new TbTlmkChamadaFxBean(findTbTlmkChamadaEntities.get(i)));
}
ObservableList<TbTlmkChamadaFxBean> chamadas = FXCollections.observableList(lista);
tabela.setItems(chamadas);
TableColumn<Integer> codigoCol = new TableColumn<Integer>("Código");
codigoCol.setProperty("codigo");
TableColumn<String> dadosCol = new TableColumn<String>("Dados");
dadosCol.setProperty("dados");
TableColumn<Date> dataCol = new TableColumn<Date>("Data");
dataCol.setProperty("proxChamada");

final TableColumn<TbTlmkFila> filaCol = new TableColumn<TbTlmkFila>("Fila");
filaCol.setProperty("fila");


tabela.getColumns().addAll(codigoCol,dadosCol,filaCol,dataCol);
tabela.setPrefWidth(800);
getChildren().add(tabela);








which will result in a table like this:









As you can see the columns were placed second class attributes TbTlmkChamadaFxBean (using their toString ()).

Now you can enhance the functioning of this table. Initially the ordering of the rows (in the example code for the column):

codigoCol.setComparator(new Comparator() {

@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
});







With these lines of code we set the comparator used by the column codigoCol to compare the value of the objects.

You can also modify the visible content of each cell, as in the following code:
filaCol.setCellFactory(new Callback<TableColumn<TbTlmkFila>, TableCell<TbTlmkFila>>() {

@Override
public TableCell<TbTlmkFila> call(TableColumn<TbTlmkFila> param) {
TableCell<TbTlmkFila> cell = new TableCell<TbTlmkFila>() {
@Override public void updateItem(TbTlmkFila value, boolean empty) {
super.updateItem(value, empty);

if (empty) {
setNode(null);
} else {
VBox vbox = new VBox(5);
vbox.getChildren().add(new Label(value.getNome()));
vbox.getChildren().add(new Label(value.getCliente().getNome()));
vbox.setStyle("-fx-background-color:#FF0000;");
setNode(vbox);
}
}
};
return cell;



}
});







Using the method you can create setCellFactory CellFactory's customized for each column. What is not well documented in the JavaFX API 2.0 is how you access the value of the object related to the cell. This is done by writing on the method UpdateItem. Within this method is where you set what will be presented in each cell.

The result of this code is the following table:







CellFactory as the result of a column is an object of class Node, the imagination of developers is the limit of what can be presented in a cell: Region's, ListView's, Button's, other's TableView. The possibilities are endless.

I hope this post can be useful to someone as it was for me.

Good coding for all.

Usando TableView

Um dos grandes componentes visuais incorporados no JavaFX 2.0 (esteve em preview no 1.3) foi o TableView.

Ele oferece um grande suporte na apresentação de dados em formato de tabela, desde uma apresentação standard até uma customização total de cada célula.

Inicialmente temos que ter em mente que uma tabela é formada de linhas e colunas e que cada intersecção entre elas forma uma célula.

Por definição um TableView do JavaFX tem como fonte de dados para sua formação um ObservableList de objetos com uma estrutura específica, que eu chamo de vulgarmente de JavaFxBean. Um JavaFxBean tem uma estrutura próxima aos JavaBeans, porém seus atributos são descendentes (extensões) da interface javafx.beans.Property (StringProperty, IntegerProperty, BooleanProperty, ObjectProperty). Segundo a documentação da API 2.0 ele tem este formato:
public class Person {
private StringProperty firstName;
public void setFirstName(String value) { firstName.set(value); }
public String getFirstName() { return firstName.get(); }
public StringProperty firstNameProperty() {
if (firstName == null) firstName = new StringProperty();
return firstName;
}

private StringProperty lastName;
public void setLastName(String value) { lastName.set(value); }
public String getLastName() { return lastName.get(); }
public StringProperty lastNameProperty() {
if (lastName == null) lastName = new StringProperty();
return lastName;
}
}

No meu exemplo uso uma classe JPA TbTlmkChamada que é recuperada pela classe TbTlmkChamadaJpaController. Como o JPA só permite a criação de atributos de tipos específicos (nos quais os descendentes de Property não se encaixam) criei uma classe (Proxy) TbTlmkChamadaFxBean, a fim de receber os objetos do banco. Esta classe simplesmente possui os mesmos atributos da classe original, mas com tipos descendentes de javafx.beans.Property.

Bem ainda não chegamos ao TableView. A hora é agora.

Para uma visualização básica, podemos criar um TableView padrão com o seguinte formato:

TbTlmkChamadaJpaController control = new TbTlmkChamadaJpaControllerImpl(telemarketingserver.TelemarketingServer.emf);

tabela = new TableView();
List<TbTlmkChamada> findTbTlmkChamadaEntities = control.findTbTlmkChamadaEntities();

List<TbTlmkChamadaFxBean> lista = new ArrayList<TbTlmkChamadaFxBean>();
for (int i=0;i < TbTlmkChamadaEntities.size();i++) {
lista.add(new TbTlmkChamadaFxBean(findTbTlmkChamadaEntities.get(i)));
}
ObservableList<TbTlmkChamadaFxBean> chamadas = FXCollections.observableList(lista);
tabela.setItems(chamadas);
TableColumn<Integer> codigoCol = new TableColumn<Integer>("Código");
codigoCol.setProperty("codigo");
TableColumn<String> dadosCol = new TableColumn<String>("Dados");
dadosCol.setProperty("dados");
TableColumn<Date> dataCol = new TableColumn<Date>("Data");
dataCol.setProperty("proxChamada");

final TableColumn<TbTlmkFila> filaCol = new TableColumn<TbTlmkFila>("Fila");
filaCol.setProperty("fila");


tabela.getColumns().addAll(codigoCol,dadosCol,filaCol,dataCol);
tabela.setPrefWidth(800);
getChildren().add(tabela);
que vai resultar em uma tabela como esta:


Como se percebe foram colocados as colunas segundo os atributos da classe TbTlmkChamadaFxBean (usando os seus respectivos métodos toString()).

Agora é possível enriquecer o funcionamento desta tabela. Incialmente a ordenação das linhas (no exemplo pela coluna Código):

codigoCol.setComparator(new Comparator() {

@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
});
Com estas linhas de código setamos o comparador utilizado pela coluna codigoCol para compara o valor dos objetos.

também é possível modificar o conteúdo visível de cada célula, como no código a seguir:
filaCol.setCellFactory(new Callback<TableColumn<TbTlmkFila>, TableCell<TbTlmkFila>>() {

@Override
public TableCell<TbTlmkFila> call(TableColumn<TbTlmkFila> param) {
TableCell<TbTlmkFila> cell = new TableCell<TbTlmkFila>() {
@Override public void updateItem(TbTlmkFila value, boolean empty) {
super.updateItem(value, empty);

if (empty) {
setNode(null);
} else {
VBox vbox = new VBox(5);
vbox.getChildren().add(new Label(value.getNome()));
vbox.getChildren().add(new Label(value.getCliente().getNome()));
vbox.setStyle("-fx-background-color:#FF0000;");
setNode(vbox);
}
}
};
return cell;



}
});

Usando o método setCellFactory é possível criar CellFactory´s customizados para cada uma das colunas. O que não é muito bem documento na API javaFX 2.0 é como se acessa o valor do objeto referente a célula. Isto é feito através da sobre escrita do método updateItem. Dentro deste método é onde é definido o que será apresentado em cada célula.

O resultado deste código é a seguinte tabela:

Como o resultado do cellFactory de uma coluna é um objeto da classe Node, a imaginação dos desenvolvedores é limite do que é possível ser apresentado em uma célula: Region´s, ListView´s, Button´s, outros TableView´s. As posibilidades são infinitas.

Espero que este post possa ser útil a alguém como foi para mim.

Bom código a todos.

segunda-feira, 4 de julho de 2011

Artigos de Interesse

Enquanto escrevo minha primeira postagem técinca, gostaria de partilhar dois link de entusiatas do JavaFX.

O primeiro apresenta como desenvolver um Auto-Complete TextBox.


O segundo apresenta a diferença entre Thread, Work, Task e Service na APIi do JavaFX, muito útil para uma aplicação multi-threaded.


Espero que estes links seja úteis para vocês como foram para mim.

sexta-feira, 1 de julho de 2011

Oracle JavaFX WebCast

Ontem assisti ao webcast da Oracle "Enrich your enterprise applications with JavaFX".

Confesso que achei bem fraquinha no sentido técnico, pois foi voltada para simplesmente apresentar a tecnologia para quem não a conhecia.

De importante somente 2 informações:

- A release GA deve sair em setembro;

- Sim. Haverá versões para Mac e para Linux, apesar de uma resposta do FAQ so site dar uma resposta confusa quanto a isto. Para participantes do programa JavaFX Partners (ainda aguardo o retorno de minha inscrição - 2 meses) a possibilidade de disponibilização de uma versão beta para Mac.

No mais voltamos aos códigos e descobertas da API.

Até mais.


Jean

Iniciando os Trabalhos

Sempre quis escrever algo e sempre tive a preguiça de começar.

Agora tento unir minha paixão por programação com um objetivo de querem escrever algo.

Pretendo neste Blog escrever sobre minhas experiências com o agora novo JavaFX 2.0 (confesso que sou uma das viúvas do finado JavaFX Script, gostava muito da linguagem, mas paciência ele se foi - Aguardo o Visage) na criação de aplicações para minha empresa.

Espero que este Blog possa ajudar muito que como eu acabam aprendendo com os exemplos de outros. Não sou um cientista da computação e muita vezes minhas implementações passam longe de ser o estado-da-arte dos códigos, porém sempre são funcionais.

Um abraço,


Jean Paul Lopes