JavaFX Problema con posición de rectángulo.

Iniciado por coke951, Agosto 01, 2015, 05:43:06 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Agosto 01, 2015, 05:43:06 PM Ultima modificación: Agosto 01, 2015, 05:58:58 PM por coke951
Que tal de nuevo, creo que ya empiezo a ser frecuente por aqui... haha.
Bueno, en mi loca mente se me ocurrió hacer algo así:
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Tengo un punto de venta y estoy agregando una forma para agregar un producto de forma rapida utilizando una ventana pequeña, el problema es que al momento de que no llene algún campo correctamente no tengo espacio para avisarle cual es la razón por la cual no se puede agregar el producto al sistema, obviamente podía hacer mas grande la ventana para ponerle un mensajito con eso o crear un dialogo, pero eso seria demasiado facil, asi que intente hacer algo asi como lo de arriba, y casi... CASI lo logro...

He mirado por Internet pero no encontré un tutorial que me ayudara, bueno, mi ingles es bastante malo y no terminaba por entender del todo, así que intentare explicar un poco lo que hice.
Aviso desde ya, soy demasiado malo programando, así que si lo ven y les quiere dar un tic en el ojo, porfavor, háganse volita y rueden.
Todo lo he hecho con fxml.

Es en mi clase principal en donde creo tanto la ventana de dialogo para crear un producto rapido como el stackpane que utilice para "obscurecer" el dialogo y aparecer la notificacion enfrente
clase principal: PuntoVentaApp
Código: java
	
//Crear ventana de dialogo para crear un producto rapido
public void crearProductoDialogo(){
try{
FXMLLoader loader = new FXMLLoader();
loader.setLocation(PuntoVentaApp.class.getResource("vista/CrearProducto.fxml"));
anchPane = (AnchorPane) loader.load();

Stage dialogStage = new Stage();
dialogStage.setTitle("Crear producto rapido");
dialogStage.initModality(Modality.WINDOW_MODAL);
dialogStage.initOwner(getEscenaPrincipal());

Scene scene = new Scene(anchPane);
dialogStage.setScene(scene);
dialogStage.setResizable(true);

CrearProductoControlador controlador = loader.getController();
controlador.setDialogStage(dialogStage);
controlador.setPuntoVenta(this);
dialogStage.showAndWait();
}catch(Exception e){
e.printStackTrace();
}
}

public AnchorPane getAnchorPane(){
return anchPane;
}
        //Crear la ventana de la notificacion
public StackPane alertaError(String error){
alertaFondo = null;
try{
FXMLLoader loader = new FXMLLoader();
loader.setLocation(PuntoVentaApp.class.getResource("vista/AlertaFondo.fxml"));
alertaFondo = (StackPane) loader.load();

AlertaFondoControlador controlador = loader.getController();
controlador.setPane(alertaFondo);
controlador.setPuntoVenta(this);
controlador.setError(error);
}catch(Exception e){
e.printStackTrace();
}

return alertaFondo;
}

public StackPane getAlertaError(){
return alertaFondo;
}


Algo así es la ventana del dialogo:


Utilice un stackpane en la alerta luego utilice un gridpane 1x1 para colocar el rectangulo blanco, dentro de ese gridpane coloque otro gridpane de 1x2, en el espacio de arriba coloque el label el cual mostrara el error y en el espacio de abajo coloque el boton para cerrar la notificacion o dialogo o no se como llamarle, ambos componentes (label, button) los centre, el label lo puse con valignment bottom y al button top, para que quedaran juntos.

Algo asi en el scene builder:




Ahora, cuando ocurre un problema y quiero que aparezca esa notificacion, lo llamo de esta forma:
clase: CrearProductoControlador
Código: java

                if(!error.equals("")){
puntoVenta.alertaError(error); //Le mando un string con la descripcion del error
puntoVenta.getAnchorPane().getChildren().add(puntoVenta.getAlertaError()); //agrego a la escena el stackpane de la notificacion(?)
}


Entonces si vamos a la parte del controlador de la notificacion, es algo asi:
clase: AlertaFondoControlador
Código: java


public class AlertaFondoControlador {
private StackPane pane;
private PuntoVentaApp puntoVenta;

@FXML
private Button btnCerrar;
@FXML
private Label lblError;
@FXML
private Rectangle rectangulo;

@FXML
private void initialize(){

}

@FXML
private void cerrar(){
puntoVenta.getAnchorPane().getChildren().remove(pane);
}

public void setError(String error){
lblError.setText(error);
//A veces la longitud de los mensajes pueden variar, en teoria esto me ayuda a que el rectangulo cambie su forma segun lo vaya necesitando ->
rectangulo.widthProperty().bind(Bindings.add(lblError.widthProperty(), btnCerrar.widthProperty()));
rectangulo.heightProperty().bind(Bindings.add(lblError.heightProperty(), btnCerrar.heightProperty()));
}

public void setPane(StackPane alertaFondo){
this.pane = alertaFondo;
}

public void setPuntoVenta(PuntoVentaApp puntoVenta){
this.puntoVenta = puntoVenta;
}
}


Y bueno, ya que explique un poco lo que hice, este es mi problema:


Todo funciona CASI bien, hace el pane trasparente bien, pone el mensaje del error bien, el problema esta en el rectángulo que se pone donde el quiere.

AHORA, algo misterioso que aun no comprendo, note que cuando hacia clic en OK para cerrar la notificación el rectangulo se centraba de forma correcta y luego claro se cerraba, entonces fui probando y cuando hacia clic en OK pero no dejaba de presionar el boton, el rectángulo se centraba de forma correcta, movía el mouse fuera del OK como si me hubiera arrepentido de presionar el boton, entonces todo esta bien, no se muy bien por que esto ocurre. en el peor de los casos es por que estoy utilizando windows 10.



Entonces, ¿como puedo solucionar el problema del cuadro magico?
Espero que me puedan ayudar, y lo siento si no me di a entender, por favor si ocurre esto, avísenme.

Gracias de antemano. Saludos!