Janelas inteiramente customizadas do JavaFX?

Eu gostaria de ter um aplicativo onde eu tenha personalizado totalmente a aparência da janela. Até agora eu aprendi que posso remover o material típico da janela com:

class Application extends javafx.application.Application { /** * Starts the application. * * @param stage */ override def start(stage: Stage) { stage.initStyle(StageStyle.TRANSPARENT) // Load the main window view. val loader = new FXMLLoader() loader.setLocation(getClass.getResource("/com/myproj/application/MainWindow.fxml")) val root = loader.load().asInstanceOf[Parent] val scene: Scene = new Scene(root, Color.TRANSPARENT) stage.setScene(scene) stage.show() } } 

Tudo o mais funciona bem, exceto que a janela arrastando, clicando duas vezes para maximizar, arrastando para a borda superior da canvas no Windows deve maximizar ativos, etc. Os resources nativos do Windows estão faltando totalmente.

Posso, de alguma maneira, personalizar facilmente toda a aparência da janela sem perder todos esses resources agradáveis.

Eu estou falando de algo como o Adobe Photoshop, que parece totalmente diferente, mas ainda mantém esses resources (ou implementa-los no topo da sua interface do usuário manualmente).

Seria um começo se eu pudesse pelo menos implementar arrastando + botões de janela para iniciantes. Estou direcionando Linux, Mac e Windows aqui.

Veja a aparência e a manipulação personalizadas da janela no aplicativo Ensemble Sample , que inclui o código-fonte. Faça o download do código – fonte , construa-o e execute-o como um aplicativo independente em vez de incorporado em um navegador. Não vai ser exatamente o que você está pedindo porque coisas como arrastar para a borda superior para ativar a maximização não vai funcionar, eu acho, mas deve estar bem perto e você pode sempre codificar algo que maximiza a janela quando foi arrastado perto da borda superior. A janela do Ensemble possui resources como decorações de redimensionamento personalizadas, minimizar, maximizar, fechar icons, uma área na parte superior da janela que você pode usar para arrastar a janela ou clicar duas vezes para maximizar ou minimizar a janela – ou seja, a maioria dos resources padrão seria de esperar de um sistema de janelas de mesa.

Para chegar a algo ainda mais perto do que você está pedindo, talvez você possa hackear algo criando duas janelas. Um, uma janela de palco decorada padrão que inclui bordas de canvas, o outro um estágio filho não decorado ou transparente sempre exibido na parte superior da janela principal e sobrepondo as bordas da janela principal com uma renderização personalizada. Eu acho que você pode ter dificuldades tentando implementar essa abordagem, então eu realmente não recomendaria isso.

Você pode tentar um estilo de palco UNDECORATED em vez de TRANSPARENT e ver se consegue uma melhor integração nativa do Windows com isso.

Há alguma solicitação de recurso aberta atualmente agendada para o JavaFX a ser fornecida com JDK8, Windows: suporte a efeitos de Aero Glass para janelas de nível superior , Mac: Suporte a NSTexturedBackgroundWindowMask estilo para janelas e O fundo branco sólido criado em um Palco deve ser criado – se necessário – no Scenegraph , que, quando implementado, provavelmente ajudará você a alcançar seu objective – votar neles, se tais resources forem importantes para você.

Aplicação de Amostra do Ensemble

Também checkout VFXWindows que é uma estrutura de janelas de código aberto para o JavaFX.

Atualizar

Também relacionado é o projeto Undecorator , que permite criar facilmente um estágio JavaFX com controles de cromo padrão minimizar / maximizar / fechar / resize, que são renderizados por meio do mecanismo JavaFX, em vez do sistema de janelas do SO. Isso permite que você obtenha o tipo de controle personalizado sobre a renderização de janelas que um aplicativo como o Ensemble exibe.

Você pode usar esta biblioteca. É um estágio JavaFx totalmente personalizável (CustomStage). Você pode ver uma descrição detalhada de como usá-lo neste Wiki do CustomStage

Tem,

  • Redimensionamento de janelas
  • Botões de ação padrão e seu comportamento (fechar, maximizar / restaurar, minimizar)
  • Janela arrastando
  • A janela é dimensionada automaticamente para a resolução da canvas
  • Muito responsivo
  • Estilizável (via CSS e methods)
  • Pode conseguir transparência
  • Tem painéis de navegação e gavetas embutidos
  • etc.