You are on page 1of 7

Interfaces Persona Computador (IPC)

Examen de Prácticas – 30 de Mayo de 2016

Alumno: Grupo de prácticas:

 Este examen consta de 4 cuestiones.


 Cada cuestión aporta 0.50 puntos a la calificación del examen.
 Contestar a cada cuestión en los recuadros habilitados para ello.
 En la última hoja de este examen hay un anexo con información de la
API útil para contestar las cuestiones.
 Duración del examen: Una hora y 15 minutos.

1. (0.50 puntos). Considérese la jerarquía en Scene Builder que se


muestra en la figura. Se pide dibujar su ventana de previsualización.
2. (0.50 puntos). Considérese una aplicación cuya
ventana se muestra en la figura. En su controlador,
se ha escrito el siguiente código:

public class FXMLDocumentController


implements Initializable {
@FXML
private LineChart<String, Number> chart;
@FXML
private CategoryAxis xAxis;
@FXML
private NumberAxis yAxis;

@Override
public void initialize(URL url,
ResourceBundle rb) {
String[] months = {"Ene", "Feb", "Mar",
"Abr", "May", "Jun", "Jul", "Ago",
"Sep", "Oct", "Nov", "Dic"};
int[] data1 = buildData(months.length);
int[] data2 = buildData(months.length);
yAxis.setLabel("MEuros");
xAxis.setLabel("Months");
buildChart(months, data1, data2, "Import", "Export");
}

private int[] buildData(int n) {


// método que genera un array de enteros, siendo n la longitud del array
}

private void buildChart(String[] a, int[] b, int[] c, String d, String e) {


// método que construye las series de datos y las añade al LineChart
// Una serie: - se construye con los arrays a y b
// - se etiqueta en la leyenda del gráfico con d
// Otra serie: - se construye con los arrays a y c
// - se etiqueta en la leyenda del gráfico con e
}
}

Se pide implementar el método buildChart, teniendo en cuenta las indicaciones anteriores y la figura de
ejemplo de ejecución.

private void buildChart(String[] a, int[] b, int[] c, String d, String e) {


XYChart.Series<String, Number> s1 = new XYChart.Series();
XYChart.Series<String, Number> s2 = new XYChart.Series();
for (int i = 0; i < a.length; i++) {
s1.getData().add(new XYChart.Data<>(a[i], b[i]));
s2.getData().add(new XYChart.Data<>(a[i], c[i]));
}
s1.setName(d);
s2.setName(e);
chart.getData().addAll(s1, s2);
}
3. (0.50 puntos). Dado el siguiente código, y suponiendo que la escena contiene una etiqueta y un botón
correctamente asociados con los miembros del controlador, se pide modificar el código para que:
a) La etiqueta muestre el texto “Computing…” antes de empezar el cálculo realizado por la tarea.
b) La etiqueta muestre el resultado de la tarea cuando acabe.

public class FXMLDocumentController implements Initializable {


@FXML
private Label label;
@FXML
private void handleButtonAction(ActionEvent event) {
Task<Long> task = new Task<Long>() {
@Override
protected Long call() throws Exception {
Random r = new Random();
long total = 0, end = r.nextInt(1000);
for (long i = 0 ; i < end; i++) {
total += i*i;
}
return total;
}
};
Thread t = new Thread(task);
t.setDaemon(true);
t.start();
}
@Override
public void initialize(URL url, ResourceBundle rb) {
}
}

public class FXMLDocumentController implements Initializable {


@FXML
private Label label;
@FXML
private void handleButtonAction(ActionEvent event) {
Task<Long> task = new Task<Long>() {
@Override
protected Long call() throws Exception {
Random r = new Random();
long total = 0, end = r.nextInt(1000);
for (long i = 0 ; i < end; i++) {
total += i*i;
}
return total;
}
};
task.setOnSucceeded(new EventHandler<WorkerStateEvent> () {
@Override
public void handle(WorkerStateEvent event) {
label.setText(task.getValue().toString());
}
});
label.setText("Computing...");
Thread t = new Thread(task);
t.setDaemon(true);
t.start();
}
@Override
public void initialize(URL url, ResourceBundle rb) {
}
}
4. Considérese una aplicación cuya ventana se muestra en la
figura. Téngase en cuenta que:
1º) En la correspondiente clase controlador se han declarado los
siguientes atributos relativos a la tabla y sus columnas:
@FXML
private TableView<Person> tableView;
@FXML
private TableColumn<Person, Integer> idColumn;
@FXML
private TableColumn<Person, String> nameColumn;
@FXML
private TableColumn<Person, Boolean> adultColumn;

2º) Los datos mostrados en la tabla proceden de una clase Person


cuyos atributos se han declarado así:
private final IntegerProperty id = new SimpleIntegerProperty();
private final StringProperty name = new SimpleStringProperty();
private final BooleanProperty isAdult = new SimpleBooleanProperty();

3º) Para que la tercera columna de la tabla muestre una imagen (Check.png, si la persona es mayor de edad;
Cancel.png, en caso contrario), se ha escrito el siguiente código:

adultColumn.setCellFactory(celda -> {
return new TableCell<Person, Boolean>() {
ImageView view = new ImageView();
@Override
protected void updateItem(Boolean item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setGraphic(null);
} else {
String file = "/icons/";
if (item.booleanValue()) file += "Check.png";
else file += "Cancel.png";
Image image = new Image(
VistaTablaController.class.getResourceAsStream(file),
16, 16, true, true);
view.setImage(image);
setGraphic(view);
}
};
};
});

Responda a los siguientes 2 apartados:

a) (0.20 puntos). Escribir el código necesario, en el método initialize del controlador, para que las
columnas de la tabla muestren los atributos correspondientes de la clase Person.

