2013-06-12 12 views
20

के अंदर डेटा के आधार पर विभिन्न सेल फैक्ट्री मैं "कुंजी = मान" जोड़े को प्रस्तुत/संपादित करने के लिए तालिका दृश्य का उपयोग करने का प्रयास कर रहा हूं। तो तालिका में दो कॉलम होने चाहिए: "कुंजी" और "मान"। कुंजी सिर्फ एक सामान्य स्ट्रिंग है, और मूल्य कुछ भी हो सकता है। मेरी समस्या यह है कि मानों का डेटा प्रकार पंक्ति से पंक्ति में भिन्न हो सकता है। असल में, मैं बुलीयन मूल्यों और सूचियों के लिए विकल्पों के लिए चेकबॉक्स का उपयोग करना चाहता था। मैं सेल कारखाने की स्थापना द्वारा चेक बॉक्स या विकल्पों के साथ पूरे तालिका स्तंभ प्रस्तुत करना के लिए एक रास्ता मिल गया है:जावाएफएक्स 2 टेबल व्यू: सेल

final TableColumn<FieldValue, Field> valueColumn = new TableColumn<>("Value"); 
valueColumn.setCellFactory(new Callback<TableColumn<FieldValue, Field>, TableCell<FieldValue, Field>>() { 
    @Override 
    public TableCell<FieldValue, Field> call(final TableColumn<FieldValue, Field> column) { 
     // if (value instanceof Boolean) 
     return new CheckBoxTableCell<>(); 
    } 
}); 

लेकिन क्या मैं जरूरत आइटम के प्रकार है कि जा रहा है के आधार पर एक शर्त सम्मिलित करने के लिए सक्षम होने के लिए है सेल के अंदर प्रस्तुत किया जाना है। दूसरे शब्दों में, सेल स्तर पर कुछ सेल फैक्ट्री और कॉलम स्तर पर नहीं। और यह रेंडर समय पर मेरी हालत का मूल्यांकन करता है। मुझे अभी भी इसका कोई समाधान नहीं मिला है। शायद इस तरह के प्रतिपादन को लागू करने के लिए किसी के पास कुछ उचित तकनीकें हैं? शायद कुछ तीसरे पक्ष डाटाग्रिड?

उत्तर

33

यहां एक सारणी है जो विभिन्न प्रकार के स्ट्रिंग्स और ऑब्जेक्ट्स के जोड़े प्रदर्शित करती है।

एक कस्टम सेल फैक्ट्री का उपयोग विभिन्न ऑब्जेक्ट प्रकारों के प्रदर्शन को संभालने के लिए किया जाता है (ऑब्जेक्ट के प्रकार पर एक उदाहरण जांच करके और उपयुक्त टेक्स्ट या ग्राफ़िक प्रस्तुत करना)।

pairtable

import javafx.application.*; 
import javafx.beans.property.ReadOnlyObjectWrapper; 
import javafx.beans.value.ObservableValue; 
import javafx.collections.*; 
import javafx.scene.Scene; 
import javafx.scene.control.*; 
import javafx.scene.image.*; 
import javafx.scene.layout.*; 
import javafx.stage.Stage; 
import javafx.util.Callback; 
import javafx.util.Pair; 

public class PairTable extends Application { 
    public static final String NAME_COLUMN_NAME = "Name"; 
    public static final String VALUE_COLUMN_NAME = "Value"; 

    final TableView<Pair<String, Object>> table = new TableView<>(); 

    public static void main(String[] args) throws Exception { 
     launch(args); 
    } 

