Başlangıç olarak böyle bir ekran bizi karşılayacak sonraki soru butonuna bastıkça ilerleyecek ve bize veri tabanından çektiği soruları yöneltecek.
En sonda ise;
Bu şekilde bize toplam da kazandığımız puanı gösterecek.
Kodlara başlamadan önce veri tabanı sınıfını tekrar yazmayacağım bunu daha önceki yazılarımdan bulabilirsiniz tek değişiklik yapacağımız yer ;
final private String url="jdbc:mysql://localhost:3306/sorular";
Kısmı olacak. Benim veri tabanı ismim sorular şeklinde açılmıştı siz istediğinize göre değiştirebilirsiniz tabi ki.
Veri tabanını da göstereyim ;
Arayüz tasarımımız scene Builder üzerinden şu şekilde olacak.
Bu şekilde şimdi kodlara geçersek eğer;
Dilerseniz soru sınıfını gösterelim.Soru şeklinde bir java.class açıp içine bunları yazacağız ve daha sonra getter ve setter yapacağız.
(Getter ve setter nasıl yapılır derseniz fn+alt+insert tuşlarına basarsanız açılan pencerede getter and setter yazan yere tıklayıp hepsini seçtikten sonra kendi oluşturur.)
int s_id,puan; String soru,d_cevap,cevap1,cevap2,cevap3,cevap4;
Öncelikle veri tabanından soruları alacağımız kodları yazacağımız sınıftan başlıyorum.(soruController) ilk komutumuz bize soru sıramız hangisinde ise bize sırasına göre getirecek.
public soru getQuestion(int sira){//Buraya sorunun sırasını göndericez try { soru a = new soru();/soru sınıfından bir değişken aldık Baglanti vb = new Baglanti(); vb.baglan(""); PreparedStatement ps = vb.connection.prepareStatement("select * from sorular where s_id = ?");//s_id'ye göre sorularımızı getirecek ps.setInt(1, sira);//soru işareti yerine sorgu için gelen sırayı yerleştirdik ResultSet rs = ps.executeQuery(); while (rs.next()) { a.setCevap1(rs.getString("cevap1"));//değişkenimize atıyoruz a.setCevap2(rs.getString("cevap2")); a.setCevap3(rs.getString("cevap3")); a.setCevap4(rs.getString("cevap4")); a.setD_cevap(rs.getString("dogru_cevap")); a.setPuan(rs.getInt("puan")); a.setS_id(rs.getInt("s_id")); a.setSoru(rs.getString("soru")); } return a;//soru değişkenini geri döndürüyoruz. } catch (Exception e) { System.out.println(e.getMessage()); return null; } }
Diğer fonksiyonumuz ise doğru cevap verilip verilmediğini kontrol edecek.
public soru check(String cevap){//radyo butondan çekeceğimiz cevabı göndereceğiz soru a = new soru();//değişken çağırdık try { Baglanti vb = new Baglanti(); vb.baglan(""); PreparedStatement ps = vb.connection.prepareStatement("select puan from sorular where dogru_cevap=?");//doğru cevaba göre veri tabanından kontrol edecek ps.setString(1, cevap);//sorguda '?' yerine gelen cevabı yerleştirdik. ResultSet rs = ps.executeQuery(); while (rs.next()) { a.setPuan(rs.getInt("puan"));//gelen puanı değişkene atadık } return a;//değişkeni sadece puanıyla beraber geri döndürdük } catch (Exception e) { System.out.println(e.getMessage()); a.setPuan(5); return a; } }
Ve asıl komutları yazacağımız yere gelirsek (FXMLDocumentController) kodlarımız şöyle olacak.
//Her yerden ulaşabilmek için değişkenleri dışarıda tanımladık soruController src = new soruController(); soru s = new soru(); //ilk açılışta karşımıza ilk sıradaki soruyu çekip yerleştirmesini istiyoruz @Override public void initialize(URL url, ResourceBundle rb) { //toogle group yapıyoruz. Bu radyo butonlarının ikisine birden tıklamamızı engelleyecek rb_1.setToggleGroup(sorular); rb_2.setToggleGroup(sorular); rb_3.setToggleGroup(sorular); rb_4.setToggleGroup(sorular); lbl_kalan.setText("1");//Bu label butonun yanındaki hangi soruda isek onu gösteren labelimiz ilk soru olduğu için '1' yazdırdık lbl_puan.setText("0");//puan başta '0' olacağı için '0' yazdırdık s=src.getQuestion(1);//soruController sınıfından 1. soruyu çağırdık. lbl_soru.setText(s.getSoru());//teker teker label'e ve radyo butonlara ekliyoruz. rb_1.setText(s.getCevap1()); rb_2.setText(s.getCevap2()); rb_3.setText(s.getCevap3()); rb_4.setText(s.getCevap4()); }
Şimdi sonraki soru butonuna bastığımızda ne yapacağını belirteceğiz. Temel mantık olarak bize ilk bastığımızda 2. soruyu getirmesi gerekli bu yüzden ilk başta 2. soruyu isteyeceğiz daha sonra değişkenleri arttırarak sonraki soruları alacağız. İncelersek;
//ilk başta 2. soruyu alacağımız için gerekli değişkenleri tanımladık int i=2;//sorunun sırası int x=2;//arayüzde labele yazdıracağımız değişken int puan = 0; @FXML private void next(ActionEvent event) { soru a= new soru(); /*öncelikle veri tabanında 10 soru olduğu için 11. sıraya geldiyse programı kapatmamız gerekli ilk önce bunu kontrol etmesi gerekli olduğu için en başa yazdık*/ if(x==11){ lbl_puan.setText(String.valueOf(puan));//sağ üst köşede puan yerine topladığımız puanı yazdıracağız rb_1.setDisable(true);//radyo butonları disable yapıyoruz rb_2.setDisable(true); rb_3.setDisable(true); rb_4.setDisable(true); //ayrı bir pencerede puanı gösteriyoruz JOptionPane.showMessageDialog(null, "Tebrikler puanınız ="+puan); } //her radyo butona basıldığında yapılacaklar if(rb_1.isSelected()){ a = src.check(rb_1.getText());//radyo butonunun üzerindeki text'i alıp kontrol fonksiyonuna yolluyoruz. puan = puan + a.getPuan();//puanı alıp elimizde olan puana ekliyoruz rb_1.setSelected(false);//seçili olduğu için iptal ediyoruz ki diğer soru geldiğinde seçili gözükmesin } else if(rb_2.isSelected()){ a = src.check(rb_2.getText()); puan = puan + a.getPuan(); rb_2.setSelected(false); } else if(rb_3.isSelected()){ a = src.check(rb_3.getText()); puan = puan + a.getPuan(); rb_3.setSelected(false); } else if(rb_4.isSelected()){ a = src.check(rb_4.getText()); puan = puan + a.getPuan(); rb_4.setSelected(false); } else{//eğer seçim yapmadan butona basılırsa uyarı verdiriyoruz. JOptionPane.showMessageDialog(null, "Lutfen seciminizi yapınız."); return; } //ilk başta buraya '2' gönderip 2. sırada ki soruyu çekiyoruz s=src.getQuestion(i); lbl_soru.setText(s.getSoru()); rb_1.setText(s.getCevap1()); rb_2.setText(s.getCevap2()); rb_3.setText(s.getCevap3()); rb_4.setText(s.getCevap4()); //yine ilk başta 2. soruya geçeceğimiz için 2 yazıdıracağız lbl_kalan.setText(String.valueOf(x)); //daha sonra x ve i değerlerini arttırıyoruz ki her seferinde bir sonraki soruyu getirsin x++; i++; }
Evet arkadaşlar bu şekilde kısa bir program daha da geliştirilebilir tabi ki.
Veritabanı ve projenin aslını buradan indirebilirsiniz.