idColumn.setCellValueFactory(
new PropertyValueFactory<Person, Integer>("id"));
nameColumn.setCellValueFactory(
new PropertyValueFactory<Person, String>("name"));
adultColumn.setCellValueFactory(
new PropertyValueFactory<Person, Boolean>("isAdult"));
b) (0.30 puntos). ¿Qué cambios habría que realizar en el código proporcionado si se sustituye el atributo
isAdult por age, que almacena la edad de la persona, tal y como se muestra en el siguiente código?

@FXML
private TableColumn<Person, Integer> adultColumn;

private final IntegerProperty age = new SimpleIntegerProperty();

adultColumn.setCellValueFactory(
new PropertyValueFactory<Person, Integer>("age"));

adultColumn.setCellFactory(celda -> {
return new TableCell<Person, Integer>() {
ImageView view = new ImageView();
@Override
protected void updateItem(Integer item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setGraphic(null);
} else {
String file = "/icons/";
if (item.intValue() >= 18) file += "Check.png";
else file += "Cancel.png";
Image image = new Image(
VistaTablaController.class.getResourceAsStream(file),
16, 16, true, true);
view.setImage(image);
setGraphic(view);
}
};
};
});
ANEXO
interface ChangeListener<T>
void changed(ObservableValue<? extends T> observable, T oldValue, T newValue)

class ComboBox<T>
public ComboBox(ObservableList<T> items)
public final ObservableList<T> getItems()
public final SingleSelectionModel<T> getSelectionModel()
public final void setItems(ObservableList<T> value)
public final ObjectProperty<ListCell<T>> buttonCellProperty()
public final ObjectProperty<ObservableList<T>> itemsProperty()

class FXCollections
public static <E> ObservableList<E> observableArrayList()
public static <K,V> ObservableMap<K,V> observableMap(Map<K,V> map)
public static ObservableFloatArray observableFloatArray()
public static ObservableIntegerArray observableIntegerArray()
public static <E> ObservableSet<E> observableSet(E... elements)

interface ObservableList<E>
boolean add(E e)
boolean addAll(Collection<? extends E> c)
void addListener(ListChangeListener<? super E> listener)
void remove(int from, int to)
boolean removeAll(E... elements)

interface ObservableValue<T>
void addListener(ChangeListener<? super T> listener)
void removeListener(ChangeListener<? super T> listener)
T getValue()

class PieChart
public PieChart(ObservableList<PieChart.Data> data)
public final ObservableList<PieChart.Data> getData()
public final void setData(ObservableList<PieChart.Data> value)
public final ObjectProperty<ObservableList<PieChart.Data>> dataProperty()
public final void setLabelsVisible(boolean value)
public final boolean getLabelsVisible()

class PieChart.Data
public Data(String name, double value)
public final String getName()
public final double getPieValue()
public final void setName(String value)
public final void setPieValue(double value)
public final DoubleProperty pieValueProperty()
public final StringProperty nameProperty()

class Button
public Button(String text)
public Button(String text, Node graphic)
public final void setDefaultButton(boolean value)
public final void setCancelButton(boolean value)
public final String getText()
public final void setText(String value)
public final void setWrapText(boolean value)
public final void setFont(Font value)
public final void setOnAction(EventHandler<ActionEvent> value)

class Label
public Label()
public Label(String text)
public final String getText()
public final void setText(String value)

class TextField
public TextField(String text)
public final String getText()
public final void setText(String value)
public final int getPrefColumnCount()
public final void setPrefColumnCount(int value)
public final void setOnAction(EventHandler<ActionEvent> value)
public final EventHandler<ActionEvent> getOnAction()
public final void setAlignment(Pos value)
public final Pos getAlignment()

class XYChart
public XYChart(Axis<X>, Axis<Y>)
public final ObservableList<XYChart.Series<X,Y>> getData()
public final void setData(ObservableList<XYChart.Series<X,Y>> value)

class XYChart.Series<X, Y>


public Series()
public Series(ObservableList<XYChart.Data<X,Y>> data)
public Series(String name, ObservableList<XYChart.Data<X,Y>> data)
public final ObservableList<XYChart.Data<X,Y>> getData()
public final void setData(ObservableList<XYChart.Data<X,Y>> value)
public final String getName()
public final void setName(String value)

class XYChart.Data<X,Y>
public Data(X xValue, Y yValue)

interface EventHandler<T extends Event>


void handle(T event)

class Task<V>
protected abstract V call()
public final V getValue()
public final boolean isRunning()
public final ReadOnlyStringProperty messageProperty()
public final ReadOnlyDoubleProperty progressProperty()
public final ReadOnlyBooleanProperty runningProperty()
public final void setOnCancelled(EventHandler<WorkerStateEvent> value)
public final void setOnFailed(EventHandler<WorkerStateEvent> value)
public final void setOnRunning(EventHandler<WorkerStateEvent> value)
public final void setOnSucceeded(EventHandler<WorkerStateEvent> value)
protected void updateMessage(String message)
protected void updateProgress(double workDone, double max)
public final ReadOnlyObjectProperty<V> valueProperty()

class TableView<S>
public TableView()
public TableView(ObservableList<S> items)
public final ObservableList<TableColumn<S,?>> getColumns()
public final ObservableList<S> getItems()

class TableColumn<S,T>
public TableColumn()
public TableColumn(String text)
public final void
setCellValueFactory(Callback<TableColumn.CellDataFeatures<S,T>,ObservableValue<T>> value)
public final void setCellFactory(Callback<TableColumn<S,T>,TableCell<S,T>> value)

class PropertyValueFactory<S,T>
public PropertyValueFactory(String property)

class TableCell<S,T>
public TableCell()
protected void updateItem(T item, boolean empty)
public final void setText(String value)
public final void setGraphic(Node value)