对于coords序列的错误的线条图

时间:2017-01-10 17:19:08

标签: java eclipse javafx fxml scenebuilder

这是一个显示我的问题的GIF:

Click here for gif

在我的示例中:当我单击单选按钮时,必须按此顺序生成行-> sion -> sarnen -> altdorf -> bellinzona并形成一个空格(梯形)但不幸的是我的代码会切换第二个和第三个位置的坐标。我已经和其他城市一起尝试过,所以也许fxml可能会出错(我不认为)。它必须是类FXMLDocumentController中的代码。我在控制台输入了这个输出:

Sarnen            
Line[startX=600.0, startY=347.0, endX=803.0, endY=594.0, stroke=0x000000ff, strokeWidth=1.0]
Line[startX=803.0, startY=594.0, endX=373.0, endY=585.0, stroke=0x000000ff, strokeWidth=1.0]
Line[startX=373.0, startY=585.0, endX=702.0, endY=347.0, stroke=0x000000ff, strokeWidth=1.0]
Line[startX=702.0, startY=347.0, endX=600.0, endY=347.0, stroke=0x000000ff, strokeWidth=1.0]
Bellinzona   
Sion    
Altdorf

这意味着只有第一个sarnen被创建然后是bellinzona然后是sion然后是altdorf。

FXMLDocumentController:我个人认为方法starter()并没有这样做,所以应该先看看

package tsprealone;

import java.net.URL;
import java.util.ArrayList;
import java.util.ResourceBundle;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
//import javafx.scene.control.Alert;
//import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.Button;
import javafx.scene.control.RadioButton;
import javafx.scene.shape.Line;
import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;

/**
 *
 * @author kbwschuler
 */
public class FXMLDocumentController implements Initializable {
    // private Alert alert = new Alert(AlertType.WARNING); just a message box 
    @FXML
    private AnchorPane anchorPane;
    @FXML
    private ImageView img;

    @FXML
    private ArrayList<Stadt> stadte = new ArrayList<Stadt>();
    @FXML
    private ArrayList<Line> lines = new ArrayList<Line>();
    @FXML
    private Button generiere;
    @FXML
    private RadioButton zug;
    @FXML
    private RadioButton zurich;
    @FXML
    private RadioButton schaffhausen;
    @FXML
    private RadioButton stgallen;
    @FXML
    private RadioButton aarau;
    @FXML
    private RadioButton chur;
    @FXML
    private RadioButton glarus;
    @FXML
    private RadioButton frauenfeld;
    @FXML
    private RadioButton schwyz;
    @FXML
    private RadioButton luzern;
    @FXML
    private RadioButton sarnen;
    @FXML
    private RadioButton bellinzona;
    @FXML
    private RadioButton sion;
    @FXML
    private RadioButton liestal;
    @FXML
    private RadioButton bern;
    @FXML
    private RadioButton delemont;
    @FXML
    private RadioButton solothurn;
    @FXML
    private RadioButton fribourg;
    @FXML
    private RadioButton neuchatel;
    @FXML
    private RadioButton lausanne;
    @FXML
    private RadioButton genf;
    @FXML
    private RadioButton altdorf;
    @FXML
    private RadioButton stans;
    @FXML
    private RadioButton basel;
    @FXML
    private RadioButton appenzell;
    @FXML
    private RadioButton herisau;

    private ArrayList<Stadt> ausgewaehlt = new ArrayList<Stadt>(); //check if is checked

