Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

javafx 2- tableview dynamic column

Can someone suggest issue in below code. I am not able to populate data in table. This code basically should add one column (col1) and add one row with data d1 in it. This code is able to add column but not data.

Controller -

import java.util.ArrayList;
import java.util.List;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;

public class FXMLTableViewController {
    @FXML private TableView tableView;

    @FXML
    private void initialize() {
        List<String> columns = new ArrayList<String>();
        columns.add("col1");
        TableColumn [] tableColumns = new TableColumn[columns.size()];     
        int columnIndex = 0;
        for(String columName : columns) {
            tableColumns[columnIndex++] = new TableColumn(columName);
        }
        tableView.getColumns().addAll(tableColumns);
        ObservableList<ObservableList> csvData = FXCollections.observableArrayList();
        ObservableList<String> row = FXCollections.observableArrayList();
        row.addAll("d1");
        csvData.add(row);
        tableView.getItems().add(csvData);

    }

    }

fxml

<?import javafx.collections.*?> 
<?import javafx.geometry.Insets?>
<?import java.lang.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.control.cell.*?>
<?import javafx.scene.layout.*?>
<?import fxmltableview.*?>


<GridPane alignment="center" hgap="10.0" vgap="10.0" fx:controller="FXMLTableViewController"
             xmlns:fx="http://javafx.com/fxml">
     <TableView fx:id="tableView" GridPane.columnIndex="0" GridPane.rowIndex="1">
          <columns>
          </columns>    
     </TableView>
</GridPane>

Main Class -

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class FXMLTableView extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setTitle("FXML TableView Example");
        Pane myPane = (Pane)FXMLLoader.load(getClass().getResource("fxml_tableview.fxml"));
        Scene myScene = new Scene(myPane);
        primaryStage.setScene(myScene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
like image 478
user2816100 Avatar asked Jan 12 '23 05:01

user2816100


2 Answers

Try the below code it will showing the same as you need

List<String> columns = new ArrayList<String>();
    columns.add("col1");
    columns.add("col2");
    TableColumn [] tableColumns = new TableColumn[columns.size()];     
    int columnIndex = 0;
    for(int i=0 ; i<columns.size(); i++) {
        final int j = i;
        TableColumn col = new TableColumn(columns.get(i));
        col.setCellValueFactory(new Callback<CellDataFeatures<ObservableList,String>,ObservableValue<String>>(){                   
           public ObservableValue<String> call(CellDataFeatures<ObservableList, String> param) {                                                                                             
                return new SimpleStringProperty(param.getValue().get(j).toString());                       
            }                   
        });
        tableview.getColumns().addAll(col);
    }       
    ObservableList<String> row = FXCollections.observableArrayList();
    ObservableList<String> row1 = FXCollections.observableArrayList();
    row.addAll("d1");
    row.addAll("d11");
    row1.addAll("d2");
    row1.addAll("d22");
    tableview.getItems().add(row);
    tableview.getItems().add(row1);
like image 66
Jitendra Pareek Avatar answered Jan 14 '23 19:01

Jitendra Pareek


I m sure it will help you

public class DBClass 
{    
 public Connection getConnection() throws ClassNotFoundException, SQLException 
 {       
       Class.forName("com.mysql.jdbc.Driver");
       return DriverManager.getConnection("jdbc:mysql://192.168.0.1:3306   /dbname","mysqluser","mysqluserpwd"); 
 }
}

In Controller Class do the following :

@FXML
void initialize() 
{
 assert tableview != null : "fx:id=\"tableview\" was not injected: check your FXML file 'UserMaster.fxml'.";
 colUserName.setCellValueFactory(
    new PropertyValueFactory<Usermaster,String>("userName"));        
colPassword.setCellValueFactory(                
    new PropertyValueFactory<Usermaster,String>("userPassword"));
colUserType.setCellValueFactory(
    new PropertyValueFactory<Usermaster,String>("userType"));        
colPhoto.setCellValueFactory(
    new PropertyValueFactory<Object,ImageView>("userPhoto"));
objDbClass = new DBClass();
try
{
    con = objDbClass.getConnection();
    buildData();
}
catch(ClassNotFoundException ce)
{
    logger.info(ce.toString());
}
catch(SQLException ce)
{
    logger.info(ce.toString());
}
}

private ObservableList<Usermaster> data;

public void buildData()
{        
data = FXCollections.observableArrayList();
try
{      
    String SQL = "Select * from usermaster Order By UserName";            
    ResultSet rs = con.createStatement().executeQuery(SQL);  
    while(rs.next())
    {
        Usermaster cm = new Usermaster();
        cm.userId.set(rs.getInt("UserId"));                       
        Image img = new Image("tailoring/UserPhoto/User"+cm.getUserId().toString()+".jpg");                

        ImageView mv = new ImageView();
        mv.setImage(img);
        mv.setFitWidth(70);
        mv.setFitHeight(80);
        cm.userPhoto.set(mv);
        cm.userName.set(rs.getString("UserName"));
        cm.userPassword.set(rs.getString("UserPassword"));
        cm.userType.set(rs.getString("UserType"));
        data.add(cm);                  
    }
    tableview.setItems(data);
}
catch(Exception e)
{
      e.printStackTrace();
      System.out.println("Error on Building Data");            
}
}

and Create a POJO a seperate java file for every entity(table) to want to manipulate using TableView

public class Usermaster 
{    

 public SimpleIntegerProperty userId = new SimpleIntegerProperty();
  public ObjectProperty userPhoto = new SimpleObjectProperty();
  public SimpleStringProperty userName = new SimpleStringProperty(); 
 public SimpleStringProperty userPassword = new SimpleStringProperty();
  public SimpleStringProperty userType = new SimpleStringProperty();
  public SimpleStringProperty encPass = new SimpleStringProperty();
 public SimpleStringProperty updt = new SimpleStringProperty();
  public SimpleStringProperty uptm = new SimpleStringProperty();

 public Integer getUserId() {
  return userId.get();
  }

  public Object getUserPhoto() {
  return userPhoto.get();
  }

 public String getUserName() {
  return userName.get();
  }

  public String getUserPassword() {
  return userPassword.get();
  }

  public String getUserType() {
    return userType.get();
  }

   public String getEncPass() {
   return encPass.get();
   }

   public String getUpdt() {
     return updt.get();
 }

public String getUptm() 
{
  return uptm.get();
}
}

I have tested this program it working perfectly.

like image 23
user3128279 Avatar answered Jan 14 '23 20:01

user3128279