2011-08-29 30 views
7

Onay kutularında bir tablom var. Üçüncü veya dördüncü sütundaki onay kutusunu tıkladığımda ilk sütundaki onay kutusunun seçimini değiştirmek istiyorum. Aynı sıradaki diğer hücreleri değiştirebilmek istiyorum. Zaten sütunlarım var, bu yüzden hücrenin hangi sırada olduğunu bilmek istiyorum. Şimdiye kadar doğru olup olmadığı konusunda da çok emin değilim.JavaFX 2: TableCell Satır Dizini Al

Öyle yapmış kadarıyla

çoğunlukla düşündüm Ne Burada

enter image description here

benim SSCCE olan (Kısa Sel f İçermeyen Örnekler)

Aşağıdaki kodda bir sorun varsa lütfen beni düzeltin. getTableView().edit(getTableRow().getIndex(), param) aramaya

package javafxapplication5; 

import javafx.application.Application; 
import javafx.beans.property.StringProperty; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.control.CheckBox; 
import javafx.scene.control.TableCell; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import javafx.scene.paint.Color; 
import javafx.stage.Stage; 
import javafx.util.Callback; 

public class JavaFXApplication extends Application { 

    private static final ObservableList<ContactOptions> addContactOption = FXCollections.observableArrayList(
      new ContactOptions("Yes", "John Doe", "No", "Yes"), 
      new ContactOptions("Yes", "Jane Doe", "No", null), 
      new ContactOptions("Yes", "John Smith", "Yes", "Yes"), 
      new ContactOptions("Yes", "Patty Smith", "Yes", "No"), 
      new ContactOptions("Yes", "Jo Johnson", "Yes", "Yes"), 
      new ContactOptions("No", "Mary Johnson", "No", "No"), 
      new ContactOptions("Yes", "Clint Doe", "No", null), 
      new ContactOptions("Yes", "Sally Sue", "No", "Yes"), 
      new ContactOptions("Yes", "Bob Ryan", null, "Yes"), 
      new ContactOptions("No", "Mary Sue", "No", "No"), 
      new ContactOptions("Yes", "Bob Smith", "No", "Yes")); 
    private static TableView<ContactOptions> contactOptions = new TableView<ContactOptions>(); 

    public static void main(String[] args) { 
     Application.launch(JavaFXApplication.class, args); 
    } 

    @Override 
    public void start(Stage primaryStage) { 
     primaryStage.setTitle("Hello World"); 
     Group root = new Group(); 
     Scene scene = new Scene(root, 400, 200, Color.LIGHTGREEN); 

     Callback<TableColumn, TableCell> cellFactory = new Callback<TableColumn, TableCell>() { 

      @Override 
      public TableCell call(final TableColumn param) { 
       final CheckBox checkBox = new CheckBox(); 
       final TableCell cell = new TableCell() { 

        @Override 
        public void updateItem(Object item, boolean empty) { 
         super.updateItem(item, empty); 
         if (item == null) { 
          checkBox.setDisable(true); 
          checkBox.setSelected(false); 
         } else { 
          checkBox.setDisable(false); 
          checkBox.setSelected(item.toString().equals("Yes") ? true : false); 
          commitEdit(checkBox.isSelected() ? "Yes" : "No"); 
         } 
        } 
       }; 
       cell.setNode(checkBox); 
       return cell; 
      } 
     }; 

     TableColumn firstCol = new TableColumn("Contact?"); 
     firstCol.setPrefWidth(60); 
     firstCol.setProperty("one"); 
     firstCol.setCellFactory(cellFactory); 

     TableColumn secondCol = new TableColumn("Name"); 
     secondCol.setPrefWidth(200); 
     secondCol.setSortAscending(true); 
     secondCol.setProperty("two"); 

     TableColumn thirdCol = new TableColumn("Call"); 
     thirdCol.setPrefWidth(60); 
     thirdCol.setProperty("three"); 
     thirdCol.setCellFactory(cellFactory); 

     TableColumn fourthCol = new TableColumn("Email"); 
     fourthCol.setPrefWidth(60); 
     fourthCol.setProperty("four"); 
     fourthCol.setCellFactory(cellFactory); 

     contactOptions.setItems(addContactOption); 
     contactOptions.getColumns().addAll(firstCol, secondCol, thirdCol, fourthCol); 
     contactOptions.setPrefSize(400, 200); 

     root.getChildren().add(contactOptions); 
     primaryStage.setScene(scene); 
     primaryStage.setVisible(true); 
    } 

