Jak mohu přidat posluchače pro každou ListCell vytvořil v mé ListView 1. získat data v cele a 2. volání metody?

0

Otázka

Vytvářím model Java verzi in-house databáze pro mou společnost. Úspěšně jsem zobrazit všechny položky (v tomto případě zákazníci) v zobrazení seznamu, ale chci, aby bylo možné volat metody a získat data z buňky. Například, když jsem kliknul zákazník s zákazník ID 498, chtěl bych to mít nějaký způsob, jak pro přístup k ID(498) a pak zobrazí další informace pro ID zákazníka. Zvládnu zobrazuje všechny informace sám, mám jenom problém s tím, jak se přístup k datům uvnitř buněk. Příslušný kód:

Správce Třídy Úryvek, který naplní seznamu zobrazení:

package com.verus.techtracker_2;

import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.util.Callback;

import java.net.URL;
import java.sql.*;
import java.util.ArrayList;
import java.util.ResourceBundle;

public class MainViewController {
ObservableList<ObservableList> data = 
FXCollections.observableArrayList();
@FXML
private Label welcomeText;
@FXML
private ListView<ObservableList> OrgTbl2;
private orgmodel org;
@FXML
private static Connection conn;
private static final String url = "jdbc:sqlserver://10.9.32.46:1433;database=TechTracker;integratedSecurity=true";

public MainViewController() {
}

public static Connection connect() throws SQLException {
    try{
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
    }catch(ClassNotFoundException cnfe){
        System.err.println("Error: "+cnfe.getMessage());
    }catch(InstantiationException ie){
        System.err.println("Error: "+ie.getMessage());
    }catch(IllegalAccessException iae){
        System.err.println("Error: "+iae.getMessage());
    }

    conn = DriverManager.getConnection(url);
    return conn;
}

public static Connection getConnection() throws SQLException, ClassNotFoundException{
    if(conn !=null && !conn.isClosed())
        return conn;
    connect();
    return conn;


}

public void initialize (URL url, ResourceBundle resourceBundle) throws SQLException, ClassNotFoundException {
    loadData();
}
ResultSet rs = null;
public void loadData() throws SQLException, ClassNotFoundException {
    getConnection();


    ObservableList<orgmodel> OrganizationObservableList = FXCollections.observableArrayList();

    try{
        PreparedStatement ps = connect().prepareStatement("SELECT CustomerName,CustomerID, Inactive FROM dbo.tbCustomers");
        rs=ps.executeQuery();
        System.out.println(rs);


        /**
         * ******************************
         * Data added to ObservableList *
         *******************************
         */
        while (rs.next()) {
            //Iterate Row
            ObservableList<String> row = FXCollections.observableArrayList();
            for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
                //Iterate Column
                row.add(rs.getString(i));
            }
            System.out.println("Row [1] added " + row);
            data.add(row);
            org = new orgmodel(rs.getString(1), rs.getString(2), rs.getBoolean(3));
            OrganizationObservableList.add(org);


        }

        //FINALLY ADDED TO TableView
        OrgTbl2.setItems(data);
    } catch (Exception e) {
        e.printStackTrace();
        System.out.println("Error on Building Data");
    }
}


}

FXML souboru této scény:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.ListView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.VBox?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="1000.0" prefWidth="1920.0" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.verus.techtracker_2.MainViewController">
   <children>
      <VBox layoutX="130.0" layoutY="58.0" prefHeight="200.0" prefWidth="100.0" />
      <ListView fx:id="OrgTbl2" layoutX="7.0" layoutY="6.0" onMouseClicked="#loadData" prefHeight="987.0" prefWidth="958.0" />
   </children>
</AnchorPane>

java javafx
2021-11-22 19:53:02
1

Nejlepší odpověď

2

Myslím, že když říkáte,

Například, když jsem kliknul zákazník s zákazník ID 498,

máte na mysli, aby reagovat, pokud uživatel vybere položku v ListView. Vše, co musíte udělat, je zaregistrovat posluchače s výběrem, pomocí

orgTbl2.getSelectionModel().selectedItemProperty().addListener(...)

