사용자 정의 제목 표시 줄과 윈도우 에어로 쉐이크 기능 관리

찰스 LGN :

자바 FX와 사용자 정의 제목 표시 줄에 관련된 많은 튜토리얼이나 질문이 있습니다

이 같은 사용자 정의 제목 표시 줄을 생성 :

사용자 정의 바

창문이기 때문에 (현재 창을 이동할 수 있지만 UNDECORATED내가 원하는 기본 Windows 기능을 적용 할 수 없습니다 Aero shake(당신이 창을 흔들 경우, 다른 모든 응용 프로그램이 감소)

사용자 정의 제목 표시 줄과 기능의 유형을 관리 할 수있는 솔루션이 있습니까?

여기 내 코드는 다음과 같습니다

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();
}

메인 컨트롤러 :

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();
    }
}
찰스 LGN :

우리가 제공하는 모든 창을 관리하기 위해 꾸며지지 않은 스타일보다는 다른 "스타일"을 사용할 필요가 있으므로 이러한 모든 문제는 Windows에서만 존재한다.

두 라이브러리를 사용합니다 :

  • JNA : 당신 창에 점
  • JNA - 플랫폼 : 적절한 스타일을 만들
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);
    }
}

그것은 그렇게 할 수있는 가장 좋은 방법입니다하지만 나도 몰라.

추천

출처http://43.154.161.224:23101/article/api/json?id=138210&siteId=1