Tableview veritabanından veri doldurma ve ekleme-Javafx dersi 3

Arif Ceylan/ Aralık 21, 2014/ Javafx/ 2 comments

Mysql veritabanındaki bir tablomuzdaki verileri tableviewe aktaracağız. Öncelikle mysql yönetimi için xamp ve phpmyadmin kullanıyorum. Standart kullanıcı adı root. Parola boş. Port 3306

Veritabanımın adı java, tablonun adı da bilgi. Aşağıda resmini görebilirsiniz.

Yeni bir javafxml uygulaması oluşturalım. Otomatik olarak bir düğme ekliyor ve label ekliyor. Labeli kullanmayacağım için siliyorum. Butonun click olayında da verileri dinamik olarak tableviewe dolduracağım.

Fxml dosyamıza çift tıklayıp tablviewdeki satırları scene builderdan silelim. Tableviewin adını tableview yapalım. (fx:id özelliği)

Tableviewi formun üstüne soluna ve sağına yapıştırmak için tableviewi seçip layout bölümündeki üst sol ve sağ değerlerini 0 yapıyorum. Burda formumuz büyütülse de tableview de ona bağlı olarak büyüyecektir. Butonumuzu da aynı şekilde alt ve sağa yapıştırabiliriz.

Sütunların tablo içerisinde tablonun genişliğine göre otomatik boyutlanması için tableviewin propertiesinden contrained-resize ı seçiyoruz.

Veritabanı bağlantısı için DBConnect.java adlı bir dosya oluşturalım. Static bir sınıf olduğu için yeni bir nesne oluşturmadan direkt metodlarını kullanabileceğiz.

Kodlar

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package javafxdb2;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
 *
 * @author Arif
 */
public class DBConnect {
    private static Connection conn;
    private static String url = "jdbc:mysql://localhost/java"; //veritabanımın adı java
    private static String user = "root"; //kullanıcı adı
    private static String pass = "";//şifre

    public static Connection connect() throws SQLException{
        try{
            Class.forName("com.mysql.jdbc.Driver").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,user,pass);
        return conn;
    }
    public static Connection getConnection() throws SQLException, ClassNotFoundException{
        if(conn !=null && !conn.isClosed())
            return conn;
        connect();
        return conn;

    }

}

 

Tabii jdbc mysql kütüphanesini de uygulamamıza import etmemiz gerekiyor.

Library klasöründe sağ tıklayıp Add librarye tıkladığımızda gelen pencerede mysql jdbc driveri seçelim.

Documentcontroller.java dosyamızı açıp tableviewimizi tanımlayalım.

@FXML

private TableView tableview;

tablodoldur metodumuz da aşağıda.

 private void tablodoldur()
    {
        tableview.getColumns().clear();
          Connection c ;
          data = FXCollections.observableArrayList();
          try{
            c = (Connection) DBConnect.connect();
            //sql string ifademiz. 
            String SQL = "SELECT * from bilgi";//tablomuzun adı bilgi. id ve adi alanları var. 
            //ResultSet
            ResultSet rs = c.createStatement().executeQuery(SQL);

            // TABLO SÜTUNLARINI DİNAMİK OLARAK EKLEYECEĞİMİZ YAPI 
             
            for(int i=0 ; i<rs.getMetaData().getColumnCount(); i++){
                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 SimpleStringProperty(param.getValue().get(j).toString());                        
                    }                    
                });
               
                tableview.getColumns().addAll(col); 
                System.out.println("Column ["+i+"] ");
            }

            //ObservableList e verileri ekleyen döngü
            while(rs.next()){
                //Satırları yinele
                ObservableList<String> row = FXCollections.observableArrayList();
                for(int i=1 ; i<=rs.getMetaData().getColumnCount(); i++){
                    //sütunları yinele
                    row.add(rs.getString(i));
                }
                System.out.println("Satır eklendi "+row );
                data.add(row);
            }

            //Sonucu tabloya ekleme
            tableview.setItems(data);
          }catch(Exception e){
              e.printStackTrace();
              System.out.println("Hata oluştu");             
          }
    }

 

Butona tıkladığımızda tabloyu dolduracak kodumuzu yazalım.

@FXML

private void handleButtonAction(ActionEvent event) {

tableview.getColumns().clear();

tablodoldur();

}

 

Burada sütunları silme metodunu butona ikinci defa tıklandığında önceki sütunları kaldırmayıp yanına sütunlar eklediği için yerleştirdim. Yani tablonun sütunlarını silip yeniden dolduruyor.

Programımızı çalıştırdığımızda butona tıkladığımızda verilerin tabloda çağırıldığını göreceğiz.

Şimdi FXML dosyamıza scene builder içerisinde bir buton ve textfield ekleyelim. Butona tıklayınca textfielddeki adı tablomuze eklesin ve tableviewi yenilesin.