    @FXML
    private void clearPane(ActionEvent event)
    {
        //anchorPane.getChildren().clear();
        anchorPane.getChildren().removeAll(lines);
        lines.clear();
        anchorPane.getChildren().removeAll(ausgewaehlt);
        ausgewaehlt.clear();

        RadioButton[] allRadioButtons = new RadioButton[] {
                zug, zurich, schaffhausen, stgallen, aarau, chur, glarus, frauenfeld, schwyz, luzern, sarnen, bellinzona, sion, liestal, bern, delemont, solothurn, fribourg, neuchatel, lausanne, genf, altdorf, stans, basel, appenzell, herisau
        };
        for (int i = 0; i < allRadioButtons.length; i++) {
            RadioButton setToUnSelected = allRadioButtons[i];
            for (Stadt stadtToUnSelected : stadte) {
                stadtToUnSelected.setIsClicked(false);
            }
            setToUnSelected.setSelected(false);
        }


    }
    @FXML
    private void handleButtonAction(ActionEvent event) {
        addCities();

        for (Stadt stadt : stadte) {
            if (stadt.isIsClicked()) {
                ausgewaehlt.add(stadt);
                if(ausgewaehlt.size() == 1)
                {

                    /*alert.setTitle("Warnung");
                    alert.setHeaderText("Schau, eine Warnung wurde herausgegeben!");
                    alert.setContentText("Du hast nur eine Stadt ausgewählt. Um das Programm korrekt laufen zu lassen, muss man mehr als eine Stadt auswählen.");

                    alert.showAndWait();
                    System.err.println("Nur eine Stadt ausgewählt");*/
                    //alles kommentiere adel
                }
            }
        }

        starter();
        for (Stadt stadt : ausgewaehlt) {
            System.out.println(stadt.getName());

            for(Line line: lines)
            {

                    try {
                        anchorPane.getChildren().add(line);
                        do {
                            System.out.println(line);
                        }
                        while(ausgewaehlt.size() < lines.size());

                    }catch(IllegalArgumentException e)
                    {


                    }

            }

        }
    }


    public void addCities(){

        stadte.add(new Stadt("Zug", zug.getLayoutX(), zug.getLayoutY(), check(zug)));
        stadte.add(new Stadt("Zurich", zurich.getLayoutX(), zurich.getLayoutY(), check(zurich)));
        stadte.add(new Stadt("Schaffhausen", schaffhausen.getLayoutX(), schaffhausen.getLayoutY(), check(schaffhausen)));
        stadte.add(new Stadt("Aarau", aarau.getLayoutX(), aarau.getLayoutY(), check(aarau)));
        stadte.add(new Stadt("Chur", chur.getLayoutX(), chur.getLayoutY(), check(chur)));
        stadte.add(new Stadt("Glarus", glarus.getLayoutX(), glarus.getLayoutY(), check(glarus)));
        stadte.add(new Stadt("Frauenfeld", frauenfeld.getLayoutX(), frauenfeld.getLayoutY(), check(frauenfeld)));
        stadte.add(new Stadt("Schwyz", schwyz.getLayoutX(), schwyz.getLayoutY(), check(schwyz)));
        stadte.add(new Stadt("Luzern", luzern.getLayoutX(), luzern.getLayoutY(), check(luzern)));
        stadte.add(new Stadt("Sarnen", sarnen.getLayoutX(), sarnen.getLayoutY(), check(sarnen)));
        stadte.add(new Stadt("Bellinzona", bellinzona.getLayoutX(), bellinzona.getLayoutY(), check(bellinzona)));
        stadte.add(new Stadt("Sion", sion.getLayoutX(), sion.getLayoutY(), check(sion)));
        stadte.add(new Stadt("Liestal", liestal.getLayoutX(), liestal.getLayoutY(), check(liestal)));
        stadte.add(new Stadt("Bern", bern.getLayoutX(), bern.getLayoutY(), check(bern)));
        stadte.add(new Stadt("Delemont", delemont.getLayoutX(), delemont.getLayoutY(), check(delemont)));
        stadte.add(new Stadt("Solothurn", solothurn.getLayoutX(), solothurn.getLayoutY(), check(solothurn)));
        stadte.add(new Stadt("Fribourg", fribourg.getLayoutX(), fribourg.getLayoutY(), check(fribourg)));
        stadte.add(new Stadt("Neuchatel", neuchatel.getLayoutX(), neuchatel.getLayoutY(), check(neuchatel)));
        stadte.add(new Stadt("Lausanne", lausanne.getLayoutX(), lausanne.getLayoutY(), check(lausanne)));
        stadte.add(new Stadt("Genf", genf.getLayoutX(), genf.getLayoutY(), check(genf)));
        stadte.add(new Stadt("Altdorf", altdorf.getLayoutX(), altdorf.getLayoutY(), check(altdorf)));
        stadte.add(new Stadt("Stans", stans.getLayoutX(), stans.getLayoutY(), check(stans)));
        stadte.add(new Stadt("Basel", basel.getLayoutX(), basel.getLayoutY(), check(basel)));
        stadte.add(new Stadt("Appenzell", appenzell.getLayoutX(), appenzell.getLayoutY(), check(appenzell)));
        stadte.add(new Stadt("Herisau", herisau.getLayoutX(), herisau.getLayoutY(), check(herisau)));
        stadte.add(new Stadt("St Gallen", stgallen.getLayoutX(), stgallen.getLayoutY(), check(stgallen)));

    }

