Manejo función batido de Aero de Windows con la barra de título personalizado

Charles LGN:

Hay muchos tutoriales o preguntas relacionadas con la barra de título personalizado con JavaFX

He creado una barra de título personalizado como esto:

barra personalizada

Puedo mover las ventanas, pero ahora (porque las ventanas es UNDECORATEDque no puedo aplicar cualquier función nativa de Windows como el Aero shake(si se agita una ventana, todas las demás aplicaciones se reducen)

¿Hay alguna solución para gestionar este tipo de función con una barra de título personalizado?

Aquí está mi código:

start.java:

@Override
public void start(Stage primaryStage) throws Exception{
    setPrimaryStage(primaryStage);
    prStage = primaryStage;
    Parent root = FXMLLoader.load(getClass().getResource("../gui/main.fxml"));
    prStage.initStyle(StageStyle.UNDECORATED);

    //prStage.setOpacity(0.75);
    Scene scene = new Scene(root, 640, 360);
    prStage.setScene(scene);
    prStage.getIcons().add(new Image("/resource/Images/icon.png"));
    scene.getStylesheets().add(getClass().getResource("..//gui/css/NewUICSS.css").toExternalForm());
    prStage.show();
}

controlador principal:

public class NewUIController {
    private static double xOffset = 0;
    private static double yOffset = 0;

    public void initialize() {
        moveBar.setOnMousePressed(this::mousePressed);
        moveBar.setOnMouseDragged(this::mouseDrag);
        moveBar.setOnMouseReleased(this::mouseRealease);

        mnuBar.setOnMousePressed(this::mousePressed);
        mnuBar.setOnMouseDragged(this::mouseDrag);
        mnuBar.setOnMouseReleased(this::mouseRealease);
    }

    private void mouseDrag(MouseEvent event){
        MainJavaFx.getPrimaryStage().setX(event.getScreenX() - xOffset);
        MainJavaFx.getPrimaryStage().setY(event.getScreenY() - yOffset);
    }

    private void mouseRealease(MouseEvent event){
        if(event.getSceneY() == 0){
            MainJavaFx.getPrimaryStage().setY(0);
        }else if(MainJavaFx.getPrimaryStage().getY() < 0){
            MainJavaFx.getPrimaryStage().setY(0);
        }
    }

    private void mousePressed(MouseEvent event){
        xOffset = event.getSceneX();
        yOffset = event.getSceneY();
    }

    public void close(){
        ((Stage)pnPrincipal.getScene().getWindow()).close();
    }
}
Charles LGN:

Todos estos problemas existen sólo en las ventanas, así que tenemos que utilizar un "estilo" que no sea el estilo sin decoración para gestionar todas las características de Windows.

Es necesario utilizar dos bibliotecas:

  • JNA: punto en usted ventanas
  • JNA-plataforma: crear un estilo apropiado
public void start(Stage primaryStage) throws Exception{
    setPrimaryStage(primaryStage);
    prStage = primaryStage;
    Parent root = FXMLLoader.load(getClass().getResource("../gui/NewUI2.fxml"));

    primaryStage.initStyle(StageStyle.UNDECORATED);
    primaryStage.setScene(new Scene(root, 1280, 720));
    Main.getPrimaryStage().getScene().getStylesheets().add(getClass().getResource("..//gui/css/main-black.css").toExternalForm());

    primaryStage.show();

    // verify if it is windows
    if(System.getProperty("os.name").indexOf("win") >= 0)
        long lhwnd = com.sun.glass.ui.Window.getWindows().get(0).getNativeWindow();
        Pointer lpVoid = new Pointer(lhwnd);
        WinDef.HWND hwnd = new WinDef.HWND(lpVoid);
        final User32 user32 = User32.INSTANCE;
        int oldStyle = user32.GetWindowLong(hwnd, WinUser.GWL_STYLE);
        int newStyle = oldStyle | 0x00020000;//WS_MINIMIZEBOX
        user32.SetWindowLong(hwnd, WinUser.GWL_STYLE, newStyle);
    }
}

Pero no sé si es la mejor manera de hacerlo.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=138215&siteId=1
Recomendado
Clasificación