2016-03-30 17 views
-2

Ich habe ein Projekt in der Klasse, wo ich eine Ampel mit nur drei Kreisen anzeigen muss. Ich begann mit der gelben und versuchte dann, an irgendeiner anderen Stelle eine rote Farbe hinzuzufügen, nur um zu sehen, ob ich es könnte, aber die gelbe ist die einzige, die zeigt. Ich kann nicht sagen, ob der rote irgendwie unter dem gelben liegt, aber auf jeden Fall macht es für mich keinen Sinn, warum der rote Kreis nicht angezeigt wird.Mehr als einen Kreis in Java erstellen

package tryingGraphicsStuff; 
import javafx.application.Application; 
import javafx.stage.Stage; 
import javafx.scene.Scene; 
import javafx.scene.layout.StackPane; 
import javafx.scene.shape.Circle; 
import javafx.scene.paint.*; 
import javafx.scene.text.*; 
import javafx.scene.control.*; 

public class TryingGraphicsStuff extends Application{ 
    @Override 
    public void start(Stage stage) throws Exception { 
     // create circle 
       Circle circle = new Circle(); 
       circle.setCenterX(150); 
       circle.setCenterY(150); 
       circle.setRadius(50); 
       circle.setFill(Color.RED); 
       // place on pane 
       StackPane p = new StackPane(); 
       p.getChildren().add(circle); 
       // ensure it stays centered if window resized 
       //circle.centerXProperty().bind(p.widthProperty().divide(2)); 
       //circle.centerYProperty().bind(p.heightProperty().divide(2)); 

       Circle circleTwo = new Circle(); 
       circleTwo.setCenterX(400); 
       circleTwo.setCenterY(400); 
       circleTwo.setRadius(50); 
       circleTwo.setFill(Color.YELLOW); 
       // place on pane 
       p.getChildren().add(circleTwo); 


       // create scene from pane 
       Scene scene = new Scene(p, 300, 1000); 

       // place scene on stage 
       stage.setTitle("Circle"); 
       stage.setScene(scene); 
       stage.show(); 
    } 
    public static void main (String [] args) 
    { 
     Application.launch(args); 
    } 

} 

Antwort

1

Ja, Ihre beiden Kreise sind überlappend. Sie können einfach VBox anstelle von StackPane verwenden. Es wird Ihr Problem lösen.

VBox p = new VBox(); 
-1

Ich bin eigentlich ein bisschen durch den obigen Code verwirrt. Nach Ihren Zahlen sollte die rote die eine zeigen und nicht die gelbe. Deine Szene ist nur 300 Pixel breit und du zentrierst den gelben Kreis bei 400, was ihn außer Sichtweite bringt (mit einem Radius von nur 50).

Entweder Ihre Szenengröße erhöhen oder zu Ihrem Kreis innerhalb Ihrer Ansicht bewegen.

+1

Nein, beide 'Circle's sind auf dem Bildschirm, aber die gelbe ist über die rote gemalt. Sie können dies leicht überprüfen, indem Sie 'Color.YELLOW.deriveColor (0, 1, 1, 0.5)' (gelb mit Alpha = 0.5) anstelle von 'Color.YELLOW' verwenden, was dazu führt, dass ein orangefarbener Kreis angezeigt wird. – fabian

2

A StackPane "legt seine Kinder in einem Back-to-Front-Stack out". (Der Stapel ist hier in Z-Koordinaten). Es ist ein "Layoutbereich", der die Platzierung der untergeordneten Knoten für Sie verwaltet. Folglich werden die centerX und centerY Eigenschaften der Kreise ignoriert, und sie scheinen eine auf der anderen in der Reihenfolge, wie sie hinzugefügt werden (so die rote unterhalb der gelben, und die einzige, die Sie sehen, ist die gelbe) . Standardmäßig zentriert das Stapelfenster sie.

Alle "Layout-Bereiche" positionieren die Knoten für Sie. Beispiel: Ein VBox positioniert Knoten in einem vertikalen Stapel, wobei der erste oben, der zweite unten usw. ist. Wenn Sie also eine VBox anstelle eines StackPane verwendet, würden die Kreise untereinander erscheinen (in der y-Richtung), aber beachten Sie würden sie immer noch nicht respektieren die centerX und centerY Eigenschaften.

