2017-05-16 14 views
12

kullanılmaksızın bir javafx sahne başlat bir javafx projesinde quiz_scene ve quiz_scene_controller aradı. Bu sahne bir soru ve cevap sınav oyunu simüle eder. Sahnelerin nesnesi, question_label ve answer_text_field veya answer_buttons. Toplamda soru sayısı 7'dir ve sistem bir sonraki sahneye yönlendirildikten sonra.Ben yeni bir sahne yarattık bir düğme olayı

Sisteme girdiğimde, soruları ve yanıtları almak için soruları ve yanıtları içeren bir sql veritabanına bir başlatma işlevinde bir sorguyu gerçekleştirmek için sisteme giriyorum. Bu prosedür, sistem quiz_scene (ve ayrıca her yanıt düğmesine basıldığında) açıldığında bir kez gerçekleşmelidir. Sorgunun işlevselliğini **@FXML public void initialize()** içinde eklemeyi denedim, ancak çalışmadı.

Bir düğme olayında işlevselliği eklemeyi denediğimde, sorgu çalıştı ve ben db'den gelen bilgileri kullanarak sahnenin etiketini ve düğmelerini değiştirebiliyorum. Bulduğum konulardan biri, sorguyu gerçekleştirdiğimde quiz_scene için yükleyiciyi içeren ana sınıfıma bir başvuru oluşturduğum gerçeğidir. Olay olmadan mevcut nesneyi almıyorum ve boş bir tane alıyorum. Bir düğme kullanmadan nasıl yapabilirim? Neden nesnem boş?

Buradaki kodu şu adreste bulabilirsiniz: code.

loader = new FXMLLoader();   
loader.setLocation(Flow.class.getResource("/gui/quiz/quiz.fxml")); 
quizPane = loader.load(); 
quizSceneController quiz = loader.getController(); 

EDIT:

public class quizSceneController{ 

private Flow flow; 
public void setMain(Flow flow){ this.flow = flow;} 
@FXML Button answerbutton; 
@FXML Text timeField, scoreField; 
@FXML public Label question, showQuestionCounter, answer, questionId, questionType, questionSpeed; 
NextQuestion nextQuestion; 
public String temp, temp2; 
public GridPane takingTestPane = new GridPane(); 

public void chooseNextQuestion(Flow flow){ 

    try { 
     this.flow.nextQ = false; 
     this.flow.startTime = System.currentTimeMillis(); 
     //Choosing the next question 
     String sql = "select * from Questions where Subject = ? and Level = ? and questionId = ?"; 
     PreparedStatement pst = 
this.flow.connectionQuestions.prepareStatement(sql); 
     pst.setString(1, this.flow.textSubjectQTest); 
     pst.setString(2, this.flow.user_course_level); 
     pst.setString(3, this.flow.list.get(counter)); 
     ResultSet rs = pst.executeQuery(); 
     if (rs.next()) { 

      temp = rs.getString("Question"); 
      temp2 = rs.getString("Answer"); 

      pst.execute(); 
      pst.close(); 
     } else { 
      System.out.println("No data for this subject"); 
     } 

    } catch (Exception a) { 
     System.out.println(a); 
    } 
} 

@FXML private void myButton(ActionEvent event){ 

    chooseNextQuestion(this.flow); 
    this.question.setText(temp); 
} 
@FXML public void initialize(){ 

    chooseNextQuestion(this.flow); 
    this.question.setText(temp); 
} 
} 

Sonunda ana sınıfından fxml yükleme am yolu şudur Nasıl olabilir yerine chooseNextQuestion kodunu kullanarak tüm sahneyi başlatmak için düğmeye kullanmanın?

+0

Sadece scene_controller ürününün basit bir örneğini ekleyin. – christosh

+0

Olumlu tarafta olsa kod, java web ide içinde, bu yüzden daha iyi yapılandırılmış. Bu nedenle orada yayınladım. Benim düşünceme göre, kodu kontrol etmek için stackoverflow formatı kullanmaktan daha kolay. – christosh

+0

Haklısın, her ikisi de daha iyi. Ancak bana inanın, nedenleri estetikti. – christosh

cevap

5

Muhtemelen fxml dosyasını yüklemek için böyle bir şey yapıyoruz: initialize yöntem önce FXMLLoader.load yani sırasında yürütüldüğünde Ancak

FXMLLoader loader = new FXMLLoader(getClass().getResource("myFXML.fxml")); 
Parent p = loader.load(); 
quizSceneController controller = loader.getController(); 
controller.setMain(this); 

setMain çağrılır. flow alanı hala o sırada null içeriyor. Bu sorunu gidermek için

, sen setter kod yürütebilir:

public void setMain(Flow flow){ 
    this.flow = flow; 
    chooseNextQuestion(this.flow); 
    this.question.setText(temp); 
} 

Alternatif yüklemeden önce başlatmak/kontrolör kendinizi fxml kök öğesinden fx:controller niteliğini kaldırmak ve oluşturmak fxml dosyası:

FXMLLoader loader = new FXMLLoader(getClass().getResource("myFXML.fxml")); 
quizSceneController controller = new quizSceneController(); 
controller.setMain(this); 
loader.setController(controller); 
Parent p = loader.load(); 
+0

Ancak bu setMain, sahneye her girişimde çalışıyor mu? Ya da daha iyisi, bu fonksiyonun sahneyi hazırlarken çalıştığından nasıl emin olabilirim? – christosh

+0

Aslında bu geçerli sahneyi girdiğimde denetleyicinin işlevselliğinin gerçekleşmesini istiyorum. Bunu nasıl yapabilirim? – christosh

+0

@christosh Cidden, çoğu insan bu çözümü kullanırken karşılaştığınız sorunu anlamadığını düşünüyorum. Fabian'ın bu iki çözümü bana doğru ve mantıklı geldi. – Jai

1

Kişisel kontrolör Initializable arabirim uygulamak gerekiyor

import javafx.fxml.Initializable; 

public final class QuizSceneController implements Initializable { 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
      // do stuff 
    } 
} 
+0

Uygulanamayan öğeleri ekleyemiyorum Başlatılabilir (import javafx.fxml.Initializable;).Bir hata alıyorum QuizSceneController soyut ya da soyut yöntem public void initialize (URL konumu, ResourceBundle kaynakları) uygulamak açıklanmalıdır. Aslında yöntemi ekledim ve aynı zamanda @Override yönteminde de sorunlar alıyorum. – christosh

+0

Derleyicinin neden soyut olması gerektiğini anlattığını anlamıyorum. Projelerim için sorunsuzca sorunsuz çalışıyor ... hangi java/javafx sürümünü kullanıyorsunuz? – Westranger

+0

Aslında, başlatma işlemi düzgün çalışmadığı için. – christosh

İlgili konular