Alguem pelo amor de Deus tem um exemplo de Data com mascara em uma JTABLE ? Ta foda achar alguma coisa :S
Principalmente com exemplode CellEditor :s
Eu consegui fazer este modelo
package model.tablemodel;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.table.AbstractTableModel;
public class DemostrativoTableModel extends AbstractTableModel {
private static final long serialVersionUID = 1L;
private int rows;
private Object[][] dados;
public DemostrativoTableModel(int rows, Object[][] dados){
this.rows = rows;
if(dados == null)
this.dados = new Object[rows][11];
else
this.dados = dados;
}
public int getColumnCount() {
return 11;
}
public String getColumnName(int coluna) {
switch(coluna){
case 0:return "Taxa de Juros";
case 1:return "Vencto.";
case 2:return "Garantia";
case 3:return "Valor Contratado";
case 4:return "Saldo Atual";
case 5:return "Valores Vencidos";
case 6:return "A vencer Curto Prazo";
case 7:return "A vencer Longo Prazo";
case 8:return "PMT";
case 9:return "Destinação";
case 10:return "Observações";
default:return "";
}
}
public int getRowCount() {
return rows;
}
public Class<?> getColumnClass(int col) {
switch(col){
case 0:return Double.class;
case 1:return Date.class;
case 2:return Double.class;
case 3:return Double.class;
case 4:return Double.class;
case 5:return Double.class;
case 6:return Double.class;
case 7:return Double.class;
case 8:return Double.class;
case 9:return Double.class;
case 10:return Double.class;
default:return Object.class;
}
}
public Object getValueAt(int row, int col) {
switch(col){
case 0:return dados[row][col];
case 1:return dados[row][col];
case 2:return dados[row][col];
case 3:return dados[row][col];
case 4:return dados[row][col];
case 5:return dados[row][col];
case 6:return dados[row][col];
case 7:return dados[row][col];
case 8:return dados[row][col];
case 9:return dados[row][col];
case 10:return dados[row][col];
default:return null;
}
}
public void setValueAt(Object value, int row, int column) {
if(value != null)
if(!(column==1)){
dados[row][column] = Double.parseDouble(value.toString());
}
if(column==1){
dados[row][column] = converteData(value.toString());
}
else
dados[row][column] = null;
fireTableCellUpdated(row,column);
}
public boolean isCellEditable(int row, int col) {
return true;
}
public Date converteData(String dataString){
DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
Date date = null;
if(!(dataString==null)){
try {
date = (Date)formatter.parse(dataString);
} catch (ParseException e) {
e.printStackTrace();
}
}
return date;
}
}
com este RENDERER:
package model.tablemodel;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.text.DateFormat;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.border.SoftBevelBorder;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.text.MaskFormatter;
public class DemostrativoCellRenderer extends DefaultTableCellRenderer{
private NumberFormat formatter;
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
setFont(new java.awt.Font("Lucida Sans", 0, 12 ));
setBorder(new SoftBevelBorder(SoftBevelBorder.RAISED));
setBackground(new Color(244, 242, 228));
if (hasFocus)
setBackground(new Color(230,230,250));
if(value != null){
if(column==0){
formatter = NumberFormat.getPercentInstance();
formatter.setMaximumIntegerDigits(1);
formatter.setMaximumFractionDigits(2);
setText(formatter.format(value));
setHorizontalAlignment(SwingConstants.CENTER);
}else if(column==1){
DateFormat formatter = DateFormat.getDateInstance();
setText(formatter.format(value) );
}else{
formatter = NumberFormat.getCurrencyInstance();
formatter.setMaximumFractionDigits(2);
setText(formatter.format(value));
setFont(new Font("helvetica",Font.ROMAN_BASELINE,11));
setHorizontalAlignment(SwingConstants.RIGHT);
}
}else{
setText("");
}
return this;
}
}
Meu metodo que cria a tabela é este :
public void criarTabelas(JPanel painelConteudo, List<DemostrativoTableModel> listDemostrativoTableModel
, Double dadosTabela[][], int contadorCredora){
Object teste[][]= null;
Dimension tamanhoTabela = new Dimension(1102,118);
Dimension tamanhoLabel = new Dimension(100,20);
JFormattedTextField campoData = null;
//Maskaras
DateFormat formatter = DateFormat.getDateInstance();
try {
MaskFormatter maskData = new MaskFormatter("##/##/####");
maskData.setPlaceholderCharacter('_');
campoData = new JFormattedTextField(maskData);
campoData.setBorder(BorderFactory.createLineBorder(Color.BLACK));
} catch (ParseException e) {
e.printStackTrace();
}
JLabel txtInstCredora = new JLabel("Inst. Credora"+contadorCredora);
txtInstCredora.setPreferredSize(tamanhoLabel);
txtInstCredora.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
DemostrativoTableModel demostrativoTableModel = new DemostrativoTableModel(5, teste);
listDemostrativoTableModel.add(demostrativoTableModel);
JTable tabela = new JTable(demostrativoTableModel);
TableColumn col = tabela.getColumnModel().getColumn(1);
col.setCellEditor(new DefaultCellEditor(campoData));
JTableHeader header = tabela.getTableHeader();
header.setFont(new Font("helvetica",Font.BOLD,12));
tabela.setIntercellSpacing(new Dimension(0,0));
tabela.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
tabela.getTableHeader().setReorderingAllowed(false);
tabela.getTableHeader().setResizingAllowed(false);
DemostrativoCellRenderer demostrativoCellRenderer = new DemostrativoCellRenderer();
for (int j = 0; j < 11; j++){
tabela.getColumnModel().getColumn(j).setPreferredWidth(100);
tabela.setDefaultRenderer(tabela.getColumnClass(j),demostrativoCellRenderer);
}
tabela.setRowHeight(20);//tamanho das linhas da tabela
JScrollPane tabelaFinal = new JScrollPane(tabela);
tabelaFinal.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY));
tabelaFinal.setPreferredSize(tamanhoTabela);
tabelaFinal.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
painelConteudo.add(txtInstCredora);
painelConteudo.add(tabelaFinal);
painelConteudo.updateUI();
}
O que está acontecendo ?
Tipo a minha segunda coluna é o meu campo DATA, quando eu digito uma data certinho ele fica tudo OK e tal, porem quando eu coloco uma data tipo 99/99/9999 ele aceita e coloca uma data estranha…
Como eu posso arrumar isto ?Eu queria tb que a celula trava-se quando a data tiver errada :s