Die Pane Klasse selbst nicht das Layout der untergeordneten Knoten verwalten; Wenn Sie also die Koordinaten für Formobjekte verwenden möchten, ist Pane wahrscheinlich die beste Option. Group verhält sich ähnlich, aber übernimmt die Grenzen der Union seiner untergeordneten Grenzen, so verhält es sich wie Pane, aber sein lokales Koordinatensystem ist anders.

Die folgende Demo zeigt alle diese Optionen. Auch hier wird Pane derjenige sein, der sich auf intuitive Weise verhält.

import javafx.application.Application; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.control.Tab; 
import javafx.scene.control.TabPane; 
import javafx.scene.layout.Pane; 
import javafx.scene.layout.StackPane; 
import javafx.scene.layout.VBox; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Circle; 
import javafx.stage.Stage; 

public class CircleLayoutExample extends Application { 

    @Override 
    public void start(Stage primaryStage) { 

     TabPane tabs = new TabPane(); 

     tabs.getTabs().add(createTab(new StackPane())); 
     tabs.getTabs().add(createTab(new VBox())); 
     tabs.getTabs().add(createTab(new Pane())); 
     tabs.getTabs().add(createTab(new Group())); 

     Scene scene = new Scene(tabs, 600, 600); 
     primaryStage.setScene(scene); 

     primaryStage.show(); 
    } 

    private Tab createTab(Pane pane) { 
     Circle c1 = new Circle(150, 150, 50, Color.RED); 
     Circle c2 = new Circle(400, 400, 50, Color.YELLOW); 

     pane.getChildren().addAll(c1, c2); 

     Tab tab = new Tab(pane.getClass().getSimpleName()); 
     tab.setContent(pane); 
     return tab ; 
    } 

    // annoyingly, Pane and Group do not have a common superclass with a getChildren() 
    // method, so just reproduce the code... 
    private Tab createTab(Group pane) { 
     Circle c1 = new Circle(150, 150, 50, Color.RED); 
     Circle c2 = new Circle(400, 400, 50, Color.YELLOW); 

     pane.getChildren().addAll(c1, c2); 

     Tab tab = new Tab(pane.getClass().getSimpleName()); 
     tab.setContent(pane); 
     return tab ; 
    } 
    public static void main(String[] args) { 
     launch(args); 
    } 
} 

enter image description here

enter image description here

enter image description here

enter image description here

0

Wie andere Antworten haben vorgeschlagen, eine VBox verwenden würden Sie die hier helfen, da es wird automatisch setzen ihre Kinder in eine vertikale Reihe.Hier ist ein kurzer Schnipsel mit einem Array (so können Sie so viele Kreise, wie Sie wollen)

import javafx.application.Application; 
import javafx.geometry.Pos; 
import javafx.stage.Stage; 
import javafx.scene.Scene; 
import javafx.scene.layout.VBox; 
import javafx.scene.shape.Circle; 
import javafx.scene.paint.*; 

public class TryingGraphicsStuff extends Application{ 
    @Override 
    public void start(Stage stage) throws Exception { 

      Circle[] circle = new Circle[3];   // create 3 circles 
      VBox vBox = new VBox();     // vbox will put circles in vertical row 
      vBox.setAlignment(Pos.CENTER);   // center circles 

      for(int i = 0; i < circle.length; i++){ 
       circle[i] = new Circle(50);   // initialize circles with radius of 50 
       vBox.getChildren().add(circle[i]); 
      } 

      circle[0].setFill(Color.RED); 
      circle[1].setFill(Color.YELLOW); 
      circle[2].setFill(Color.GREEN); 

      // add vbox to scene 

      Scene scene = new Scene(vBox, 300, 800); 
      stage.setTitle("Circle"); 
      stage.setScene(scene); 
      stage.show(); 
    } 
    public static void main (String [] args){ 
     Application.launch(args); 
    } 

} 

Wie immer bitte den Code verstehen und nicht nur gedankenlos kopieren und einfügen. Prost!

Verwandte Themen