0

我动态生成了我的表格视图,并用我在 postgresql 中的数据库中的数据填充了数据。那部分工作正常。现在我希望能够为该表中的每一行设置 onclick 侦听器,因此每当我单击一行时,都会弹出另一个窗口。此外,我想知道的不是点击的行数,而是该行的信息。因此,例如在输出中:

在此处输入图像描述

当我在 7 月单击假设时,我希望将 111.0 值存储在某处。我很高兴现在只需将其打印出来。(图片不是我的,我仅用于演示目的)

这是我的代码:

//TABLE VIEW AND DATA
private ObservableList<ObservableList> data;
private TableView tableview;

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

//CONNECTION DATABASE
public void buildData(){

      data = FXCollections.observableArrayList();
      try{
       Connection c = DBConnect.getDBConnection();

        ResultSet rs = getRecords();

        /**********************************
         * TABLE COLUMN ADDED DYNAMICALLY *
         **********************************/
        for(int i=0 ; i<rs.getMetaData().getColumnCount(); i++){
            //We are using non property style for making dynamic table
            final int j = i;                
            TableColumn col = new TableColumn(rs.getMetaData().getColumnName(i+1));
            col.setCellValueFactory(new Callback<CellDataFeatures<ObservableList,String>,ObservableValue<String>>(){                    
                public ObservableValue<String> call(CellDataFeatures<ObservableList, String> param) {                                                                                              
                     return new SimpleObjectProperty(param.getValue().get(j));                        
                }                    
            });

            tableview.getColumns().addAll(col); 
           // System.out.println("Column ["+i+"] ");
        }

        /********************************
         * 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);

        }

        //FINALLY ADDED TO TableView
        tableview.setItems(data);

      }catch(Exception e){
          e.printStackTrace();
          System.out.println("Error on Building Data");             
      }



}





  @Override
  public void start(Stage stage) throws Exception {
    //TableView
    tableview = new TableView();
    buildData();

    //Main Scene
    Scene scene = new Scene(tableview);        

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

   public ResultSet getRecords() throws SQLException
{
    Connection connection = getDBConnection();
    java.sql.Statement st = connection.createStatement();
    ResultSet rs = st.executeQuery("SELECT * FROM table");

    return rs;
}

我尝试使用此代码,但它不起作用(错误表示我无法将 Object 转换为 UserClass。

  UserClass selectedUser = new UserClass();
        final Clipboard clipboard = Clipboard.getSystemClipboard();
       tableview.getSelectionModel().selectedItemProperty().addListener(new         ChangeListener()
       {
           public void changed(ObservableValue observable, Object oldValue,Object newValue)
           {
               UserClass selectedUser = (UserClass)newValue;
               ClipboardContent content = new ClipboardContent();
               content.putString(selectedUser.toString());
               clipboard.setContent(content); 
           }
       });

如果有任何其他,最好是更简单,更直接的方式,我将不胜感激

4

1 回答 1

2

AFAI了解您可以这样做:为 TableView 的列添加单元格工厂,并且对于每个单元格,TableRow 上都有一个链接,通过

public final ReadOnlyObjectProperty<TableRow> tableRowProperty

并且 TableRow 对象具有所有有用的属性,如设置 on<...>Click 侦听器。

每个细胞也都有它们。

于 2013-06-06T23:20:15.183 回答