Fiz algumas modificações no meu projeto. Introduzi a classe ScenesLoader após a criação da classe Scene, que exigia do programador a definição de estilos para cada cena criada. Até aqui, tudo bem; no entanto, estou enfrentando um problema: a classe ScenesLoader não está carregando apenas minhas cenas, mas também minhas views e estilos. Pensei em abordar isso por meio de parâmetros, já que criei uma classe para carregar as views e estilos anteriormente. Contudo, ainda estou indeciso, pois parece que seria estranho delegar a responsabilidade de instanciar esses elementos para dentro delas. Minhas views e styles têm classes próprias para carregar, mas mesmo passando-as como parâmetros, estaria instanciando as classes ViewLoader e StylesLoader dentro da classe ScenesLoader, o que me parece errado. GitHub - Dione783/Javafx_Chat: Projeto em javafx para meu curso técnico
Olhando por cima aqui, eu mudaria um pouco a classe SceneLoader
.
- Não vejo muito sentido em ter propriedades
private
estatic
nesse seu caso. Se a ideia é ter apenas uma única instância deSceneLoader
(que é o que faz sentido pra mim), então propriedades comostatic
não agrega muito. - Talvez seja uma boa inicializar
StyleLoader
eViewLoader
no construtor e usá-los para inicializar todas as scenes pelo métodoloadScenes()
msm que depende desses 2 caras. - Uma sugestão (talvez não seja a melhor) é usar um
Map
para armazenar suas scenes e manter os nomes de cada scene como constantes. Assim, no métodoloadNextScene
vc apenas recuperaria desse map a scene recebida como string via parâmetro.
É só uma sugestão e bem provável que pode ser melhorado ou ter algo equivocado:
public class ScenesLoader {
private static Map<String, Scene> SCENES = new HashMap<>();
public static String LOGIN = "login":
public static String REGISTER = "register":
public static String ROOM = "room":
private final Stage stage;
private final ViewLoader views;
private final StyleLoader styles;
public ScenesLoader() {
stage = new Stage();
views = new ViewLoader();
styles = new StyleLoader();
initScenes();
initStage();
}
private void initScenes(){
SCENES.put(LOGIN, new Scene(views.getLogin(),styles.getLoginCss()));
SCENES.put(REGISTER, new Scene(views.getRegister(),styles.getRegisterCss()));
SCENES.put(ROOM, new Scene(views.getRoom(),styles.getRoomCss()));
}
private void initStage() {
stage.setTitle("Chat Application");
loadScene(LOGIN);
stage.show();
}
public void loadScene(String sceneName) {
Scene scene = SCENES.get(sceneName)
if (scene == null) {
throw new IllegalArgumentException("Scene " + sceneName + " não encontrada.")
}
stage.setScene(scene.getScene());
}
}
1 curtida
Valeu, gostei da ideia de utilizar o método map
. Não costumo usar muito isso, e realmente, em relação aos métodos private
e static
, faz todo sentido. Tentei evitar a instanciação desnecessária de uma classe, mas acabei fazendo ambos os erros, o que foi uma falha da minha parte. Foi meio burro da minha parte, mas agora entendi melhor. Obrigado pela dica!