JavaFX GridView, как получить идентификаторы видимых элементовJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 JavaFX GridView, как получить идентификаторы видимых элементов

Сообщение Anonymous »

Я пытаюсь получить текущие видимые индексы ячеек/строк GridView, заполненные изображениями.
Я нашел способ извлечь идентификатор из прослушивателя, но когда я начал добавив текст/метки поверх изображения и поместив его как StackPane в GridView вместо изображений, оно перестало работать (исключение приведения классов с (IndexedCell)).
Вот основной класс:

Код: Выделить всё


import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class MainApp extends Application {
public MyGridView myGridView;

@Override
public void start(final Stage primaryStage) {

myGridView = new MyGridView();

HBox row1 = new HBox(myGridView);
HBox.setHgrow(myGridView, Priority.ALWAYS);

Scene scene = new Scene(row1, 1200, 800, Color.BLACK);

primaryStage.setScene(scene);
primaryStage.show();
}

public static void main(String[] args) {
launch(args);
}

}
Вот класс MyGridView:

Код: Выделить всё

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>если щелкнуть ячейку мышью, то это тоже ее идентификатор
  • также было бы неплохо узнать идентификатор ячейки, просто наведя на нее курсор мыши это


Подробнее здесь: https://stackoverflow.com/questions/787 ... ements-ids
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • JavaFX GridView, как получить идентификаторы видимых элементов
    Anonymous » » в форуме JAVA
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • JavaFX GridView, как получить идентификаторы видимых элементов
    Anonymous » » в форуме JAVA
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Intellij javafx module info.java: модуль считывает пакет «javafx.fxml» как из "javafx.fxml ', так и" javafx.fxml'
    Anonymous » » в форуме JAVA
    0 Ответы
    48 Просмотры
    Последнее сообщение Anonymous
  • Как найти показатели видимых строк в таблице в Javafx 9
    Anonymous » » в форуме JAVA
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous
  • .NET Maui ListView Получение видимых в настоящее время элементов в Android и iOS
    Anonymous » » в форуме IOS
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»