Textfieldin prompttext özelliğine adı yazın yazıyorum. Butonun da text özelliğine ekle yazıyorum. Textfieldin fx:id özelliği de txtad olsun.

Butona tıkladığımızda çalışacak olan metodu da onaction içerisine yazalım.

Action adı handleEkle.

Şimdi controllerimize kodlarımızı yazalım.

   @FXML
    private TextField txtad; //txtadi tanımladık. Uyarı verdiği yere tıklayarak TextFieldi import edebiliriz. 
    
    @FXML
    private void handleEkle(ActionEvent event){
        Connection c;
        
        try{
        c = (Connection) DBConnect.connect();
        String query = "insert into bilgi(ad) values(?)"; //sqlimizi yazıyoruz. Değeri aşağıda tanımlayacağız. 

      PreparedStatement preparedStmt = c.prepareStatement(query);
      preparedStmt.setString (1, txtad.getText().toString()); //? ile belirttiğimiz değer. 
      preparedStmt.execute();//komutu çalıştırıyoruz
      tablodoldur();//tablomuzu yeniliyoruz. 
      txtad.setText("");//txtadi temizliyoruz. 
      
        }
        catch(Exception e){
            System.out.println(e.toString());
        }
    }

 

Programımızı çalıştırdığımızda textfielde değeri girip ekleye tıkladığımızda veritabanına eklendiğini ve tablomuzun yenilendiğini göreceğiz.

FXMLDocumentController.java dosyamızın tam kodu;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package javafxdb2;

import com.mysql.jdbc.Connection;
import java.net.URL;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ResourceBundle;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.util.Callback;

/**
 *
 * @author Arif
 */
public class FXMLDocumentController implements Initializable {
    private ObservableList<ObservableList> data;


    
    @FXML
    private TableView tableview;
    
    
    @FXML
    private void handleButtonAction(ActionEvent event) {
        tableview.getColumns().clear();
        tablodoldur();
    }
    
    private void tablodoldur()
    {
        tableview.getColumns().clear();
          Connection c ;
          data = FXCollections.observableArrayList();
          try{
            c = (Connection) DBConnect.connect();
            //sql string ifademiz. 
            String SQL = "SELECT * from bilgi";//tablomuzun adı bilgi. id ve adi alanları var. 
            //ResultSet
            ResultSet rs = c.createStatement().executeQuery(SQL);

            // TABLO SÜTUNLARINI DİNAMİK OLARAK EKLEYECEĞİMİZ YAPI 
             
            for(int i=0 ; i<rs.getMetaData().getColumnCount(); i++){
                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 SimpleStringProperty(param.getValue().get(j).toString());                        
                    }                    
                });
               
                tableview.getColumns().addAll(col); 
                System.out.println("Column ["+i+"] ");
            }

            //ObservableList e verileri ekleyen döngü
            while(rs.next()){
                //Satırları yinele
                ObservableList<String> row = FXCollections.observableArrayList();
                for(int i=1 ; i<=rs.getMetaData().getColumnCount(); i++){
                    //sütunları yinele
                    row.add(rs.getString(i));
                }
                System.out.println("Satır eklendi "+row );
                data.add(row);
            }

            //Sonucu tabloya ekleme
            tableview.setItems(data);
          }catch(Exception e){
              e.printStackTrace();
              System.out.println("Hata oluştu");             
          }
    }
    
    @FXML
    private TextField txtad; //txtadi tanımladık. Uyarı verdiği yere tıklayarak TextFieldi import edebiliriz. 
    
    @FXML
    private void handleEkle(ActionEvent event){
        Connection c;
        
        try{
        c = (Connection) DBConnect.connect();
        String query = "insert into bilgi(ad) values(?)"; //sqlimizi yazıyoruz. Değeri aşağıda tanımlayacağız. 

      PreparedStatement preparedStmt = c.prepareStatement(query);
      preparedStmt.setString (1, txtad.getText().toString()); //? ile belirttiğimiz değer. 
      preparedStmt.execute();//komutu çalıştırıyoruz
      tablodoldur();//tablomuzu yeniliyoruz. 
      txtad.setText("");//txtadi temizliyoruz. 
      
        }
        catch(Exception e){
            System.out.println(e.toString());
        }
    }
    
    
    
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
    }    
    
}

Resimleri ofis dosyasından aktardığım için biraz bozmuş ama açıklamalarını yazdım.

Kodları indirmek ve incelemek için tıklayın.

İyi çalışmalar

Share this Post

2 Comments

  1. çalışmıyor. bir kere bir main yok yani giriş noktası.
    çalışır şekilde varsa tekrar link atarmısınız?

    1. Merhaba. Şansınıza projenin kaynak kodlarını buldum. https://yadi.sk/d/r_q2C80jucb7q linkten indirebilirsiniz. Veritabanını da bendeki gibi ayarlamanız gerekiyor. iyi çalışmalar.

Leave a Comment

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
*
*