diff options
Diffstat (limited to 'src/jcgp/gui/settings/testcase')
| -rw-r--r-- | src/jcgp/gui/settings/testcase/TestCaseTable.java | 124 | 
1 files changed, 124 insertions, 0 deletions
| diff --git a/src/jcgp/gui/settings/testcase/TestCaseTable.java b/src/jcgp/gui/settings/testcase/TestCaseTable.java new file mode 100644 index 0000000..605b75e --- /dev/null +++ b/src/jcgp/gui/settings/testcase/TestCaseTable.java @@ -0,0 +1,124 @@ +package jcgp.gui.settings.testcase; + +import java.util.ArrayList; + +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; +import javafx.collections.ObservableList; +import javafx.event.EventHandler; +import javafx.scene.Scene; +import javafx.scene.control.TableColumn; +import javafx.scene.control.TableColumn.CellDataFeatures; +import javafx.scene.control.TableView; +import javafx.stage.Stage; +import javafx.stage.WindowEvent; +import javafx.util.Callback; +import jcgp.backend.modules.problem.TestCaseProblem; +import jcgp.backend.modules.problem.TestCaseProblem.TestCase; +import jcgp.backend.resources.Resources; +import jcgp.gui.GUI; + +/** + * This is a test case table. For problems that have test cases,  + * this table shows the test case inputs and outputs. Clicking on  + * a test case (one is shown per row) applies the values to all  + * chromosome inputs shows the calculated values throughout the chromosome. + *  + * @author Eduardo Pedroni + * + */ +public class TestCaseTable extends Stage { + +	private TableView<TestCase<Object>> table; + +	/** +	 * Make a new instance of {@code TestCaseTable}. +	 *  +	 * @param testCaseProblem the {@code TestCaseProblem} whose data must be displayed. +	 * @param gui a reference to the GUI. +	 */ +	public TestCaseTable(final TestCaseProblem<Object> testCaseProblem, final GUI gui) { +		super(); +		 +		Resources resources = gui.getExperiment().getResources(); +		 +		// create the actual table view +		table = new TableView<TestCase<Object>>(); +		// get test cases from problem +		ObservableList<TestCase<Object>> testCaseList = testCaseProblem.getTestCases(); +		 +		// prepare input and output columns +		ArrayList<TableColumn<TestCase<Object>, String>> inputs = new ArrayList<TableColumn<TestCase<Object>, String>>(resources.inputs()); +		ArrayList<TableColumn<TestCase<Object>, String>> outputs = new ArrayList<TableColumn<TestCase<Object>, String>>(resources.outputs()); + +		// create input columns +		TableColumn<TestCase<Object>, String> tc; +		for (int i = 0; i < resources.inputs(); i++) { +			tc = new TableColumn<TestCase<Object>, String>("I: " + i); +			inputs.add(tc); +			final int index = i; +			tc.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<TestCase<Object>,String>, ObservableValue<String>>() { +				@Override +				public ObservableValue<String> call(CellDataFeatures<TestCase<Object>, String> param) { +					// create a new string property and give it the test case value, no need for dynamic binding - this wont change often +					return new SimpleStringProperty(param.getValue().getInputs()[index].toString()); +				} +			}); +			tc.setSortable(false); +			// set column width so all columns are distributed across the width of the stage +			tc.prefWidthProperty().bind(table.widthProperty().divide(resources.inputs() + resources.outputs())); +		} +		 +		// create output columns +		for (int o = 0; o < resources.outputs(); o++) { +			tc = new TableColumn<TestCase<Object>, String>("O: " + o); +			outputs.add(tc); +			final int index = o; +			tc.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<TestCase<Object>,String>, ObservableValue<String>>() { +				@Override +				public ObservableValue<String> call(CellDataFeatures<TestCase<Object>, String> param) { +					// create a new string property and give it the test case value, no need for dynamic binding - this wont change often +					return new SimpleStringProperty(param.getValue().getOutputs()[index].toString()); +				} +			}); +			tc.setSortable(false); +			// set column width so all columns are distributed across the width of the stage +			tc.prefWidthProperty().bind(table.widthProperty().divide(resources.inputs() + resources.outputs())); +		} +		 +		// add created columns +		table.getColumns().addAll(inputs); +		table.getColumns().addAll(outputs); +		 +		// populate table with actual data +		table.setItems(testCaseList); +		 +		// apply test case values when a new test case is selected +		table.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<TestCase<Object>>() { +			@Override +			public void changed(ObservableValue<? extends TestCase<Object>> observable,	TestCase<Object> oldValue, TestCase<Object> newValue) { +				gui.evaluateTestCase(newValue); +			} +		}); +		 +		// when the stage is closed, clear the selection +		// this doesn't work if the stage is closed by the program for some reason... +		setOnCloseRequest(new EventHandler<WindowEvent>() { +			@Override +			public void handle(WindowEvent event) { +				gui.hideGeneValues(); +				table.getSelectionModel().clearSelection(); +			} +		}); +		 +		setScene(new Scene(table)); +	} + +	/** +	 * @return a reference to the actual table of test cases. +	 */ +	public TableView<TestCase<Object>> getTable() { +		return table; +	} +} | 