    public void starter() {

        for(int i = 0; i<ausgewaehlt.size(); i++)
        {
                if(i != ausgewaehlt.size() - 1){ 

                    lines.add(new Line(ausgewaehlt.get(i).getxCoord() + 9, ausgewaehlt.get(i).getyCoord() + 9, ausgewaehlt.get(i+1).getxCoord() + 9, ausgewaehlt.get(i+1).getyCoord() + 9));
                }else {
                    lines.add(new Line(ausgewaehlt.get(i).getxCoord() + 9, ausgewaehlt.get(i).getyCoord() + 9, ausgewaehlt.get(0).getxCoord() + 9, ausgewaehlt.get(0).getyCoord() + 9));
                }

        }



    }

    public boolean check(RadioButton rb) {
        if (rb.isSelected()) {
            return true;
        } else {
            return false;
        }
    }

    @Override
    public void initialize(URL location, ResourceBundle resources) {

        //addCities();
        //starter();
    }

}

FXMLDocument.fxml:

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.net.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.RadioButton?>
<?import javafx.scene.image.*?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.*?>

<AnchorPane fx:id="anchorPane" prefHeight="773.0" prefWidth="1184.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="tsprealone.FXMLDocumentController">
  <children>

    <ImageView fx:id="img" fitHeight="771.0" fitWidth="1184.0">
      <image>
        <Image url="@schweizerkarte-schweiz.png" />
      </image>
    </ImageView>
    <RadioButton fx:id="zug" layoutX="659.0" layoutY="228.0" mnemonicParsing="false" prefHeight="0.0" prefWidth="0.0" style="-fx-color: red;" />
    <RadioButton fx:id="zurich" layoutX="659.0" layoutY="166.0" mnemonicParsing="false" prefHeight="0.0" prefWidth="0.0" style="-fx-color: red;" />
    <RadioButton fx:id="stgallen" layoutX="873.0" layoutY="145.0" mnemonicParsing="false" prefHeight="0.0" prefWidth="0.0" style="-fx-color: red;" />
    <RadioButton fx:id="schaffhausen" layoutX="682.0" layoutY="51.0" mnemonicParsing="false" prefHeight="0.0" prefWidth="0.0" style="-fx-color: red;" />
    <RadioButton fx:id="aarau" layoutX="538.0" layoutY="159.0" mnemonicParsing="false" prefHeight="0.0" prefWidth="0.0" style="-fx-color: red;" />
    <RadioButton fx:id="chur" layoutX="909.0" layoutY="344.0" mnemonicParsing="false" prefHeight="0.0" prefWidth="0.0" style="-fx-color: red;" />
    <RadioButton fx:id="glarus" layoutX="794.0" layoutY="275.0" mnemonicParsing="false" prefHeight="0.0" prefWidth="0.0" style="-fx-color: red;" />
    <RadioButton fx:id="frauenfeld" layoutX="746.0" layoutY="94.0" mnemonicParsing="false" prefHeight="0.0" prefWidth="0.0" style="-fx-color: red;" />
    <RadioButton fx:id="schwyz" layoutX="694.0" layoutY="293.0" mnemonicParsing="false" prefHeight="0.0" prefWidth="0.0" style="-fx-color: red;" />
    <RadioButton fx:id="luzern" layoutX="599.0" layoutY="275.0" mnemonicParsing="false" prefHeight="0.0" prefWidth="0.0" style="-fx-color: red;" />
    <RadioButton fx:id="bellinzona" layoutX="794.0" layoutY="585.0" mnemonicParsing="false" prefHeight="0.0" prefWidth="0.0" style="-fx-color: red;" />
    <RadioButton fx:id="sion" layoutX="364.0" layoutY="576.0" mnemonicParsing="false" prefHeight="0.0" prefWidth="0.0" style="-fx-color: red;" />
    <RadioButton fx:id="liestal" layoutX="462.0" layoutY="121.0" mnemonicParsing="false" prefHeight="0.0" prefWidth="0.0" style="-fx-color: red;" />
    <RadioButton fx:id="bern" layoutX="382.0" layoutY="315.0" mnemonicParsing="false" prefHeight="0.0" prefWidth="0.0" style="-fx-color: red;" />
    <RadioButton fx:id="delemont" layoutX="367.0" layoutY="168.0" mnemonicParsing="false" prefHeight="0.0" prefWidth="0.0" style="-fx-color: red;" />
    <RadioButton fx:id="solothurn" layoutX="408.0" layoutY="225.0" mnemonicParsing="false" prefHeight="0.0" prefWidth="0.0" style="-fx-color: red;" />
    <RadioButton fx:id="fribourg" layoutX="319.0" layoutY="367.0" mnemonicParsing="false" prefHeight="0.0" prefWidth="0.0" style="-fx-color: red;" />
    <RadioButton fx:id="neuchatel" layoutX="258.0" layoutY="302.0" mnemonicParsing="false" prefHeight="0.0" prefWidth="0.0" style="-fx-color: red;" />
    <RadioButton fx:id="lausanne" layoutX="180.0" layoutY="474.0" mnemonicParsing="false" prefHeight="0.0" prefWidth="0.0" style="-fx-color: red;" />
    <RadioButton fx:id="genf" layoutX="53.0" layoutY="576.0" mnemonicParsing="false" prefHeight="0.0" prefWidth="0.0" style="-fx-color: red;" />
    <RadioButton fx:id="stans" layoutX="622.0" layoutY="306.0" mnemonicParsing="false" prefHeight="0.0" prefWidth="0.0" style="-fx-color: red;" />
    <RadioButton fx:id="basel" layoutX="423.0" layoutY="94.0" mnemonicParsing="false" prefHeight="0.0" prefWidth="0.0" style="-fx-color: red;" />
    <RadioButton fx:id="appenzell" layoutX="882.0" layoutY="169.0" mnemonicParsing="false" prefHeight="0.0" prefWidth="0.0" style="-fx-color: red;" />
    <RadioButton fx:id="herisau" layoutX="849.0" layoutY="154.0" mnemonicParsing="false" prefHeight="0.0" prefWidth="0.0" style="-fx-color: red;" />
    <Button fx:id="generiere" layoutX="1035.0" layoutY="640.0" mnemonicParsing="false" onAction="#handleButtonAction" text="Generiere Linien" />
     <Button fx:id="clear" layoutX="1035.0" layoutY="690.0" mnemonicParsing="false" onAction="#clearPane" text="Lösche Linien" />
    <RadioButton fx:id="sarnen" layoutX="591.0" layoutY="338.0" mnemonicParsing="false" prefHeight="0.0" prefWidth="0.0" style="-fx-color: red;" />
    <RadioButton fx:id="altdorf" layoutX="693.0" layoutY="338.0" mnemonicParsing="false" prefHeight="0.0" prefWidth="0.0" style="-fx-color: red;" />
  </children>
