2016-06-19 5 views
0

な下の画像のようにI透明のステージを作りたい、(Windows 7の)javaFXを使用して透明なウィンドウステージを作成するにはどうすればよいですか?

that is windows 7 gadget window.. it looks like a fully glass

だから私はそのフォームのscreencaptureメソッドを作ってみました..しかし、それは...

を混乱されましたここに私のコードでは、うまくいけば、それは問題でよりよく説明することができ、次のとおりです。

import javafx.application.*; 
import javafx.embed.swing.SwingFXUtils; 
import javafx.scene.*; 
import javafx.scene.control.*; 
import javafx.scene.effect.*; 
import javafx.scene.image.*; 
import javafx.scene.layout.*; 
import javafx.scene.paint.Color; 
import javafx.stage.Stage; 
import javafx.stage.StageStyle; 

public class Demo extends Application{ 
    private static final double BLUR_AMOUNT = 7; 
    private static final Effect myBlur = new BoxBlur(BLUR_AMOUNT, BLUR_AMOUNT, 3); 
    private static final ImageView background = new ImageView(); 
    private static final StackPane layout = new StackPane(); 

    private Button btn=new Button("hello"); 

    @Override 
    public void start(Stage stage) { 
     layout.getChildren().addAll(background,btn); 
     layout.setStyle("-fx-background-color: null"); 

     Scene scene = new Scene(layout,300, 300,Color.TRANSPARENT); 

     stage.initStyle(StageStyle.TRANSPARENT); 
     stage.setScene(scene); 
     stage.show(); 
     stage.setX(0); 
     stage.setY(0); 

     background.setImage(copyBackground(stage)); 
     background.setEffect(myBlur); 

     makeDraggable(stage); 
    } 

    private static class Delta { 
     double x,y; 
    } 

    public void makeDraggable(final Stage stage) { 
     final Delta dragDelta = new Delta(); 
     btn.setOnMousePressed(mouseEvent -> { 
      dragDelta.x = stage.getX() - mouseEvent.getScreenX(); 
      dragDelta.y = stage.getY() - mouseEvent.getScreenY();  
     }); 

     btn.setOnMouseDragged(mouseEvent -> { 
      stage.setX(mouseEvent.getScreenX() + dragDelta.x); 
      stage.setY(mouseEvent.getScreenY() + dragDelta.y); 
      btn.setOpacity(0.0); 
      background.setImage(copyBackground(stage)); 
     }); 

     btn.setOnMouseReleased(mouseEvent -> { 
      btn.setOpacity(1.0); 
     }); 
    } 

