Maximar tela e manter ajuste de componentes

Bom dia.
Eu estou usando o Scene Builder para criar minhas telas.
Bem, como eu faria para deixar uma tela com uma resolução fixa e impedir de ser maximizada?

No programa tem em Layout->size o minimo e maximo e um tamanho preferencial, porém, mesmo setando todos os valores, a tela ainda pode ser maximizada.
No Scene Builder tem um propriedade Resizable, porém ela vem checada mas desabilitada para interação.

Outro problema é:
Como manter os componentes sempre dispostos na tela de forma organizada, mesmo quando a tela é maximizada ou reduzida de tamanho?

Grande abraço.

Bom dia Luiz, tudo bom?

Bom, vamos lá:

Para impedir o usuário de maximizar a tela, você deve utilizar o método setResizable da Stage, que está localizado na sua classe Application.
Coloque este código dentro do método start(Stage stage).

[code]public class AgendaApplication extends Application {

@Override
public void start(Stage stage) throws Exception {
// Demais códigos…
stage.setResizable(false);
stage.show();
}

}[/code]

Agora, na questão de ajuste de tela, isto sempre foi um grande pesadelo de aplicações Desktop, pois para trabalhar com Flexible Layout não é uma tarefa tão fácil…
Mas, como conselho, dê uma olhada nas Properties dos componentes, onde achará o método bind, que trabalha com Observer em alguma outra propriedade.
Dando um exemplo: tenho uma TableView que está no tamanho full da tela, mas a tela pode ser redimensionada, fazendo a tabela se desajustar. Para isto, compare o tamanho da tabela com o tamanho da tela (Stage).

tbCompromisso.prefWidthProperty().bind(AgendaApplication.getStage().widthProperty()); tbCompromisso.prefHeightProperty().bind(AgendaApplication.getStage().heightProperty());

Este código pega a Property da largura e altura da TableView e compara, em tempo de execução, com a Property da largura e altura da tela. Ou seja, quando alterar o tamanho da tela, altera o tamanho da TableView.

1 curtida

Meu amigo bom dia.
Bem, estranho não deu certo, Mesmo colocando o setResizable(False), a tela continua sendo maximizada.


package br.com.luizpicolo.application;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

/**
 *
 * @author Luiz Picolo
 */
public class Rammus extends Application {
    
    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("Rammus.fxml"));
        Scene scene = new Scene(root);
        stage.setResizable(false);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

Estranho, era para dar certo… Tenta fazer as coisas mais bobas para resolver, tipo, reiniciar o Eclipse, dar um refresh no projeto, etc…

Realmente funcionou, porem eu fiz o texto no Windows 7. Contudo, no meu ElementaryOS não funcionou. Acredito que possa ser algum bug mas que não influenciará no sistema.
Valeu e grande abraço.

Ah, que bom então! E sobre o bind, ajudou?

Então, eu até agora estou mantendo as telas fixas.
Você acredito que isso pode dar problemas na utilização do sistema.

Segue em enexo a tela de login.

Então Luiz, vou lhe dar um conselho: utilize este bloqueio de maximizar tela constantemente!
Aí você não precisa se preocupar tanto com layout flexível, a não ser que as variações sejam internas.

Aproveitando o gancho, gostaria de elogiar sua tela de login, simples, clean e bastante objetiva…
Esta é a sacada do JavaFX: layout rico e clean, ao mesmo tempo.

Dica: pense com carinho sobre o uso de “prompt text” (aqueles hint’s usados em campos de texto), fica bem legal para o usuário identificar qual a intenção do campo, tanto visual, com o ícone, tanto escrito.
Exemplo:

Experimente e veja o resultado! :smiley:

Sinceramente estava procurando isso :D.
Utilizo muito esse conceito em formulários web.

Mas assim

[code]@FXML
private TextField tfUsuario;

tfUsuario.setPromptText(“Digite seu login”); [/code]

seria desta forma no Application.

Não não, na sua classe Controller (implements Initializable).

Utilize o método setPromptText dentro do método initialize, que seria seu “método main”.

Perfeito, Tinha dado certo, e que, como o foco estava no primeiro textfield, eu acabei nao vendo.
PERFEITO.