    public void start(final Stage stage) throws Exception { 
     // model data 
     ObservableList<Pair<String, Object>> data = FXCollections.observableArrayList(
       pair("Song", "Bach Cello Suite 2"), 
       pair("Image", new Image("http://upload.wikimedia.org/wikipedia/en/9/99/Bach_Seal.jpg")), 
       pair("Rating", 4), 
       pair("Classic", true), 
       pair("Song Data", new byte[]{}) 
     ); 

     table.getItems().setAll(data); 
     table.setPrefHeight(275); 

     // table definition 
     TableColumn<Pair<String, Object>, String> nameColumn = new TableColumn<>(NAME_COLUMN_NAME); 
     nameColumn.setPrefWidth(100); 
     TableColumn<Pair<String, Object>, Object> valueColumn = new TableColumn<>(VALUE_COLUMN_NAME); 
     valueColumn.setSortable(false); 
     valueColumn.setPrefWidth(150); 

     nameColumn.setCellValueFactory(new PairKeyFactory()); 
     valueColumn.setCellValueFactory(new PairValueFactory()); 

     table.getColumns().setAll(nameColumn, valueColumn); 
     valueColumn.setCellFactory(new Callback<TableColumn<Pair<String, Object>, Object>, TableCell<Pair<String, Object>, Object>>() { 
      @Override 
      public TableCell<Pair<String, Object>, Object> call(TableColumn<Pair<String, Object>, Object> column) { 
       return new PairValueCell(); 
      } 
     }); 

     // layout the scene. 
     final StackPane layout = new StackPane(); 
     layout.getChildren().setAll(table); 
     Scene scene = new Scene(layout); 
     stage.setScene(scene); 
     stage.show(); 
    } 

    private Pair<String, Object> pair(String name, Object value) { 
     return new Pair<>(name, value); 
    } 
} 

class PairKeyFactory implements Callback<TableColumn.CellDataFeatures<Pair<String, Object>, String>, ObservableValue<String>> { 
    @Override 
    public ObservableValue<String> call(TableColumn.CellDataFeatures<Pair<String, Object>, String> data) { 
     return new ReadOnlyObjectWrapper<>(data.getValue().getKey()); 
    } 
} 

class PairValueFactory implements Callback<TableColumn.CellDataFeatures<Pair<String, Object>, Object>, ObservableValue<Object>> { 
    @SuppressWarnings("unchecked") 
    @Override 
    public ObservableValue<Object> call(TableColumn.CellDataFeatures<Pair<String, Object>, Object> data) { 
     Object value = data.getValue().getValue(); 
     return (value instanceof ObservableValue) 
       ? (ObservableValue) value 
       : new ReadOnlyObjectWrapper<>(value); 
    } 
} 

class PairValueCell extends TableCell<Pair<String, Object>, Object> { 
    @Override 
    protected void updateItem(Object item, boolean empty) { 
     super.updateItem(item, empty); 

     if (item != null) { 
      if (item instanceof String) { 
       setText((String) item); 
       setGraphic(null); 
      } else if (item instanceof Integer) { 
       setText(Integer.toString((Integer) item)); 
       setGraphic(null); 
      } else if (item instanceof Boolean) { 
       CheckBox checkBox = new CheckBox(); 
       checkBox.setSelected((boolean) item); 
       setGraphic(checkBox); 
      } else if (item instanceof Image) { 
       setText(null); 
       ImageView imageView = new ImageView((Image) item); 
       imageView.setFitWidth(100); 
       imageView.setPreserveRatio(true); 
       imageView.setSmooth(true); 
       setGraphic(imageView); 
      } else { 
       setText("N/A"); 
       setGraphic(null); 
      } 
     } else { 
      setText(null); 
      setGraphic(null); 
     } 
    } 
} 
+0

है यही कारण है कि मैं अंत में इस विषय पर थोड़ा और अधिक समय बिताने के बाद ऐसा करने के लिए चुना। इस उत्तर के लिए धन्यवाद! मुझे यकीन नहीं था कि "अपडेट इटिम" विधि एक अच्छा परिणाम प्राप्त करने के लिए ओवरराइड करने वाला एकमात्र ऐसा था, लेकिन आपके उदाहरण के साथ यह ठीक काम करता है –

+0

काम करता है लेकिन अब कोशिकाएं केवल पढ़ी जाती हैं ... कोई विचार उन्हें कैसे बनाना है संपादन योग्य? – Eddy

+0

कृपया एक नया प्रश्न एडी के रूप में पूछें – jewelsea

संबंधित मुद्दे