</AnchorPane>

2 个答案:

答案 0 :(得分:1)

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    ...
    <configuration>
        <argLine>-Djava.security.manager -Djava.security.policy=mypolicy.policy</argLine>
    </configuration>
</plugin>

这会按照mvn -Dtest=TestCircle#xyz test -DargLine="-Djava.security.manager -Djava.security.policy=mypolicy.policy" 列表中出现的顺序添加城市。这可能与用户点击按钮的顺序相同也可能不同......

在这种情况下,它不是......

更好的想法是在选择时向列表中添加for (Stadt stadt : stadte) { if (stadt.isIsClicked()) { ausgewaehlt.add(stadt); if(ausgewaehlt.size() == 1) { /*alert.setTitle("Warnung"); alert.setHeaderText("Schau, eine Warnung wurde herausgegeben!"); alert.setContentText("Du hast nur eine Stadt ausgewählt. Um das Programm korrekt laufen zu lassen, muss man mehr als eine Stadt auswählen."); alert.showAndWait(); System.err.println("Nur eine Stadt ausgewählt");*/ //alles kommentiere adel } } } 。我建议为stadte添加RadioButton个实例,而不是将它们添加到列表中。同时从类中删除Stadt属性(或如何调用它),因为这似乎没有必要。

RadioButton
clicked

答案 1 :(得分:0)

看起来你的第二个和第三个标记点在你的ArrayList中是第三个和第四个。

似乎是因为在这个循环中

for (Stadt stadt : stadte) {
        if (stadt.isIsClicked()) {
            ausgewaehlt.add(stadt); 
}

城市按照FXMLDocument中的订单排序。

我建议您在点击城市点时将列表添加到列表中。当您结束标记并单击“Generiere Linien”按钮时,您应该渲染链接的线条。