0

TableColumnaのa にセルのインデックス (整数として) がありTableViewます。セルのインデックスを使用して、このインデックスでセル オブジェクトにアクセスするにはどうすればよいですか? 私は何かが欠けています

tableColumn.getCells()

これにより、指定されたインデックスでセルにアクセスできるようになります。

tableColumn.getCells().get(index)

これに関するヒントはありますか?ありがとう!

アップデート:

リクエストによると、これの使用例:

音楽のプレイリストを想像してみてください。いくつかの理由で、私はそのために TableView を使用しており、TableView は可能な限り大きいです。つまり、プレイリストに音楽トラックが 5 つしかなく、10 行のスペースがある場合でも、10 行 (5 つが塗りつぶされ、5 つが空) になります。示す。

次に、アイテムを再配置するためのドラッグ アンド ドロップを実装しました。ここで、ユーザーが 2 番目のエントリをプレイリストの最後に配置したいと考えているとします。彼は 2 番目のエントリをドラッグしますが、最後に使用したテーブル行の上ではなく、たとえば行 8 にドラッグします。その場合、音楽トラックが最後に使用した行 (行 5、しかしマウス行/セル 8 の上にあります!)、そのため、マウスが行 8 の上にある間に行/セル 5 を変更する必要があります。 1、しかし行/セル5への参照を取得するのは難しいことです/ここで私の問題です。

4

2 に答える 2

1

この API は、何らかの理由で存在しません。

パフォーマンスを向上させるために、FXTableViewはセル自体を操作します。セルは、TableView の現在表示されている部分およびその他のパラメーターに応じて作成および破棄されます。さらに、セル オブジェクトを再利用して、状況によっては他のセルからのデータを表すこともできます。

そのため、の戻り値はtableColumn.getCells().get(index)不定であるため、それを受け取る API はありません。

セルに関連するすべてのロジックは、CellFactoryコールバックで実装する必要があります。

セルにアクセスして実装したいロジックの種類を説明できますか?

于 2013-04-25T15:39:45.700 に答える
0

固定セル サイズを設定し、マウス座標を使用して推測します。私はそれを既存の例に追加しただけで、それはまったく正しくないと確信していますが、アイデアを示しています。

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.chart.PieChart;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.converter.NumberStringConverter;

public class ChangePie extends Application {

    @Override
    public void start(Stage primaryStage) {
        ObservableList<PieChart.Data> pieChartData
                = FXCollections.observableArrayList(
                        new PieChart.Data("Grapefruit", 13),
                        new PieChart.Data("Oranges", 25),
                        new PieChart.Data("Plums", 10),
                        new PieChart.Data("Pears", 22),
                        new PieChart.Data("Apples", 30));
        final PieChart chart = new PieChart(pieChartData);
        chart.setTitle("Imported Fruits");

        final TableView<PieChart.Data> tv = new TableView(pieChartData);
        tv.setEditable(true);
        tv.setFixedCellSize(40);

        tv.addEventHandler(MouseEvent.ANY, (MouseEvent evt) -> {
            double y = 0;
            int idx1 = 0, idx2 = 0;
            if (evt.getEventType() == MouseEvent.MOUSE_PRESSED) {
                y = evt.getY();
                idx1 = tv.getSelectionModel().getSelectedIndex();
            } else if (evt.getEventType() == MouseEvent.MOUSE_RELEASED) {
                idx2 = (int) Math.round((evt.getY() - y) / 40);
                System.out.println("insert at " + idx2);
                if (idx2 > 0) {
                    chart.setData(null);
                    PieChart.Data removed = pieChartData.remove(idx1);
                    pieChartData.add(Math.min(idx2, pieChartData.size() - 1), removed);
                }
            }

        });

        TableColumn tc1 = new TableColumn("Name");
        tc1.setPrefWidth(100);
        tc1.setCellValueFactory(new PropertyValueFactory("name"));
        tc1.setCellFactory(TextFieldTableCell.forTableColumn());

        TableColumn tc2 = new TableColumn("Data");
        tc2.setPrefWidth(100);
        tc2.setCellValueFactory(new PropertyValueFactory("pieValue"));
        tc2.setCellFactory(TextFieldTableCell.forTableColumn(new NumberStringConverter()));

        tv.getColumns().addAll(tc1, tc2);
        Scene scene = new Scene(new VBox(chart, tv));
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

}
于 2014-06-13T04:22:39.580 に答える