2016-05-10 25 views
0

円で弧を描くのに苦労しています。私は、開発者は、彼がアニメーションのためRegion秒、Circle sおよびArcを使用したことを言ったこのvideo (starting at 43:45)からこのサーモスタットJavaFXで別の図形(円弧)を使用して図形(円)をクリップする方法

Thermostat

を再現しようとしています。だから私はアニメーションアークで円をクリップする方法を見ることができません。

私のコード今のところ...

//stroke is the circle without fill 
    stroke.setClip(arc); 

そして、私は次のエラーを取得する:

Caused by: java.lang.IllegalArgumentException: Node's clip set to incorrect value (node already connected, node = Circle[id=stroke, centerX=0.0, centerY=0.0, radius=200.0, fill=0x1f93ff00, stroke=0x63ff26ff, strokeWidth=30.0], clip = ObjectProperty [bean: Circle[id=stroke, centerX=0.0, centerY=0.0, radius=200.0, fill=0x1f93ff00, stroke=0x63ff26ff, strokeWidth=30.0], name: clip, value: null]). 

それでは、どのようにこの問題を解決することができます!私はゲージやサーモスタットアプリの巨大なファンです。

ありがとうございます!!!

+0

はあなたが適切な時間を指すように動画へのリンクを編集できますか?このビデオは1時間以上ですが、確かに私はビデオ全体を見るだけで目的の行動を知ることはできません。私は多くの人がそうしているとは思っていません。 – fabian

+0

@fabia申し訳ありません、[this](https://youtu.be /7is1WTtbZj4Δt= 2623)は位置である。おかげ – Hayden

答えて

0

Arcfillなしで、適​​切なstrokeWidthを使用しないで簡単に行うことができます。

例:

@Override 
public void start(Stage primaryStage) { 
    DoubleProperty value = new SimpleDoubleProperty(); 
    DoubleProperty minValue = new SimpleDoubleProperty(); 
    DoubleProperty maxValue = new SimpleDoubleProperty(); 

    final double startOffset = 10; 
    final double maxRange = 360 - 2 * startOffset; 

    Arc arc = new Arc(); 
    arc.setFill(null); 

    arc.setRadiusX(100); 
    arc.setRadiusY(100); 

    arc.setCenterX(110); 
    arc.setCenterY(110); 

    arc.setStrokeWidth(10); 
    arc.setStroke(Color.WHITE.deriveColor(0, 0, 1, 0.5)); 
    arc.setStartAngle(270 - startOffset); 
    arc.lengthProperty().bind(value.subtract(minValue).divide(maxValue.subtract(minValue)).multiply(-maxRange)); 

    Pane thermostatPane = new Pane(); 
    thermostatPane.setMinSize(220, 220); 
    thermostatPane.getChildren().add(arc); 
    thermostatPane.setStyle("-fx-background-color: orange"); 

    Slider minSlider = new Slider(0, 100, 0); 
    Slider maxSlider = new Slider(0, 100, 100); 
    Slider valueSlider = new Slider(0, 100, 20); 

    valueSlider.setPrefWidth(200); 
    maxSlider.setPrefWidth(200); 
    minSlider.setPrefWidth(200); 

    value.bind(valueSlider.valueProperty()); 
    minValue.bind(minSlider.valueProperty()); 
    maxValue.bind(maxSlider.valueProperty()); 

    Scene scene = new Scene(new VBox(10, thermostatPane, minSlider, valueSlider, maxSlider)); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 
+0

私はあなたのコードをrunned、これは私が得たものである:致命的なエラーがJavaランタイム環境で検出された ##:PCで # #のEXCEPTION_ILLEGAL_INSTRUCTION(0xc000001d)= 0x000007fee7115c01、PID = 8484、TID = 4996 # #JREバージョン:Java(TM)SEランタイム環境(8.0_65-b17)(ビルド1.8.0_65-b17) #Java VM:Java HotSpot™64ビットサーバーVM(25.65-b01混合モードwindows-amd64圧縮されたoops) #問題フレーム: #C [msvcr120.dll + 0x95c01] # – Hayden

+0

@Hayden @Haydenは、java 8u92(作業中)を使用してテストしました。これはこのバグに関連しているようです:https://bugs.openjdk.java.net/browse/JDK-8136754?page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel(少なくともその1つ問題のあるフレームとmsvcr120.dllについて言及しています)。残念ながら、私はその問題であなたを助けることはできません。このバグを含んでいないjavaバージョンで動作するはずなので、別のJavaランタイムを使用して動作させることができます... – fabian

関連する問題