To bude mnohem snazší, pokud jste, aby vaše ListView zobrazení model případech, namísto použití List zastupovat každého řádku. Jste už, zdá se, model, třída, tzv. OrgModel definované.

Tady je verze vašeho kódu, která to dělá. Jsem odstranil všechny zbytečné kód, se vrátil na standardní konvence pojmenování, a dělal některé další "clean-up", takže ostatní uživatelé mohou číst kód snadno.

package com.verus.techtracker_2;

import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.util.Callback;

import java.net.URL;
import java.sql.*;
import java.util.ArrayList;
import java.util.ResourceBundle;

public class MainViewController {

    @FXML
    private Label welcomeText;
    @FXML
    private ListView<OrgModel> orgTbl2;

    private static Connection conn ;
    private static final String url = "jdbc:sqlserver://10.9.32.46:1433;database=TechTracker;integratedSecurity=true";
    
    public void initialize (URL url, ResourceBundle resourceBundle) throws SQLException, ClassNotFoundException {
        loadData();

        orgTbl2.getSelectionModel()
            .selectedItemProperty()
            .addListener((obs, oldSelection, newSelection) -> {

            if (newSelection != null) {
                // assuming names of property accessor methods:
                String customerName = newSelection.getCustomerName();
                String id = newSelection.getId();
                boolean inactive = newSelection.isInactive();
                // do whatever you need with the data:
                System.out.println("Selected customer id: " + id);
        });

        // display customer name in listview:
        orgTbl2.setCellFactory(lv -> new ListCell<>() {
            @Override
            protected void updateItem(OrgModel item, boolean empty) {
                super.updateItem(item, empty);
                if (empty || item == null) {
                    setText("");
                } else {
                    setText(item.getCustomerName());
                }
            }
        });
    }

    public void loadData() throws SQLException, ClassNotFoundException {
    
        ObservableList<OrgModel> organizationObservableList = FXCollections.observableArrayList();
    
        try{
            PreparedStatement ps = connect().prepareStatement("SELECT CustomerName,CustomerID, Inactive FROM dbo.tbCustomers");
            ResultSet rs=ps.executeQuery();
            System.out.println(rs);

            while (rs.next()) {
                OrgModel org = new OrgModel(rs.getString(1), rs.getString(2), rs.getBoolean(3));
                organizationObservableList.add(organizationObservableList);
            }
            orgTbl2.setItems(data);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Error on Building Data");
        }
    }

    private static Connection connect() throws SQLException {
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
        }catch(ClassNotFoundException cnfe){
            System.err.println("Error: "+cnfe.getMessage());
        }catch(InstantiationException ie){
            System.err.println("Error: "+ie.getMessage());
        }catch(IllegalAccessException iae){
            System.err.println("Error: "+iae.getMessage());
        }
    
        conn = DriverManager.getConnection(url);
        return conn;
    }
    
    public static Connection getConnection() throws SQLException, ClassNotFoundException{
        if(conn !=null && !conn.isClosed())
            return conn;
        conn = connect();
        return conn;
    }    

}

Pokud opravdu chcete konkrétně reagovat na kliknutí myší, namísto výběru změny, můžete tak učinit v buňce. Poznámka: to znamená, například, pokud uživatel změní výběr pomocí klávesnice a pak tam bude žádná reakce na tuto změnu. To může být užitečné, ale pokud jste chtěl pouze reagovat na dvojité kliknutí na buňku, atd.

public void initialize (URL url, ResourceBundle resourceBundle) throws SQLException, ClassNotFoundException {
    loadData();

    // display customer name in listview:
    orgTbl2.setCellFactory(lv -> new ListCell<>() {

        {
            setOnMouseClicked(event -> {
                OrgModel item = getItem();
                if (item != null) {
                    String id = item.getId();
                    String customerName = item.getCustomerName();
                    boolean inactive = item.isInactive();
                    // etc ...
                }
            });
        }

        @Override
        protected void updateItem(OrgModel item, boolean empty) {
            super.updateItem(item, empty);
            if (empty || item == null) {
                setText("");
            } else {
                setText(item.getCustomerName());
            }
        }
    });
}
2021-11-22 20:49:18

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................