    private Image copyBackground(Stage stage) { 
     final int X = (int) stage.getX(); 
     final int Y = (int) stage.getY(); 
     final int W = (int) stage.getWidth(); 
     final int H = (int) stage.getHeight(); 

     try { 
      java.awt.Robot robot = new java.awt.Robot(); 
      java.awt.image.BufferedImage image = robot.createScreenCapture(new java.awt.Rectangle(X, Y, W, H)); 

      return SwingFXUtils.toFXImage(image, null); 
     } catch (java.awt.AWTException e) { 
      System.out.println("The robot of doom strikes!"); 
      return null; 
     } 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

答えて

0

あなたが見ている効果が得られる理由は、ロボットが窓あなたを含め、画面の一部のスナップショットを取っているということです作成しました。さらに、このスナップショットは、ステージのxyのプロパティが変更された後で、ウィンドウが実際に移動する前(したがって、変更されたプロパティの影響をロボットが認識する前)に発生します。したがって、間違った画像が生成されてしまいます。

簡単な修正を使用して、ステージを表示する前に、画面全体のスナップショットを作成し、その後、ステージ移動(または変更のサイズ)画像表示に適用されるビューポートを更新することである:不利に

import javafx.application.Application; 
import javafx.beans.binding.Bindings; 
import javafx.embed.swing.SwingFXUtils; 
import javafx.geometry.Rectangle2D; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.effect.BoxBlur; 
import javafx.scene.effect.Effect; 
import javafx.scene.image.Image; 
import javafx.scene.image.ImageView; 
import javafx.scene.layout.StackPane; 
import javafx.scene.paint.Color; 
import javafx.stage.Screen; 
import javafx.stage.Stage; 
import javafx.stage.StageStyle; 

public class Demo extends Application{ 
    private static final double BLUR_AMOUNT = 7; 
    private static final Effect myBlur = new BoxBlur(BLUR_AMOUNT, BLUR_AMOUNT, 3); 
    private static final ImageView background = new ImageView(); 
    private static final StackPane layout = new StackPane(); 

    private Button btn=new Button("hello"); 

    @Override 
    public void start(Stage stage) { 
     layout.getChildren().addAll(background,btn); 
     layout.setStyle("-fx-background-color: null"); 

     Scene scene = new Scene(layout,300, 300,Color.TRANSPARENT); 

     stage.initStyle(StageStyle.TRANSPARENT); 
     stage.setScene(scene); 
     stage.show(); 
     stage.setX(0); 
     stage.setY(0); 

     background.setImage(copyBackground(stage)); 

     background.viewportProperty().bind(Bindings.createObjectBinding(() -> 
      new Rectangle2D(stage.getX(), stage.getY(), stage.getWidth(), stage.getHeight()), 
      stage.xProperty(), stage.yProperty(), stage.widthProperty(), stage.heightProperty())); 

     background.setEffect(myBlur); 

     makeDraggable(stage); 
    } 

    private static class Delta { 
     double x,y; 
    } 

    public void makeDraggable(final Stage stage) { 
     final Delta dragDelta = new Delta(); 
     btn.setOnMousePressed(mouseEvent -> { 
      dragDelta.x = stage.getX() - mouseEvent.getScreenX(); 
      dragDelta.y = stage.getY() - mouseEvent.getScreenY();  
     }); 

     btn.setOnMouseDragged(mouseEvent -> { 
      stage.setX(mouseEvent.getScreenX() + dragDelta.x); 
      stage.setY(mouseEvent.getScreenY() + dragDelta.y); 
      btn.setOpacity(0.0); 
//   background.setImage(copyBackground(stage)); 
     }); 

     btn.setOnMouseReleased(mouseEvent -> { 
      btn.setOpacity(1.0); 
     }); 
    } 

    private Image copyBackground(Stage stage) { 

     Rectangle2D screen = Screen.getPrimary().getBounds() ; 

     final int X = (int) screen.getMinX(); 
     final int Y = (int) screen.getMinX(); 
     final int W = (int) screen.getWidth(); 
     final int H = (int) screen.getHeight(); 

     try { 
      java.awt.Robot robot = new java.awt.Robot(); 
      java.awt.image.BufferedImage image = robot.createScreenCapture(new java.awt.Rectangle(X, Y, W, H)); 

      return SwingFXUtils.toFXImage(image, null); 
     } catch (java.awt.AWTException e) { 
      System.out.println("The robot of doom strikes!"); 
      return null; 
     } 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

ここあなたのアプリケーションとは独立して起こるデスクトップへの変更を表すイメージではないということです。これに対処するには、WritableImageを使用して、その画像の一部を動的に更新することがあります。は、ウィンドウの位置が変更されるとウィンドウに覆われません。ここの論理はちょっと難しいかもしれませんが、それほど悪くはありません。

+0

あなたの答えはいいです..しかし、それは窓7エアロ効果のように動作しません..あなたがプログラムを実行した後、あなたは画面の背後に変更..しかし、プログラムの透明な外観は変更されません.... –

+0

はいそれが私が最後の段落で取り上げたものです。 –

+0

あなたは最後の段落で言ったwritableImageを使って正しいコードを私に送ることができますか? –

関連する問題