JavaFX vs LayoutManager

14 respostas
jopss

Olá…

verificando vários tutos sobre o JavaFX, achei mesmo como uma forma mais fácil de fazer as telas swing e etc…
mas, ví que ele usa para orientação os Layouts Manager do Swing: Box, Grid, Border …
então pensamos: de que adianta um script mais fácil se nos deixa travado nos layouts, onde fazer telas ricas leva a um punhado de código ruim de refatorar e de incrementar? E mais, a rapides em fazer as telas com este script se quebra na implementação com os layouts…

Entao, existe algo mais fácil para JavaFX neste sentido?? Fazer telas realmente mais rápido e fácil…

jopss :stuck_out_tongue:

14 Respostas

fabiofalci

jopss , mas o JavaFX não abstrai esse esquema de layout? Eu não sei, nunca olhei a fundo.

P

Ola a todos,

Da uma olhadinha no zk framework www.zkoss.org

jopss

entao, pelos exemplo que vi, inclusive uma da JavaMagazine que dá pra ver claramente, temos que usar os Layouts do Swing.

por ex:

content: GridBagPanel {
   border: EmptyBorder {
      ...
   }
   cells: {
      ...
   }
}

se tiver mesmo alguma abstração disso, como faria uma tela dessas sem o matisse swing, com o JavaFX ?

perell, mt legal isso ae, mas eu tenho que fazer em desktop! (tá eu posso acessar os clientes pelo browser, mas se for desk seria melhor!)

neste site tem os layout Swing e JavaFX, no tópico Layouts and borders:

jopss

fabiofalci

Tem razão, ele usa.

Por curiosidade, tu quer usar JavaFX? Pois me parece que ele ainda nao conseguiu decolar

jopss

queria por causa do binding da tela/classe… uso atualmente o genesis+swing para isso… além de que gostaria de tentar aprofundar nesse FX que parece que pode, um dia, as vezes, quem sabe… decolar!!

jopss :stuck_out_tongue:

EderBaum

Olha, eu estou começando com javaFX e de cara posso dizer que ele revoluciona na questão de criar interfaces.

Casualmente jopss estou fazendo neste momento algo parecido com esta tela que você apresentou ai.
O Matisse é ótimo para criar interfaces, porém você deixa de ser dono do seu código, e acaba não sabendo muito bem como as coisas se comportam lá dentro.

Já com javaFX você cria interfaces puramente no código de formas muito simples. Ai abaixo vai uma classe minha em JFX que cria um painel que pode ser instanciado com:
var p = new MainPanel();
import javafx.ui.*;
import java.lang.Exception;
/**
 * @author Eder Baum
 */

class MainPanel extends CenterPanel {
    operation MainPanel();
}

operation MainPanel.MainPanel(){
    this.background= white;
    this.width = 300;
    this.content= GroupPanel {
        content: Box {
            orientation: VERTICAL
            content:[FlowPanel{
                content: [Label{
                    text: "ID:"
                    width: 15
                },
                TextField{
                    columns: 5
                }, RigidArea {
                    width: 10
                },
                Label{
                    text: "Nome:"
                    width: 40
                },
                TextField{
                    columns: 30
                }
                ]
            }, RigidArea {
                height: 10
            },
            TabbedPane {
                background: white
                tabPlacement: TOP
                tabLayout: WRAP
                selectedIndex: 0
                tabs: [Tab{
                    var myLeft = 65
                    title: "Geral"
                    toolTipText: "Dados Gerais"
                    content: Box {
                        orientation: VERTICAL
                        content:[
                        FlowPanel {
                            alignment: LEADING
                            content: [Label{
                                text: "CPF:"
                                width: myLeft
                            },
                            TextField{
                                columns: 20
                            }]
                        },
                        FlowPanel {
                            alignment: LEADING
                            content: [Label{
                                text: "RG:"
                                width: myLeft
                            },
                            TextField{
                                columns: 20
                            },Label{
                                text: "Emissor:"
                                width: 40
                            },
                            TextField{
                                columns: 7
                            }]
                        },
                        FlowPanel {
                            alignment: LEADING
                            content: [Label {
                                text: "Naturalidade:"
                                width: myLeft                                
                            },
                            TextField{
                                columns: 20
                            },Label{
                                text: "Estado:"
                                width: 40
                            },
                            TextField{
                                columns: 7
                            }]
                        }, 
                        FlowPanel {
                            alignment: LEADING
                            content: [Label {
                                text: "Pai:"
                                width: myLeft                                
                            },
                            TextField{
                                columns: 40
                            }]
                        }, 
                        FlowPanel {
                            alignment: LEADING
                            content: [Label {
                                text: "Mae:"
                                width: myLeft                                
                            },
                            TextField{
                                columns: 40
                            }]
                        }
                        ]
                    }
                }, Tab{
                    title: "Geral"
                    toolTipText: "Dados Gerais"
                }]
            },
            RigidArea {
                height: 10
            },
            Button {
                text: "Gravar"
            }]
        }
    };
}