    public static class ContactOptions { 

     private final StringProperty one; 
     private final StringProperty two; 
     private final StringProperty three; 
     private final StringProperty four; 

     ContactOptions(String col1, String col2, String col3, String col4) { 
      this.one = new StringProperty(col1); 
      this.two = new StringProperty(col2); 
      this.three = new StringProperty(col3); 
      this.four = new StringProperty(col4); 
     } 

     public String getOne() { 
      return one.get(); 
     } 

     public String getTwo() { 
      return two.get(); 
     } 

     public String getThree() { 
      return three.get(); 
     } 

     public String getFour() { 
      return four.get(); 
     } 
    } 
} 

cevap

6

Neredeyse

commitEdit çağırmadan önce, gerekli yoktur. Bu, hücreyi "düzenleme moduna" sokar. startEdit yöntemi olmadığından düzenleme moduna girme konusunda çok az şey vardır, ancak yine de gereklidir. Bundan sonra

, burada açıklandığı şekilde: http://download.oracle.com/javafx/2.0/ui_controls/table-view.htm

O

firstCol.setOnEditCommit(new EventHandler<EditEvent<String>>() { 
    @Override 
    public void handle(EditEvent<String> event) { 
     String newValue = event.getNewValue(); 
     ContactOptions data = (ContactOptions) event.getTableView().getItems().get(event.getTablePosition().getRow()); 
     data.one.set(newValue) 
     if(newValue.equals("No")) { 
      data.three.set("No"); 
      data.four.set("No"); 
     } 
    } 
} 

Şimdi bilmeniz gereken tüm how to update the table's display once the data is updated olduğunu aramak gereklidir.

1

Gözlemciler kullanmanın bir avantajı, JavaFX UI öğelerinin, "sahnelerin ardında" sizin için bağlayıcıları gerçekleştirebilmesidir. Başka bir deyişle, veri modeli sınıfınızı bir JavaFX Bean olarak uygularsanız, kullanıcı arayüzünüz her değiştiğinde kendini otomatik olarak güncelleyecektir. Bunu yaptığınızda, modelinizdeki gözlemlenebilir veriler için bağlamalar otomatik olarak atanır ve otomatik olarak oluşturulan bildirim etkinliklerini değiştirir. Bunun olması için veri modelinizi JavaFX fasülyesi paradigmasına göre tanımlamanız gerekir, aksi halde UI'niz değişikliklerin meydana gelmesiyle güncellenmeyecektir.

Veri modeli şöyle tanımlanır: Bu yanıt için

public static class ContactOptions { 

    private final StringProperty one; 
    private final StringProperty two; 
    private final StringProperty three; 
    private final StringProperty four; 

    ContactOptions(String col1, String col2, String col3, String col4) { 
     this.one = new StringProperty(col1); 
     this.two = new StringProperty(col2); 
     this.three = new StringProperty(col3); 
     this.four = new StringProperty(col4); 
    } 

    public String getOne() { 
     return one.get(); 
    } 

    public String getTwo() { 
     return two.get(); 
    } 

    public String getThree() { 
     return three.get(); 
    } 

    public String getFour() { 
     return four.get(); 
    } 
} 

, senin 1 örneği alanına, birinde sadece durulacak. Kodunuzu bu şekilde yazmak bir JavaFX Mülkün JavaFX fasulye paradigması ile uyumlu olacak şekilde, örneğin bu dönüşümü için:

public static class ContactOptions { 

    private final StringProperty one = new SimpleStringProperty(); 

    public final String getOne() { return this.one.get(); } 
    public final void setOne(String v) { this.one.set(v); } 
    public final StringProperty oneProperty() { return this.one; } 

Bir lazier sağlamak JavaFX fasulye için mülkiyet tanımlarını yazmak mümkündür başlatma, ancak bu işe yarayacak. Java çekirdeği ve JavaFX çekirdeği arasındaki fark, aynı zamanda özellik için bir erişim sağlayıcı (yukarıdaki son satır) sağlamanızdır.

Tüm alanlarınızı yukarıdakilere benzer özelliklerde yaparsanız, UI güncelleştirmelerinizin değişiklikleri yansıtacağını görürsünüz.