File src/salesman/data/Data.java changed (mode: 100644) (index 77d21cb..76c0a3b) |
1 |
1 |
package salesman.data; |
package salesman.data; |
2 |
2 |
|
|
|
3 |
|
import javafx.collections.ArrayChangeListener; |
|
4 |
|
import javafx.collections.FXCollections; |
|
5 |
|
import javafx.collections.ObservableArray; |
|
6 |
|
import javafx.scene.canvas.Canvas; |
|
7 |
|
import javafx.scene.canvas.GraphicsContext; |
|
8 |
|
import salesman.ui.MainWindowController; |
|
9 |
|
|
3 |
10 |
import java.util.Random; |
import java.util.Random; |
4 |
11 |
|
|
5 |
12 |
public class Data { |
public class Data { |
6 |
|
City[] cities; |
|
7 |
|
double[][] distances; |
|
8 |
|
Order bestEver; |
|
|
13 |
|
private City[] cities; |
|
14 |
|
private double[][] distances; |
|
15 |
|
private Order bestEver; |
|
16 |
|
|
|
17 |
|
private ObservableArray currentOrder = FXCollections.observableIntegerArray(); |
|
18 |
|
|
9 |
19 |
|
|
10 |
20 |
public Data(int number){ |
public Data(int number){ |
11 |
21 |
Random r = new Random(); |
Random r = new Random(); |
|
... |
... |
public class Data { |
14 |
24 |
|
|
15 |
25 |
|
|
16 |
26 |
for(int i=0;i<number;i++){ |
for(int i=0;i<number;i++){ |
17 |
|
cities[i] = new City(r.nextInt(600),r.nextInt(780),i); |
|
|
27 |
|
cities[i] = new City(r.nextInt(770),r.nextInt(560),i); |
18 |
28 |
} |
} |
19 |
29 |
|
|
20 |
30 |
for (int i = 0; i <number; i++) { |
for (int i = 0; i <number; i++) { |
|
... |
... |
public class Data { |
22 |
32 |
distances[i][j]=City.getDistancce(cities[i],cities[j]); |
distances[i][j]=City.getDistancce(cities[i],cities[j]); |
23 |
33 |
} |
} |
24 |
34 |
} |
} |
|
35 |
|
|
|
36 |
|
currentOrder.addListener(new ArrayListener()); |
25 |
37 |
}//constructor int number |
}//constructor int number |
26 |
38 |
|
|
27 |
39 |
public Data(City[] cities){ |
public Data(City[] cities){ |
|
... |
... |
public class Data { |
37 |
49 |
distances[i][j] = Math.sqrt((deltaX*deltaX)+(deltaY*deltaY)); |
distances[i][j] = Math.sqrt((deltaX*deltaX)+(deltaY*deltaY)); |
38 |
50 |
} |
} |
39 |
51 |
} |
} |
|
52 |
|
|
|
53 |
|
currentOrder.addListener(new ArrayListener()); |
40 |
54 |
//constructor City[] |
//constructor City[] |
41 |
55 |
} |
} |
42 |
56 |
|
|
|
... |
... |
public class Data { |
47 |
61 |
public double[][] getDistances() { |
public double[][] getDistances() { |
48 |
62 |
return distances; |
return distances; |
49 |
63 |
} |
} |
|
64 |
|
|
|
65 |
|
|
|
66 |
|
|
|
67 |
|
private class ArrayListener implements ArrayChangeListener { |
|
68 |
|
|
|
69 |
|
@Override |
|
70 |
|
public void onChanged(ObservableArray observableArray, boolean sizeChanged, int from, int to) { |
|
71 |
|
MainWindowController.repaint.set(true); |
|
72 |
|
} |
|
73 |
|
} |
50 |
74 |
} |
} |
File src/salesman/data/ObservableBoolean.java added (mode: 100644) (index 0000000..4c9bb02) |
|
1 |
|
package salesman.data; |
|
2 |
|
|
|
3 |
|
import javafx.beans.InvalidationListener; |
|
4 |
|
import javafx.beans.value.ChangeListener; |
|
5 |
|
import javafx.beans.value.ObservableBooleanValue; |
|
6 |
|
|
|
7 |
|
import java.util.ArrayList; |
|
8 |
|
import java.util.EventListener; |
|
9 |
|
import java.util.List; |
|
10 |
|
|
|
11 |
|
public class ObservableBoolean implements ObservableBooleanValue { |
|
12 |
|
|
|
13 |
|
private boolean value; |
|
14 |
|
private List<ChangeListener> changeListeners = new ArrayList<>(); |
|
15 |
|
|
|
16 |
|
@Override |
|
17 |
|
public boolean get() { |
|
18 |
|
return value = false; |
|
19 |
|
} |
|
20 |
|
|
|
21 |
|
public void set(boolean toSet){ |
|
22 |
|
boolean oldValue = value; |
|
23 |
|
value=toSet; |
|
24 |
|
for (ChangeListener listener :changeListeners) { |
|
25 |
|
listener.changed(this,oldValue,value); |
|
26 |
|
} |
|
27 |
|
} |
|
28 |
|
|
|
29 |
|
@Override |
|
30 |
|
public void addListener(ChangeListener<? super Boolean> listener) { |
|
31 |
|
changeListeners.add(listener); |
|
32 |
|
} |
|
33 |
|
|
|
34 |
|
@Override |
|
35 |
|
public void removeListener(ChangeListener<? super Boolean> listener) { |
|
36 |
|
changeListeners.remove(listener); |
|
37 |
|
} |
|
38 |
|
|
|
39 |
|
@Override |
|
40 |
|
public Boolean getValue() { |
|
41 |
|
return value; |
|
42 |
|
} |
|
43 |
|
|
|
44 |
|
@Override |
|
45 |
|
public void addListener(InvalidationListener listener) { |
|
46 |
|
|
|
47 |
|
} |
|
48 |
|
|
|
49 |
|
@Override |
|
50 |
|
public void removeListener(InvalidationListener listener) { |
|
51 |
|
|
|
52 |
|
} |
|
53 |
|
} |
File src/salesman/ui/MainWindow.fxml changed (mode: 100644) (index d47859a..6918f71) |
1 |
1 |
<?xml version="1.0" encoding="UTF-8"?> |
<?xml version="1.0" encoding="UTF-8"?> |
2 |
2 |
|
|
|
3 |
|
<?import javafx.scene.canvas.Canvas?> |
3 |
4 |
<?import javafx.scene.chart.CategoryAxis?> |
<?import javafx.scene.chart.CategoryAxis?> |
4 |
5 |
<?import javafx.scene.chart.LineChart?> |
<?import javafx.scene.chart.LineChart?> |
5 |
6 |
<?import javafx.scene.chart.NumberAxis?> |
<?import javafx.scene.chart.NumberAxis?> |
|
12 |
13 |
<?import javafx.scene.layout.AnchorPane?> |
<?import javafx.scene.layout.AnchorPane?> |
13 |
14 |
<?import javafx.scene.layout.ColumnConstraints?> |
<?import javafx.scene.layout.ColumnConstraints?> |
14 |
15 |
<?import javafx.scene.layout.GridPane?> |
<?import javafx.scene.layout.GridPane?> |
15 |
|
<?import javafx.scene.layout.Pane?> |
|
16 |
16 |
<?import javafx.scene.layout.RowConstraints?> |
<?import javafx.scene.layout.RowConstraints?> |
17 |
17 |
<?import javafx.scene.layout.VBox?> |
<?import javafx.scene.layout.VBox?> |
18 |
18 |
|
|
|
35 |
35 |
</rowConstraints> |
</rowConstraints> |
36 |
36 |
<children> |
<children> |
37 |
37 |
<Label text="Anzahl Städte" /> |
<Label text="Anzahl Städte" /> |
38 |
|
<TextField text="10" GridPane.columnIndex="1" fx:id="txtFieldNumCities"/> |
|
|
38 |
|
<TextField fx:id="txtFieldNumCities" text="10" GridPane.columnIndex="1" /> |
39 |
39 |
<ComboBox fx:id="cBalgorithm" prefWidth="150.0" promptText="Algorithmus" GridPane.columnSpan="2" GridPane.halignment="CENTER" GridPane.rowIndex="1" /> |
<ComboBox fx:id="cBalgorithm" prefWidth="150.0" promptText="Algorithmus" GridPane.columnSpan="2" GridPane.halignment="CENTER" GridPane.rowIndex="1" /> |
40 |
40 |
</children> |
</children> |
41 |
41 |
</GridPane> |
</GridPane> |
|
71 |
71 |
<tabs> |
<tabs> |
72 |
72 |
<Tab text="TSP"> |
<Tab text="TSP"> |
73 |
73 |
<content> |
<content> |
74 |
|
<Pane fx:id="paneCities" onMouseClicked="#paneCitiesMouseClick" prefHeight="600.0" prefWidth="800.0" style="-fx-background-color: #FFFFFF;" /> |
|
|
74 |
|
<AnchorPane> |
|
75 |
|
<children> |
|
76 |
|
<Canvas fx:id="canvasCities" height="558.0" width="770.0" AnchorPane.bottomAnchor="1.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" /> |
|
77 |
|
</children> |
|
78 |
|
</AnchorPane> |
75 |
79 |
</content> |
</content> |
76 |
80 |
</Tab> |
</Tab> |
77 |
81 |
<Tab text="Daten"> |
<Tab text="Daten"> |
File src/salesman/ui/MainWindowController.java changed (mode: 100644) (index 57e82cd..ddb0880) |
... |
... |
import javafx.collections.FXCollections; |
6 |
6 |
import javafx.collections.ObservableList; |
import javafx.collections.ObservableList; |
7 |
7 |
import javafx.fxml.FXML; |
import javafx.fxml.FXML; |
8 |
8 |
import javafx.fxml.FXMLLoader; |
import javafx.fxml.FXMLLoader; |
|
9 |
|
import javafx.scene.canvas.Canvas; |
|
10 |
|
import javafx.scene.canvas.GraphicsContext; |
9 |
11 |
import javafx.scene.control.ComboBox; |
import javafx.scene.control.ComboBox; |
10 |
12 |
import javafx.scene.control.TextField; |
import javafx.scene.control.TextField; |
11 |
13 |
import javafx.scene.input.MouseEvent; |
import javafx.scene.input.MouseEvent; |
12 |
14 |
import javafx.scene.layout.GridPane; |
import javafx.scene.layout.GridPane; |
13 |
|
import javafx.scene.layout.Pane; |
|
14 |
15 |
import javafx.scene.layout.VBox; |
import javafx.scene.layout.VBox; |
|
16 |
|
import javafx.scene.paint.Color; |
|
17 |
|
import salesman.data.City; |
15 |
18 |
import salesman.data.Data; |
import salesman.data.Data; |
|
19 |
|
import salesman.data.ObservableBoolean; |
16 |
20 |
|
|
17 |
21 |
import java.io.IOException; |
import java.io.IOException; |
18 |
22 |
|
|
|
... |
... |
public class MainWindowController { |
21 |
25 |
@FXML |
@FXML |
22 |
26 |
private ComboBox cBalgorithm; |
private ComboBox cBalgorithm; |
23 |
27 |
@FXML |
@FXML |
24 |
|
private Pane paneCities; |
|
|
28 |
|
private Canvas canvasCities; |
25 |
29 |
@FXML |
@FXML |
26 |
30 |
private VBox upperMenu; |
private VBox upperMenu; |
27 |
31 |
@FXML |
@FXML |
28 |
|
private static TextField txtFieldNumCities; |
|
|
32 |
|
private TextField txtFieldNumCities; |
29 |
33 |
|
|
30 |
|
public static int getNumOfCities(){ |
|
31 |
|
return Integer.valueOf(txtFieldNumCities.getText()); |
|
|
34 |
|
public int getNumOfCities() { |
|
35 |
|
return Integer.valueOf(txtFieldNumCities. |
|
36 |
|
getText()); |
32 |
37 |
} |
} |
|
38 |
|
|
33 |
39 |
public static Data data = new Data(10); |
public static Data data = new Data(10); |
|
40 |
|
public static ObservableBoolean repaint = new ObservableBoolean(); |
34 |
41 |
|
|
35 |
42 |
private GridPane actualMenu; |
private GridPane actualMenu; |
36 |
43 |
|
|
37 |
44 |
|
|
38 |
45 |
@FXML |
@FXML |
39 |
|
public void initialize(){ |
|
|
46 |
|
public void initialize() { |
40 |
47 |
try { |
try { |
41 |
48 |
loadNewMenu("BrutForce"); |
loadNewMenu("BrutForce"); |
42 |
49 |
} catch (IOException e) { |
} catch (IOException e) { |
|
... |
... |
public class MainWindowController { |
51 |
58 |
//TODO implement menu changes |
//TODO implement menu changes |
52 |
59 |
} |
} |
53 |
60 |
}); |
}); |
54 |
|
ObservableList<String> items= FXCollections.observableArrayList(); |
|
|
61 |
|
ObservableList<String> items = FXCollections.observableArrayList(); |
55 |
62 |
cBalgorithm.setItems(items); |
cBalgorithm.setItems(items); |
56 |
63 |
cBalgorithm.getItems().add("BrutForce"); |
cBalgorithm.getItems().add("BrutForce"); |
57 |
|
} |
|
58 |
64 |
|
|
|
65 |
|
repaint.addListener(new RepaintListener()); |
|
66 |
|
repaint.set(true); |
|
67 |
|
|
|
68 |
|
}//initialize() |
59 |
69 |
|
|
60 |
|
private void loadNewMenu(String menuName)throws IOException { |
|
61 |
|
GridPane newMenu=null; |
|
62 |
|
switch (menuName){ |
|
|
70 |
|
|
|
71 |
|
private void loadNewMenu(String menuName) throws IOException { |
|
72 |
|
GridPane newMenu = null; |
|
73 |
|
switch (menuName) { |
63 |
74 |
case "BrutForce": |
case "BrutForce": |
64 |
|
newMenu = FXMLLoader.load(getClass().getResource("MenuBrutForce.fxml")); |
|
|
75 |
|
FXMLLoader loader = new FXMLLoader(getClass().getResource("MenuBrutForce.fxml")); |
|
76 |
|
BrutForceController c = new BrutForceController(this); |
|
77 |
|
loader.setController(c); |
|
78 |
|
newMenu = loader.load(); |
65 |
79 |
break; |
break; |
66 |
80 |
default: |
default: |
67 |
81 |
throw new IllegalArgumentException("String 'menuName' didn't match aany menu available"); |
throw new IllegalArgumentException("String 'menuName' didn't match aany menu available"); |
68 |
82 |
} |
} |
69 |
|
if(!(actualMenu ==null)) |
|
70 |
|
upperMenu.getChildren().remove(actualMenu); |
|
|
83 |
|
if (!(actualMenu == null)) |
|
84 |
|
upperMenu.getChildren().remove(actualMenu); |
71 |
85 |
upperMenu.getChildren().add(newMenu); |
upperMenu.getChildren().add(newMenu); |
72 |
|
actualMenu=newMenu; |
|
|
86 |
|
actualMenu = newMenu; |
73 |
87 |
} |
} |
74 |
88 |
|
|
75 |
89 |
@FXML |
@FXML |
76 |
|
public void paneCitiesMouseClick(MouseEvent event){ |
|
|
90 |
|
public void paneCitiesMouseClick(MouseEvent event) { |
77 |
91 |
//TODO implement city-generation here |
//TODO implement city-generation here |
78 |
92 |
} |
} |
|
93 |
|
|
|
94 |
|
|
|
95 |
|
|
|
96 |
|
|
|
97 |
|
|
|
98 |
|
|
|
99 |
|
private class RepaintListener implements ChangeListener<Boolean> { |
|
100 |
|
|
|
101 |
|
@Override |
|
102 |
|
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) { |
|
103 |
|
int numCities =getNumOfCities(); |
|
104 |
|
if (newValue) { |
|
105 |
|
GraphicsContext gc = canvasCities.getGraphicsContext2D(); |
|
106 |
|
gc.clearRect(0, 0, canvasCities.getWidth(), canvasCities.getHeight()); |
|
107 |
|
for (int i = 0; i < numCities; i++) { |
|
108 |
|
City current = data.getCities()[i]; |
|
109 |
|
City next; |
|
110 |
|
if ((i + 1) > numCities - 1) { |
|
111 |
|
next = data.getCities()[0]; |
|
112 |
|
} else { |
|
113 |
|
next = data.getCities()[i + 1]; |
|
114 |
|
} |
|
115 |
|
|
|
116 |
|
|
|
117 |
|
|
|
118 |
|
gc.setStroke(new Color(0, 0, 0, 1)); |
|
119 |
|
gc.setFill((Color.GRAY)); |
|
120 |
|
gc.fillOval(current.getX()-5, current.getY()-5, 10, 10); |
|
121 |
|
gc.strokeLine(current.getX(),current.getY(),next.getX(),next.getY()); |
|
122 |
|
|
|
123 |
|
} |
|
124 |
|
repaint.set(false); |
|
125 |
|
} |
|
126 |
|
} |
|
127 |
|
} |
79 |
128 |
} |
} |