JTable с JDateChooserJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 JTable с JDateChooser

Сообщение Anonymous »

Я создаю приложение Java Swing на Java 8.
Поэтому мне нужно создать JTable с пользовательской TableModel, которая содержит JDateChooser или аналогичный объект для установки LocalDate в одном столбце.
Это мой собственный TableCellRendered.

Код: Выделить всё

@SuppressWarnings("serial")
public class JDateChooserRenderer extends JDateChooser implements TableCellRenderer {

public JDateChooserRenderer(JDateChooser dateChooser) {
if (dateChooser != null) {
this.setDate(dateChooser.getDate());
}
}

public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}

@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {

if (value instanceof Date) {
this.setDate((Date) value);
} else if (value instanceof String) {
if(!value.toString().isEmpty()){
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
try {
Date myDate = formatter.parse(value.toString());
this.setDate(myDate);
} catch (Exception e) {
e.printStackTrace();
}
}
}
return this;
}

}
Это мой собственный TableCellEditor:

Код: Выделить всё

@SuppressWarnings("serial")
public class JDateChooserCellEditor extends AbstractCellEditor implements TableCellEditor {

private JDateChooser dateChooser = new JDateChooser();

public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column) {

Date date = null;
if (value instanceof Date) {
date = (Date) value;
}
dateChooser.setDateFormatString("dd-MM-yyyy");
dateChooser.setDate(date);

return dateChooser;
}

public Object getCellEditorValue() {

dateChooser.setDateFormatString("dd-MM-yyyy");
return dateChooser.getDate();
}

}
Это код для установки JDateChooserRenderer в столбце моей JTable:

Код: Выделить всё

JDateChooser dateChooser = new JDateChooser();
tableScadenza.getColumnModel().getColumn(1).setCellRenderer(new JDateChooserRenderer(dateChooser));
tableScadenza.getColumnModel().getColumn(1).setCellEditor(new JDateChooserCellEditor());
Когда я запускаю приложение Java Swing, я вижу следующее:
Изображение

Это моя пользовательская модель JTableModel:

Код: Выделить всё

public class MyTableModelScadenza extends defaultTableModel{

/**
*
*/
private static final long serialVersionUID = -6384221858449579588L;
static String[] ColName = {"Qtà", "Data Sc.", "Lotto"};
public List listaArticoli;
final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd-mm-yyyy");

public MyTableModelScadenza(int n) {
super(ColName, n);
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return true;
}
public String getColumnName(int col) {
return ColName[col];
}

public int getColumnCount() {
return ColName.length;
}
public Class getColumnClass(Float columnIndex) {
return Float.class;    // Le due colonne sono numeri interi
}

public void stampaTabella(){
int i=0;
for(Iterator it= listaArticoli.iterator();  it.hasNext();){
ArticoliScadenza mag = it.next();
super.setValueAt(mag.getQuantita(), i, 0);
//super.setValueAt(mag.getSconto(), i, 1);
i++;
}
}

public void pulisciValori(){
this.setListaArticoli(new ArrayList());
this.setRowCount(0);
this.addRow(new Vector());
}

public void setValueAt(Object value, int row, int column){
if(listaArticoli==null){
listaArticoli = new ArrayList();
}
if(column ==0){
if(value!=null){
try{
ArticoliScadenza art = null;
if(listaArticoli.size() > row){
art = listaArticoli.get(row);
}
if(art==null){
art = new ArticoliScadenza();
art.setQuantita(Integer.parseInt(value.toString()));
listaArticoli.add(row, art);
}else{
art.setQuantita(Integer.parseInt(value.toString()));
}
super.setValueAt(value, row, column);
}catch(Exception e){
super.setValueAt("0", row, column);
VisualMessage.getErrore();
log.logStackTrace(e);
}
}
}else if(column ==1){
if(value!=null){
try{
ArticoliScadenza art = null;
if(listaArticoli.size() > row){
art = listaArticoli.get(row);
}
if(art==null){
art = new ArticoliScadenza();
listaArticoli.add(row, art);
}else{
Date d = (Date)value;
LocalDate localDate= d.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
art.setData(localDate);
String string = localDate.now().format(DateTimeFormatter.ofPattern("dd-MM-yyyy"));
super.setValueAt(string, row, column);
}
//super.setValueAt(value, row, column);
}catch(Exception e){
super.setValueAt("0", row, column);
VisualMessage.getErrore();
log.logStackTrace(e);
}
}
}else if(column ==2){
if(value!=null){
try{
ArticoliScadenza art = null;
if(listaArticoli.size() > row){
art = listaArticoli.get(row);
}
if(art==null){
art = new ArticoliScadenza();
listaArticoli.add(row, art);
}else{
art.setLotto(value.toString());
}
super.setValueAt(value, row, column);
}catch(Exception e){
super.setValueAt("0", row, column);
VisualMessage.getErrore();
log.logStackTrace(e);
}
}
}
checkRow(row);
}
private void checkRow(int row){
ArticoliScadenza art = listaArticoli.get(row);
if(art.getQuantita()==null)
return;
if(art.getData()!=null){
//verifico quante righe ci sono in tabella.
int nArticoli = listaArticoli.size();
int nRighe = this.getRowCount();
if(nArticoli>=nRighe)
this.addRow(new Vector());
}

}
public List getListaArticoli() {
return listaArticoli;
}
public void setListaArticoli(List  listaArticoli) {
this.listaArticoli = listaArticoli;
}

}
Поэтому, когда я пытаюсь вставить значение первой строки, я вижу следующее:
[img]https:// i.sstatic.net/O9VcPmh1.png[/img]

Как видите, в первой строке указано правильное значение, после этого с помощью метода checkRow я добавляю новую строку, но в второй ряд, есть еще LocalDate, выбранный в предыдущей строке, если я попытаюсь изменить значение даты второй строки, также изменится значение даты первой строки.
Что я могу сделать, чтобы это исправить?

Подробнее здесь: https://stackoverflow.com/questions/793 ... atechooser
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»