Here is an example of a ListView that sets the text fill to red for prime numbers. Notice the use of the pseudo-class state. Adding and removing a style-class is also an option. But a psuedo-class state change has much less overhead.
package fxtest;
import javafx.application.Application;
import javafx.css.PseudoClass;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.stage.Stage;
import java.util.Arrays;
import java.util.function.IntFunction;
import java.util.stream.IntStream;
public class Main extends Application {
public static void main(String[] args) {
launch(args);
}
final static int MAX_N = 100;
final static boolean isPrime[] = new boolean[MAX_N];
static {
Arrays.fill(isPrime, true);
for (int i = 2; i*i < MAX_N; i++) {
if (isPrime[i]) {
for (int j = i*i; j < MAX_N; j += i) {
isPrime[j] = false;
}
}
}
}
final static PseudoClass prime = PseudoClass.getPseudoClass("prime");
final Integer[] items = IntStream.range(0, MAX_N).boxed().toArray(n -> { return new Integer[n]; });
@Override
public void start(final Stage stage) {
ListView<Integer> listView = new ListView<>();
listView.getItems().addAll(items);
listView.setCellFactory(lv -> {
return new ListCell<Integer>() {
@Override
public void updateItem(Integer item, boolean empty) {
super.updateItem(item, empty);
if (empty || item == null) {
setText(null);
pseudoClassStateChanged(prime, false);
} else {
setText(item.toString());
int n = item.intValue();
boolean bool = ((1 < n) && (n < isPrime.length) && isPrime[n]);
pseudoClassStateChanged(prime, bool);
}
}
};
});
Scene scene = new Scene(new Group(listView));
scene.getStylesheets().add("/fxtest/test.css");
stage.setWidth(400);
stage.setHeight(400);
stage.setScene(scene);
stage.show();
}
}
The file fxtest/test.css:
.list-cell:prime {
-fx-text-fill: red;
}
No comments:
Post a Comment