SORU
6 Ocak 2013, Pazar


Geçen Parametreleri JavaFX FXML

Nasıl javafx ikincil bir pencereye parametreleri geçebilir miyim? Bir şekilde ilgili denetleyicisi ile iletişim kurmak için var mı?

Örneğin: Kullanıcı TableView bir müşteri seçer ve yeni bir pencere, müşterinin bilgi gösteren açılır.

Stage newStage = new Stage();
try 
{
    AnchorPane page = (AnchorPane) FXMLLoader.load(HectorGestion.class.getResource(fxmlResource));
    Scene scene = new Scene(page);
    newStage.setScene(scene);
    newStage.setTitle(windowTitle);
    newStage.setResizable(isResizable);
    if(showRightAway) 
    {
        newStage.show();
    }
}

newStage yeni bir pencere olacaktır. Sorun, müşteri bilgisi (parametre olarak ıd geçerek) için denetleyici söylemek için bir yol bulamıyorum.

Herhangi bir fikir?

CEVAP
7 Ocak 2013, PAZARTESİ


Yaklaşım Önerdi

Bu cevap FXML denetleyicileri için parametreleri iletmek için farklı mekanizmalar sıralar.

Küçük uygulamalar için son derece doğrudan denetleyici arayan parametreleri - basit, anlaşılır geçen tavsiye ve ekstra çerçeve gerektirir.

Daha karmaşık uygulamalar için daha büyük, değerli, Eğer uygulama içinde Dependency Injection Event Bus mekanizmaları kullanmak istiyorsanız soruşturma olurdu.

Doğrudan Kumanda Arayan yanından geçerken Parametreleri

FXML loader örneği denetleyicisi alınıyor ve denetleyici bir yöntem gerekli veri değerleri ile başlatmak için arayarak FXML denetleyicisi için özel veri aktarmak.

Aşağıdaki kodu gibi bir şey:

public Stage showCustomerDialog(Customer customer) {
  FXMLLoader loader = new FXMLLoader(
    getClass().getResource(
      "customerDialog.fxml"
    )
  );

  Stage stage = new Stage(StageStyle.DECORATED);
  stage.setScene(
    new Scene(
      (Pane) loader.load()
    )
  );

  CustomerDialogController controller = 
    loader.<CustomerDialogController>getController();
  controller.initData(customer);

  stage.show();

  return stage;
}

...

class CustomerDialogController() {
  @FXML private Label customerName;
  void initialize() {}
  void initData(Customer customer) {
    customerName.setText(customer.getName());
  }
}

Yeni bir FXMLLoader new FXMLLoader(location) yani örnek kodda gösterildiği gibi inşa edilmiştir. Konumu bir URL ve FXML kaynak: bir böyle bir URL oluşturabilirsiniz

new FXMLLoader(getClass().getResource("sample.fxml"));

Bu FXMLLoader statik yük fonksiyonu kullanmak için dikkatli olun, ya da loader örneğinden denetleyicisi almak mümkün olmayacaktır.

FXMLLoader örnekleri kendilerini asla etki alanı nesneleri hakkında bir şey biliyor. Doğrudan FXMLLoader kurucu belirli bir etki alanı nesneleri uygulama başarılı, senin yerine:

  1. Bir FXMLLoader fxml dayanarak belirli bir yerde biçimlendirme oluşturmak
  2. FXMLLoader örneği bir kumanda alın.
  3. Alınan denetleyicisinde yöntemleri etki alanı nesneleri başvurular ile kontrol sağlamak çağırmak.

Bu blog (başka bir yazar tarafından) bir alternatif ama benzer example sağlar.

Bu FXMLLoader üzerinde bir Denetleyici ayarı

CustomerDialogController dialogController = 
    new CustomerDialogController(param1, param2);

FXMLLoader loader = new FXMLLoader(
    getClass().getResource(
        "customerDialog.fxml"
    )
);
loader.setController(dialogController);

Pane mainPane = (Pane) loader.load();

Kodu yeni bir kontrolör, kontrolör kurucu arayan, sizin istediğiniz herhangi bir parametre geçirerek hazırlayabilirsiniz. Bir denetleyici inşa sonra, FXMLLoader örneği ayarlayabilirsinizönceload() çağırmakörnekyöntem.

Bir loader (JavaFX 2.bir kumanda seti x), fxml dosyası fx:controller bir nitelik tanımlanamaz.

FXML fx:controller tanımını sınırlaması nedeniyle, ben şahsen FXMLLoader gelen kumanda almak yerine FXMLLoader içine denetleyicisi ayarı tercih.

Denetleyicisi olan Harici Statik bir Yöntem Parametreleri Almak

Bu yöntem Javafx 2.0 How-to Application.getParameters() in a Controller.java file Sergey cevabı tarafından örneklendirilmiştir.

Bağımlılık Enjeksiyon Kullanın

FXMLLoader sana FXMLLoader özel bir denetleyici fabrika ayarlamak için izin vererek, Bahar ya da Java EE CDI Guice gibi bağımlılık enjeksiyon sistemleri destekler. Bu denetleyici bağımlı değerler ilgili bağımlılık enjeksiyon sistemi ile enjekte ile örnek oluşturmak için kullanabileceğiniz bir geri arama sağlar. Yeni özel kumanda fabrika özelliklerini kullanarak olacağını daha biraz clunkier olsa FXML with the Spring dependency injection system, entegre bir örnek JavaFX 2.2 kullanılabilir.

Gerçekten güzel, temiz bağımlılık enjeksiyon bir yaklaşım kullanan 20 ** bir örnek afterburner.fx framework tarafından örneklendirilmiştir. Turbo.fx *21 JEE6* bağımlılık enjeksiyon gerçekleştirmek için kullanır.

Olay bir Otobüs kullanın

Greg Brown, şartname yaratıcısı ve uygulayıcı orijinal FXML, sık sık örneği denetleyicileri ve diğer uygulama mantığı FXML arasındaki iletişim için event bus bir kullanımı dikkate öneriyor.

Bu EventBus basit ama güçlü/POJOs her yerde birbirimizi başvurmak zorunda kalmadan bir JVM içinde birbirleri ile iletişim kurmasını sağlayan ek açıklamalar ile API abone yayınlayın.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Adam Khoury

    Adam Khoury

    23 Ocak 2008
  • Goran Dimov

    Goran Dimov

    1 HAZİRAN 2014
  • TechBalance

    TechBalance

    12 HAZİRAN 2011