घंटों और घंटों की कोशिश के बाद मैं एक परियोजना के लिए अपनी समय सीमा के करीब पहुंच रहा हूं और अभी भी मेरी आसान समस्या के लिए कोई समाधान नहीं मिला है। मुझे SQL क्वेरी से डेटा के साथ एक टेबलव्यू भरने की आवश्यकता है, लेकिन मैं इसे काम पर नहीं ला सकता, भले ही मैं ऑनलाइन उदाहरणों को पेस्ट कर दूं ... मुझे निम्न कोड के समान परिणाम की आवश्यकता है

public DefaultTableModel buildTableModel() {
        ResultSetMetaData metaData;
        try (Connection conn = DriverManager.getConnection(MapperConfig.JDBC_URL)) {
            PreparedStatement queryOpgeslagenGames = conn.prepareStatement("");
            ResultSet rs = queryOpgeslagenGames.executeQuery("SELECT spellen.spelID, spellen.spelNaam AS 'Naam van Spel', group_concat( naam separator ', ') AS 'Deelnemende spelers' FROM spellen RIGHT JOIN spelers ON spellen.spelID =     spelers.spelID GROUP BY spellen.spelID");
            metaData = rs.getMetaData();
            // names of columns
            Vector<String> columnNames = new Vector<String>();
            int columnCount = metaData.getColumnCount();
            for (int column = 1; column <= columnCount; column++) {
                columnNames.add(metaData.getColumnName(column));
            }

            // data of the table
            Vector<Vector<Object>> data = new Vector<Vector<Object>>();
            while (rs.next()) {
                Vector<Object> vector = new Vector<Object>();
                for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
                    vector.add(rs.getObject(columnIndex));
                }
                data.add(vector);
            }
        return new DefaultTableModel(data, columnNames);
        } catch (SQLException ex) {
            for (Throwable t : ex) {
                t.printStackTrace();
            }
        }
        return new DefaultTableModel();
    }

लेकिन चूंकि मुझे इसे JavaFX में उपयोग करने की आवश्यकता है, इसलिए मैं Jtable का उपयोग नहीं कर सकता और तालिका दृश्य का उपयोग करने की आवश्यकता है। क्या कोई मेरे लिए कोड बदल सकता है? या मुझे बताएं कि तालिका दृश्य बनाने के लिए DefaultTableModel का उपयोग कैसे करें?

तालिका में हमेशा 3 कॉलम होंगे, पहला गेम आईडी, दूसरा गेम सेव फाइल नेम और तीसरा गेम में लोगों के नामों का संग्रह।

-1
Lennert Bontinck 12 मई 2017, 02:52
1
SQL कथन से, ऐसा लगता है कि आप जानते हैं कि आपके पास कितने कॉलम होने वाले हैं, और उन कॉलम में डेटा क्या दर्शाता है। क्या वो सही है? यदि हां, तो क्या आप उस जानकारी को प्रश्न में स्पष्ट रूप से शामिल कर सकते हैं? (बीटीडब्ल्यू, मुझे नहीं लगता कि जवाब के लिए भुगतान करने की पेशकश इस मंच पर स्वीकार्य मानी जाती है। यह निश्चित रूप से साइट की भावना में नहीं है।)
 – 
James_D
12 मई 2017, 02:58
जोड़ा गया: टेबल में हमेशा 3 कॉलम होंगे, पहला गेम आईडी, दूसरा गेम सेव फाइल नेम और तीसरा गेम में लोगों के नामों का संग्रह
 – 
Lennert Bontinck
12 मई 2017, 03:04
क्या आपने यह post रेफर किया है मान लीजिए आप इस पोस्ट से बेहतर समाधान ढूंढ सकते हैं।
 – 
Rajith Pemabandu
12 मई 2017, 03:05

1 उत्तर

सबसे बढ़िया उत्तर

JavaFX TableViews एक मॉडल पर आधारित होते हैं जिसमें प्रत्येक पंक्ति को एक वस्तु द्वारा दर्शाया जाता है। प्रत्येक कॉलम में एक संबद्ध फ़ंक्शन (cellValueFactory) होता है जो उस कॉलम में संबंधित सेल में प्रदर्शित होने वाले मान के लिए एक पंक्ति के लिए ऑब्जेक्ट को मैप करता है।

तो आपको प्रत्येक पंक्ति में आइटम का प्रतिनिधित्व करने वाले वर्ग को परिभाषित करके प्रारंभ करना चाहिए। JavaFX प्रॉपर्टी पैटर्न का उपयोग करके ऐसा करना सबसे अच्छा है, जो तालिका को इस वर्ग के उदाहरणों में डेटा से आसानी से बाँधने की अनुमति देगा।