https://openjfx.dev.java.net/servlets/ProjectDocumentList
Baixe estes arquivos ai. Lá na pasta Trunk há alguns tutoriais muito uteis.

P.s. JavaFX não está maduro ainda, mas eu não toh nem ai e já toh usando :lol:

jopss

Entao… quanto a questão dos Layouts para os componentes da tela, não vi diferença nenhuma para o Swing… mesma complexidade para telas mais elaboradas… ou existe saídas? Existe algum layout no FX para “fixar” o componente com coordenadas, e que não dê problemas se rodar no windows ou linux ?

jopss

EderBaum

Estão aparecendo algumas ferramentas visuais já para JavaFX.

Porém para a Maioria dos Layouts managers do Swing há um correspondente no FX.
Só testei ainda no Windows, e o interessante é que por padrão não fica aquela coisa feia do LF metal do Swing, e sim algo mais parecido com o LF nativo do OS.

genildof

Ainda não fiz nenhum teste com o JavaFX, mas não seria possível por exemplo usar um manager como o Mig? Achei bem prático.
Ou esse manager teria que ser ‘for JavaFX’?
No meu caso estou estudando a integração JRuby + Swing para um projeto desktop.

jopss

muito bom esse MIG, nao o conhecia…
Se der, faz um teste ae com o JavaFX e nos diz oq acontece!

jopss :stuck_out_tongue:

EderBaum

Na verdade você pode fazer a chamada de qualquer objeto java no FX, bem como usá-lo em componentes visuais, como:

var mig = new MiGLayout();

ou ainda da forma que javaFX mostra sua comodidade:

MiGLayout { //Instruções }

genildof

EderBaum:
ou ainda da forma que javaFX mostra sua comodidade:

MiGLayout { //Instruções }


Deve ficar show!! Assim que der tempo vou testar.

EderBaum
A que interessar criei um TextField que aceita filtros em FX
import javafx.ui.*;
import javax.swing.JTextField;
import javax.swing.text.AbstractDocument;
import javax.swing.text.DocumentFilter;

/**
 * @author Eder Baum
 */
class MaskedTextField extends TextField {
    public attribute filter:DocumentFilter;    
}

trigger on MaskedTextField.filter = newValue {
   ((AbstractDocument)super().textField.getDocument()).setDocumentFilter(filter);
}
esmiralha

fabiofalci:
Tem razão, ele usa.

Por curiosidade, tu quer usar JavaFX? Pois me parece que ele ainda nao conseguiu decolar

Pois é, essas coisas só decolam se alguém se atreve a usar. Elas não costumam bater asas e sair voando por aí.

Criado 14 de abril de 2008
Ultima resposta 28 de abr. de 2009
Respostas 14
Participantes 6