2012-07-10 10 views
8
TableColumn<Event,Date> releaseTime = new TableColumn<>("Release Time"); 
    releaseTime.setCellValueFactory(
       new PropertyValueFactory<Event,Date>("releaseTime") 
      ); 

मैं रिलीज़टाइम के प्रारूप को कैसे बदल सकता हूं? फिलहाल यह डेट ऑब्जेक्ट पर एक साधारण टूस्ट्रिंग को कॉल करता है।जावाएफएक्स टेबल सेल स्वरूपण

उत्तर

4

आप सेल फैक्ट्री के माध्यम से इसे पूरा कर सकते हैं।
https://stackoverflow.com/a/10149050/682495
https://stackoverflow.com/a/10700642/682495
देखें हालांकि 2 लिंक के बारे में ListCell है, एक ही तर्क पूरी तरह से लागू TableCell भी है के लिए है।

पीएस फिर भी अगर आपको कुछ नमूना कोड चाहिए, तो कृपया यहां संलग्न होगा।

5

मैं इस हाल ही में करने के लिए की जरूरत -

dateAddedColumn.setCellValueFactory(
    new Callback<TableColumn.CellDataFeatures<Film, String>, ObservableValue<String>>() { 
     @Override 
     public ObservableValue<String> call(TableColumn.CellDataFeatures<Film, String> film) { 
     SimpleStringProperty property = new SimpleStringProperty(); 
     DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); 
     property.setValue(dateFormat.format(film.getValue().getCreatedDate())); 
     return property; 
     } 
    }); 

हालांकि - यह एक बहुत जावा 8 में आसान है लांबा भाव का उपयोग कर:

dateAddedColumn.setCellValueFactory(
    film -> { 
     SimpleStringProperty property = new SimpleStringProperty(); 
     DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); 
     property.setValue(dateFormat.format(film.getValue().getCreatedDate())); 
     return property; 
    }); 

कि जावा 8 रिहाई ओरेकल के साथ जल्दी करो!

+1

यह शुरू में तालिका को आबाद करने के लिए ठीक काम करता है ... अगर मॉडल में तारीख संपत्ति बाद में SimpleStringProperty से बदल जाता है एक अधिसूचना उत्सर्जन नहीं है, और तालिका अद्यतन नहीं किया गया है। – Adam

7

यदि आप अपने टेबल कॉलम की सॉर्टिंग क्षमताओं को संरक्षित करना चाहते हैं, तो ऊपर दिए गए कोई भी समाधान मान्य नहीं है: यदि आप अपनी तिथि को स्ट्रिंग में कनवर्ट करते हैं और इसे अपने टेबल व्यू में दिखाते हैं; तालिका इसे इस प्रकार (गलत तरीके से) क्रमबद्ध करेगी।

जो समाधान मैंने पाया वह टूस्टिंग() विधि को ओवरराइड करने के लिए तिथि वर्ग को उप-वर्गीकृत कर रहा था। यद्यपि यहां एक चेतावनी है: TableView java.sutil.Date के बजाय java.sql.Date का उपयोग करता है; तो आपको पूर्व को उप-वर्ग करने की आवश्यकता है।

import java.text.SimpleDateFormat; 

public class CustomDate extends java.sql.Date { 

    public CustomDate(long date) { 
     super(date); 
    } 

    @Override 
    public String toString() { 
     return new SimpleDateFormat("dd/MM/yyyy").format(this); 
    } 
} 

तालिका उस तारीख को मुद्रित करने के लिए उस विधि को कॉल करेगी।

बेशक, आप भी नई उपवर्ग को TableColumn घोषणा में अपने दिनांक वर्ग को बदलने की जरूरत:

@FXML 
TableColumn<MyObject, CustomDate> myDateColumn; 

यही बात है जब आप अपने तालिका के स्तंभ के लिए अपने ऑब्जेक्ट विशेषता देते हैं:

myDateColumn.setCellValueFactory(new PropertyValueFactory< MyObject, CustomDate>("myDateAttr")); 

और अंत में, स्पष्टता के शेक के लिए यह है कि कैसे आप अपने वस्तु वर्ग में गेटर घोषित:

public CustomDate getMyDateAttr() { 
    return new CustomDate(myDateAttr.getTime()); //myDateAttr is a java.util.Date   
} 

इस तथ्य के कारण मुझे यह पता लगाने में थोड़ी देर लग गई कि यह दृश्यों के पीछे java.sql.Date का उपयोग करता है; तो उम्मीद है कि यह कुछ लोगों को कुछ समय बचाएगा! जावा FX8 के लिए

4

अद्यतन:

(मैं यह है कि उत्तर के लिए अच्छी जगह है यकीन नहीं है, लेकिन मैं JavaFX8 में समस्या हो और कुछ चीजें बदल गई हैं, java.time पैकेज की तरह)

पिछले उत्तरों के साथ कुछ मतभेद: मैं दिनांक प्रकार को कॉलम पर रखता हूं, इसलिए मुझे सेलवेल्यूफैक्टरी और सेल फैक्ट्री दोनों का उपयोग करने की आवश्यकता है। मैं सभी दिनांक कॉलम के लिए सेल फैक्टरी उत्पन्न करने के लिए एक सामान्य पुन: प्रयोज्य विधि बना देता हूं। मैं java.time पैकेज के लिए जावा 8 दिनांक का उपयोग करता हूं! लेकिन java.util.date के लिए विधि को आसानी से कार्यान्वित किया जा सकता है।

