Я пытаюсь получить текущие видимые индексы ячеек/строк GridView, заполненные изображениями.
Я нашел способ извлечь идентификатор из прослушивателя, но когда я начал добавив текст/метки поверх изображения и поместив его как StackPane в GridView вместо изображений, оно перестало работать (исключение приведения классов с (IndexedCell)).
Вот основной класс:
import javafx.embed.swing.SwingFXUtils;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.control.IndexedCell;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.ScrollEvent;
import javafx.scene.layout.StackPane;
import javafx.scene.text.Text;
import org.controlsfx.control.GridCell;
import org.controlsfx.control.GridView;
import org.controlsfx.control.cell.ImageGridCell;
import java.awt.*;
import java.awt.image.BufferedImage;
public class MyGridView extends GridView {
public static final int GRID_CELL_WIDTH = 512;
public static final int GRID_CELL_HEIGHT = 360;
public static final int GRID_CELL_SPACING_HORIZONTAL = 5;
public static final int GRID_CELL_SPACING_VERTICAL = 5;
public MyGridView() {
setCellWidth(GRID_CELL_WIDTH);
setCellHeight(GRID_CELL_HEIGHT);
setHorizontalCellSpacing(GRID_CELL_SPACING_HORIZONTAL);
setVerticalCellSpacing(GRID_CELL_SPACING_VERTICAL);
addEventHandler(MouseEvent.MOUSE_CLICKED, e -> {
Node clickedNode = e.getPickResult().getIntersectedNode();
IndexedCell index = ((IndexedCell) clickedNode);
int clickedItemId = index.getIndex();
System.out.println("Clicked id = " + clickedItemId);
});
addEventFilter(ScrollEvent.ANY, e -> {
Node clickedNode = e.getPickResult().getIntersectedNode();
System.out.println(clickedNode.getClass());
IndexedCell index = ((IndexedCell) clickedNode);
int clickedItemId = index.getIndex();
System.out.println("Scrolled id = " + clickedItemId);
});
//scroll/click cells is working with this, comment it and uncomment next one
setCellFactoryWorking();
// setCellFactoryNotWorking();
addImagesToGrid(this);
}
private void setCellFactoryWorking() {
setCellFactory(gv -> new GridCell() {
private final ImageView imageView = new ImageView();
{
imageView.setFitHeight(GRID_CELL_HEIGHT);
imageView.setPreserveRatio(true);
}
@Override
protected void updateItem(Image image, boolean empty) {
super.updateItem(image, empty);
imageView.setImage(image);
setGraphic(imageView);
}
});
}
private void setCellFactoryNotWorking() {
setCellFactory(gv -> new GridCell() {
private final ImageView imageView = new ImageView();
{
imageView.setFitHeight(GRID_CELL_HEIGHT);
imageView.setPreserveRatio(true);
}
@Override
protected void updateItem(Image image, boolean empty) {
super.updateItem(image, empty);
imageView.setImage(image);
Text text = new Text(" Lorem Ipsum");
text.setFill(javafx.scene.paint.Color.rgb(255, 255, 255));
StackPane pane = new StackPane();
pane.getChildren().add(imageView);
pane.getChildren().add(text);
pane.setAlignment(Pos.TOP_LEFT);
setGraphic(pane);
}
});
}
private void addImagesToGrid(GridView gridView) {
for (int i = 1; i < 200; i++) {
final Image image = createFakeImage(i, GRID_CELL_WIDTH, GRID_CELL_HEIGHT);
gridView.getItems().add(image);
}
}
private static Image createFakeImage(int imageIndex, int width, int height) {
BufferedImage image = new BufferedImage(width, width, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
for (int i = 1; i < width; i++) {
g.setColor(new Color(i * imageIndex % 256, i * 2 * (imageIndex + 40) % 256, i * 3 * (imageIndex + 60) % 256));
double proportion = width / height;
g.drawRect(i, i, width - i * 2, (int) ((width - i * 2) * proportion));
}
return SwingFXUtils.toFXImage(image, null);
}
}
Если вы переключите функцию setCellFactoryWorking() на setCellFactoryNotWorking(), вы увидите, что ссылочный класс, на который наведена мышь, изменился, и больше не существует IndexedCell с идентификаторами. На самом деле это плохой метод обнаружения реальных видимых элементов GridView. Есть ли что-нибудь более общее, что не зависит от типов классов элементов ячейки и просто может сказать:
< li>идентификаторы видимых строк
идентификаторы видимых ячеек
< li>если щелкнуть ячейку мышью, то это тоже ее идентификатор
также было бы неплохо узнать идентификатор ячейки, просто наведя на нее курсор мыши это
Я пытаюсь получить текущие видимые индексы ячеек/строк GridView, заполненные изображениями. Я нашел способ извлечь идентификатор из прослушивателя, но когда я начал добавив текст/метки поверх изображения и поместив его как StackPane в GridView вместо изображений, оно перестало работать (исключение приведения классов с (IndexedCell)). Вот основной класс: [code]
public class MyGridView extends GridView { public static final int GRID_CELL_WIDTH = 512; public static final int GRID_CELL_HEIGHT = 360; public static final int GRID_CELL_SPACING_HORIZONTAL = 5; public static final int GRID_CELL_SPACING_VERTICAL = 5;
public MyGridView() { setCellWidth(GRID_CELL_WIDTH); setCellHeight(GRID_CELL_HEIGHT); setHorizontalCellSpacing(GRID_CELL_SPACING_HORIZONTAL); setVerticalCellSpacing(GRID_CELL_SPACING_VERTICAL);
addEventHandler(MouseEvent.MOUSE_CLICKED, e -> { Node clickedNode = e.getPickResult().getIntersectedNode(); IndexedCell index = ((IndexedCell) clickedNode); int clickedItemId = index.getIndex(); System.out.println("Clicked id = " + clickedItemId); });
addEventFilter(ScrollEvent.ANY, e -> { Node clickedNode = e.getPickResult().getIntersectedNode(); System.out.println(clickedNode.getClass()); IndexedCell index = ((IndexedCell) clickedNode); int clickedItemId = index.getIndex(); System.out.println("Scrolled id = " + clickedItemId); });
//scroll/click cells is working with this, comment it and uncomment next one setCellFactoryWorking(); // setCellFactoryNotWorking();
addImagesToGrid(this);
}
private void setCellFactoryWorking() { setCellFactory(gv -> new GridCell() { private final ImageView imageView = new ImageView();
@Override protected void updateItem(Image image, boolean empty) { super.updateItem(image, empty); imageView.setImage(image); Text text = new Text(" Lorem Ipsum"); text.setFill(javafx.scene.paint.Color.rgb(255, 255, 255)); StackPane pane = new StackPane(); pane.getChildren().add(imageView); pane.getChildren().add(text); pane.setAlignment(Pos.TOP_LEFT); setGraphic(pane);
} }); }
private void addImagesToGrid(GridView gridView) { for (int i = 1; i < 200; i++) { final Image image = createFakeImage(i, GRID_CELL_WIDTH, GRID_CELL_HEIGHT); gridView.getItems().add(image); } }
private static Image createFakeImage(int imageIndex, int width, int height) { BufferedImage image = new BufferedImage(width, width, BufferedImage.TYPE_INT_RGB); Graphics g = image.getGraphics(); for (int i = 1; i < width; i++) { g.setColor(new Color(i * imageIndex % 256, i * 2 * (imageIndex + 40) % 256, i * 3 * (imageIndex + 60) % 256)); double proportion = width / height; g.drawRect(i, i, width - i * 2, (int) ((width - i * 2) * proportion)); }
return SwingFXUtils.toFXImage(image, null); } } [/code] Если вы переключите функцию setCellFactoryWorking() на setCellFactoryNotWorking(), вы увидите, что ссылочный класс, на который наведена мышь, изменился, и больше не существует IndexedCell с идентификаторами. На самом деле это плохой метод обнаружения реальных видимых элементов GridView. Есть ли что-нибудь более общее, что не зависит от типов классов элементов ячейки и просто может сказать: [list] < li>идентификаторы видимых строк
[*]идентификаторы видимых ячеек
< li>если щелкнуть ячейку мышью, то это тоже ее идентификатор
[*]также было бы неплохо узнать идентификатор ячейки, просто наведя на нее курсор мыши это
Я пытаюсь получить текущие видимые индексы ячеек/строк GridView, заполненные изображениями.
Я нашел способ извлечь идентификатор из прослушивателя, но когда я начал добавив текст/метки поверх изображения и поместив его как StackPane в GridView...
Я пытаюсь получить текущие видимые индексы ячеек/строк GridView, заполненные изображениями.
Я нашел способ извлечь идентификатор из прослушивателя, но когда я начал добавив текст/метки поверх изображения и поместив его как StackPane в GridView...
У меня проблемы с использованием Javafx в проекте Uni, и я просто хожу по кругу. Я новичок в Java, Javafx и Intellij, так что любая помощь была бы очень оценена! У меня было много проблем, заставляя это работать, но я наконец -то это понял. Сейчас я...
У меня есть кроссплатформенное приложение (iOS/Android), созданное в настоящее время на Xamarin, которому необходимо знать, какие элементы в представлении списка в данный момент видны. Он работает в Xamarin, но я не могу понять, как его перенести на...