public class Game {

    // maybe an IntegerProperty?
    private final StringProperty id = new SimpleStringProperty();
    private final StringProperty saveFileName = new SimpleStringProperty();
    private final ListProperty<String> playerNames = new SimpleListProperty<>(FXCollections.observableArrayList()); 

    public Game(String id, String saveFileName, String... playerNames) {
        setId(id);
        setSaveFileName(saveFileName);
        playerNames.get().setAll(playerNames);
    }

    public StringProperty idProperty() {
        return id ;
    }

    public final String getId() {
        return idProperty().get();
    }

    public final void setId(String id) {
        idProperty().set(id);
    }

    // similarly for saveFileName...

    public ListProperty<String> playerNamesProperty() {
        return playerNames ;
    }

    public final ObservableList<String> getPlayerNames() {
        return playerNamesProperty().get();
    }

    public final void setPlayerNames(ObservableList<String> playerNames) {
        playerNamesProperty().set(playerNames);
    }
}

अब आपकी डेटा एक्सेसर विधि इस तरह दिखनी चाहिए:

public ObservableList<Game> buildTableModel() {

    try (Connection conn = DriverManager.getConnection(MapperConfig.JDBC_URL)) {
        PreparedStatement queryOpgeslagenGames = conn.prepareStatement("");
        ResultSet rs = queryOpgeslagenGames.executeQuery("SELECT spellen.spelID, spellen.spelNaam AS 'Naam van Spel', group_concat( naam separator ', ') AS 'Deelnemende spelers' FROM spellen RIGHT JOIN spelers ON spellen.spelID =     spelers.spelID GROUP BY spellen.spelID");
        // data of the table
        ObservableList<Game> games = FXCollections.observableArrayList();
        while (rs.next()) {
            String id = rs.get(1);
            String saveFileName = rs.get(2);
            String[] playerNames = rs.get(3).split(", ");
            Game game = new Game(id, saveFileName, playerNames);
            games.add(game);
        }
        return games ;
    } catch (SQLException ex) {
        for (Throwable t : ex) {
            t.printStackTrace();
        }
    }
    return FXCollections.observableArrayList();
}

और अंत में आप तालिका को सेट अप करते हैं

TableView<Game> table = new TableView<>();
TableColumn<Game, String> idColumn = new TableColumn<>("ID");
idColumn.setCellValueFactory(cellData -> cellData.getValue().idProperty());
TableColumn<Game, String> saveFileNameColumn = new TableColumn<>("Save file name");
saveFileNameColumn.setCellValueFactory(cellData -> cellData.getValue().saveFileNameProperty());
TableColumn<Game, ObservableList<String>> playerNamesColumn = new TableColumn<>("Player names");
playerNamesColumn.setCellValueFactory(cellData -> callData.getValue().playerNamesProperty());

table.setItems(buildTableModel());

table.getColumns().addAll(idColumn, saveFileNameColumn, playerNamesColumn);

आप कुछ इस तरह से प्लेयर नेम कॉलम में रेंडरिंग को अतिरिक्त रूप से सुधार सकते हैं

playerNamesColumn.setCellFactory(col -> new TableCell<Game, ObservableList<String>>() {
    @Override
    protected void updateItem(ObservableList<String> playerNames, boolean empty) {
        super.updateItem(playerNames, empty);
        if (empty) {
            setText(null);
        } else {
            setText(String.join(", ", playerNames));
        }
    }
});

या, अधिक परिष्कृत प्रदर्शन के लिए:

playerNamesColumn.setCellFactory(col -> new TableCell<Game, ObservableList<String>>() {

    private final ListView<String> listView = new ListView<>();

    @Override
    protected void updateItem(ObservableList<String> playerNames, boolean empty) {
        super.updateItem(playerNames, empty);
        if (empty) {
            setGraphic(null);
        } else {
            listView.setItems(playerNames);
            setGraphic(listView);
        }
    }
});
1
James_D 12 मई 2017, 03:35
आप हर छात्र की जरूरत के नायक हैं, लेकिन कोई भी योग्य नहीं है, इसे काम करने के लिए काफी कुछ संपादित करना पड़ा जैसा मैं चाहता था लेकिन यह अंततः एक javafx स्टैकपैन में एक आकर्षण की तरह काम करता है! रॉक ऑन यार!
 – 
Lennert Bontinck
12 मई 2017, 14:17