2016-05-10 21 views
0

Ich habe eine harte Zeit versucht, einen Kreis mit einem Bogen zu schneiden. Ich versuche, dieses ThermostatWie man einen Shape (Kreis) mit einem anderen Shape (Arc) in JavaFX clipste

Thermostat

von diesem video (starting at 43:45) zu reproduzieren, wo der Entwickler sagte, dass er Region s verwendet, Circle s und eine Arc für die Animation. Ich kann also nicht sehen, wie man den Kreis mit dem animierten Bogen schneidet.

Mein Code so weit ...

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

Und bekomme ich folgende Fehlermeldung:

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]). 

Wie kann dieses Problem lösen ?! Ich bin ein großer Fan von Messgeräten und Thermostat-Apps.

Vielen Dank im Voraus !!!

+0

Könnten Sie den Link zum Video bearbeiten zu gegebener Zeit zeigen? Dieses Video ist> 1h lang und sicherlich werde ich nicht das ganze Video anschauen, nur um eine Vorstellung von dem gewünschten Verhalten zu bekommen und ich bezweifle, dass viele andere ... – fabian

+0

@fabia Sorry, [this] (https://youtu.be/7is1WTtbZj4? T = 2623) ist die Position. Dank – Hayden

Antwort

0

Es gibt einen einfacheren Weg, um das gewünschte Ergebnis zu erreichen: Einfach mit Arc ohne fill und mit einem entsprechenden strokeWidth.

Beispiel:

@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

i runned Code und das ist, was ich habe: # # Ein schwerwiegender Fehler ist durch die Java Runtime Environment erkannt wurde: # # EXCEPTION_ILLEGAL_INSTRUCTION (0xc000001d) bei pc = 0x000007fee7115c01, pid = 8484, tid = 4996 # # JRE-Version: Java (TM) SE-Laufzeitumgebung (8.0_65-b17) (Build 1.8.0_65-b17) # Java-VM: Java HotSpot (TM) 64-Bit-Server-VM (25.65-b01 gemischter Modus windows-amd64 komprimierte oops) # Problemframe: # C [msvcr120.dll + 0x95c01] # – Hayden

+0

@Hayden Testete es mit Java 8u92 (arbeiten). Dies scheint mit diesem Fehler zu tun zu haben: https://bugs.openjdk.java.net/browse/JDK-8136754?page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel (zumindest auch dieser erwähnt einen problematischen Rahmen und msvcr120.dll). Leider kann ich dir bei diesem Problem nicht helfen. Es sollte mit einer Java-Version funktionieren, die diesen Fehler nicht enthält, damit Sie es mit einer anderen Java-Laufzeitumgebung verwenden können ... – fabian