@FXML 
private TableColumn<MyBeanUi, ZonedDateTime> dateColumn; 

@FXML 
public void initialize() { 
    // The normal binding to column 
    dateColumn.setCellValueFactory(cellData -> cellData.getValue().getCreationDate()); 

    //.. All the table initialisation and then 
    DateTimeFormatter format = DateTimeFormatter .ofLocalizedDate(FormatStyle.SHORT); 
    dateColumn.setCellFactory (getDateCell(format)); 

} 

public static <ROW,T extends Temporal> Callback<TableColumn<ROW, T>, TableCell<ROW, T>> getDateCell (DateTimeFormatter format) { 
    return column -> { 
    return new TableCell<ROW, T>() { 
     @Override 
     protected void updateItem (T item, boolean empty) { 
     super.updateItem (item, empty); 
     if (item == null || empty) { 
      setText (null); 
     } 
     else { 
      setText (format.format (item)); 
     } 
     } 
    }; 
    }; 
} 

फायदे हैं कि:

  • स्तंभ एक "java8 तिथि" @Jordan द्वारा evoqued तरह समस्या से बचने के साथ लिखा गया
  • विधि "getDateCell" सामान्य है और हो सकता है सभी Java8 समय प्रकार के लिए एक util समारोह (स्थानीय Zoned आदि)
4

मैं फिर से प्रयोग करने योग्य स्तंभ फ़ॉर्मेटर है कि किसी भी java.text.Format लेता है बनाने के लिए जावा जेनरिक का उपयोग कर की सलाह देते हैं के रूप में इस्तेमाल किया। यह बॉयलरप्लेट कोड की राशि पर कटौती ...

private class ColumnFormatter<S, T> implements Callback<TableColumn<S, T>, TableCell<S, T>> { 
    private Format format; 

    public ColumnFormatter(Format format) { 
     super(); 
     this.format = format; 
    } 
    @Override 
    public TableCell<S, T> call(TableColumn<S, T> arg0) { 
     return new TableCell<S, T>() { 
      @Override 
      protected void updateItem(T item, boolean empty) { 
       super.updateItem(item, empty); 
       if (item == null || empty) { 
        setGraphic(null); 
       } else { 
        setGraphic(new Label(format.format(item))); 
       } 
      } 
     }; 
    } 
} 

उपयोग

birthday.setCellFactory(new ColumnFormatter<Person, Date>(new SimpleDateFormat("dd MMM YYYY"))); 
amplitude.setCellFactory(new ColumnFormatter<Levels, Double>(new DecimalFormat("0.0dB"))); 
2

के उदाहरण यह मैं क्या किया और मैं पूरी तरह से काम किया है।

import javafx.scene.control.TableCell; 
import javafx.scene.control.TableColumn; 
import javafx.util.Callback; 

public interface AbstractConvertCellFactory<E, T> extends Callback<TableColumn<E, T>, TableCell<E, T>> { 

    @Override 
    default TableCell<E, T> call(TableColumn<E, T> param) { 
     return new TableCell<E, T>() { 
      @Override 
      protected void updateItem(T item, boolean empty) { 
       super.updateItem(item, empty); 
       if (item == null || empty) { 
        setText(null); 
       } else { 
        setText(convert(item)); 
       } 
      } 
     }; 
    } 

    String convert(T value);   
} 

और इसकी नमूना उपयोग::

TableColumn<Person, Timestamp> dateCol = new TableColumn<>("employment date"); 
dateCol.setCellValueFactory(new PropertyValueFactory<>("emploumentDateTime"));  
dateCol.setCellFactory((AbstractConvertCellFactory<Person, Timestamp>) value -> new SimpleDateFormat("dd-MM-yyyy").format(value)); 
1

एक सार्वभौमिक समाधान है कि के रूप में सरल हो सकता है के बीच में।

//from my model 
    ObjectProperty<Date> valutaProperty; 

    //from my view 
    TableColumn<Posting, String> valutaColumn; 

    valutaColumn.setCellValueFactory(
      cellData -> { 
        SimpleStringProperty property = new SimpleStringProperty(); 
        property.bindBidirectional(cellData.getValue().valutaProperty, new SimpleDateFormat("dd.MM.yyyy", Locale.GERMAN)); 
        return property; 
       }); 
0

आप विभिन्न प्रकार के आसानी से पाइप गुण और एक फ़ॉर्मेटर या कनवर्टर डाल सकते हैं

tbColDataMovt.setCellFactory((TableColumn<Auditoria, Timestamp> column) -> { 
    return new TableCell<Auditoria, Timestamp>() { 
     @Override 
     protected void updateItem(Timestamp item, boolean empty) { 
      super.updateItem(item, empty); 
      if (item == null || empty) { 
       setText(null); 
      } else { 
       setText(item.toLocalDateTime().format(DateTimeFormatter.ofPattern("dd/MM/yyyy"))); 
      } 
     } 
    }; 
}); 
संबंधित मुद्दे