Tableview veritabanından veri doldurma ve ekleme-Javafx dersi 3
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
çalışmıyor. bir kere bir main yok yani giriş noktası.
çalışır şekilde varsa tekrar link atarmısınız?
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.