作为一名编程学生,我有一些项目正在进行中。一个项目是旅行商问题。 (https://en.wikipedia.org/wiki/Travelling_salesman_problem)。我有一个JAVAFX GUI的问题。我不知道如何在fxml中实现for循环,因为我需要从已检查城市到另一个已检查城市的所有行。 [1]:https://i.stack.imgur.com/wb8h3.png(已检查的城市是苏黎世,格拉鲁斯和贝林佐纳 - >所以我需要一些线来连接它们)。我只是想动态创建一些线条。所以你可以帮我解决这个问题吗?
这是控制器。
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.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 {
@FXML
private AnchorPane anchorPane;
@FXML
private ImageView img;
@FXML
private Line line;
public ArrayList<Line> getLines() {
return lines;
}
public void setLines(ArrayList<Line> lines) {
this.lines = lines;
}
private ArrayList<Stadt> stadte = new ArrayList<Stadt>();
@FXML
private ArrayList<Line> lines = new ArrayList<Line>();
@FXML
private Button test;
@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 handleButtonAction(ActionEvent event) {
//starter();
for (Stadt s : stadte) {
if (s.isIsClicked()) {
ausgewaehlt.add(s);
}
}
for (Stadt a : ausgewaehlt) {
System.out.println(a.getName());
line.setStartX(ausgewaehlt.get(0).getxCoord());
line.setStartY(ausgewaehlt.get(0).getyCoord());
line.setEndX(ausgewaehlt.get(1).getxCoord());
line.setEndY(ausgewaehlt.get(1).getyCoord());
lines.add(line);
//for the beginning I just wanted to add the first two citys
}
}
public void starter() {
stadte.add(new Stadt("Zug", zug.getLayoutX(), zug.getLayoutY(), check(zug)));
stadte.add(new Stadt("Zürich", 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 boolean check(RadioButton rb) {
if (rb.isSelected()) {
return true;
} else {
return false;
}
}
@Override
public void initialize(URL location, ResourceBundle resources) {
starter();
}
}
这是城市类:
package tsprealone;
/**
*
* @author kbwschuler
*/
public class Stadt {
private String name;
private double xCoord;
private double yCoord;
private boolean isClicked;
public Stadt(String name, double xCoord, double yCoord, boolean isClicked) {
this.name = name;
this.xCoord = xCoord;
this.yCoord = yCoord;
this.isClicked = isClicked;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getxCoord() {
return xCoord;
}
public void setxCoord(int xCoord) {
this.xCoord = xCoord;
}
public double getyCoord() {
return yCoord;
}
public void setyCoord(int yCoord) {
this.yCoord = yCoord;
}
public boolean isIsClicked() {
return isClicked;
}
public void setIsClicked(boolean isClicked) {
this.isClicked = isClicked;
}
}
这是主要课程:
package tsprealone;
import java.awt.Event;
import java.lang.reflect.Field;
import java.util.HashMap;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.layout.FlowPane;
import javafx.scene.shape.Line;
import javafx.stage.Stage;
/**
*
* @author kbwschuler
*/
public class TSPRealOne extends Application {
@Override
public void start(Stage stage) throws Exception {
FXMLDocumentController fx = new FXMLDocumentController();
Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
try {
launch(args);
Class<?> macFontFinderClass = Class.forName("com.sun.t2k.MacFontFinder");
Field psNameToPathMap = macFontFinderClass.getDeclaredField("psNameToPathMap");
psNameToPathMap.setAccessible(true);
psNameToPathMap.set(null, new HashMap<String, String>());
} catch (Exception e) {
}
}
}
这是fxml文件:
<?xml version="1.0" encoding="UTF-8"?>
<?import java.net.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.RadioButton?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane fx:id="anchorPane" prefHeight="773.0" prefWidth="1184.0" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" 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="sarnen" layoutX="589.0" layoutY="339.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="altdorf" layoutX="690.0" layoutY="332.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="test" layoutX="1035.0" layoutY="684.0" mnemonicParsing="false" text="Test" onAction="#handleButtonAction" />
</children>
</AnchorPane>