• Post Reply Bookmark Topic Watch Topic
  • New Topic
programming forums Java Mobile Certification Databases Caching Books Engineering Micro Controllers OS Languages Paradigms IDEs Build Tools Frameworks Application Servers Open Source This Site Careers Other Pie Elite all forums
this forum made possible by our volunteer staff, including ...
Marshals:
  • Campbell Ritchie
  • Jeanne Boyarsky
  • Ron McLeod
  • Paul Clapham
  • Liutauras Vilda
Sheriffs:
  • paul wheaton
  • Rob Spoor
  • Devaka Cooray
Saloon Keepers:
  • Stephan van Hulst
  • Tim Holloway
  • Carey Brown
  • Frits Walraven
  • Tim Moores
Bartenders:
  • Mikalai Zaikin

Problem with TableModel

 
Greenhorn
Posts: 11
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Hi all,

I have a stupid problem with my TableModel, I'm sure it's stupid but it becomes really annoying because I don't see what is the problem .

I'm trying to create a kind of DatePicker for this I'm using a combo box where you can select the month (year is always 2005, it's just a draft version) The days of the selected month are then displayed in a tanle using a table model.

Here is the form class

/*
* frmCalendar.java
*
* Created on 15 f�vrier 2005, 22:00
*/

package com.shsolutions.utils;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.text.*;
import java.util.GregorianCalendar;
import java.util.Date;
import java.util.Arrays;

/**
*
* @author Laurent
*/
public class frmCalendar extends JFrame {
private JComboBox months;
private JLabel etiquette;
private JTable monthDays;
private JScrollPane jsp;
private String strMonth[];
private String strDays[];
private GregorianCalendar calendar = new GregorianCalendar();
private Object [][] objWeeks;
private Container conteneur;
private CalendarModel calContent;

/** Creates a new instance of frmCalendar */
public frmCalendar() {
super ("Test de calendrier");
conteneur = getContentPane();
conteneur.setLayout(new FlowLayout());
strMonth = new DateFormatSymbols().getMonths();
strDays = new DateFormatSymbols().getShortWeekdays();
calContent = new CalendarModel(calendar.MONTH,calendar.YEAR);
months = new JComboBox(strMonth);
months.setMaximumRowCount(6);

months.addItemListener(new ItemListener(){
public void itemStateChanged(ItemEvent evenement){
if (evenement.getStateChange()== ItemEvent.SELECTED)
{

calContent.setMonthCalendar(months.getSelectedIndex(),2005);
}
}
});
conteneur.add(months);


monthDays = new JTable(calContent);
JScrollPane jsp = new JScrollPane(monthDays);
conteneur.add(jsp);

setSize(350, 140);
setVisible(true);

}

public static void main(String args[]){
frmCalendar application = new frmCalendar();
application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

Now the AbstractTableModel class

/*
* @(#)AbstractTableModel.java1.39 03/01/23
*
* Copyright 2003 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/

package javax.swing.table;

import javax.swing.*;
import javax.swing.event.*;
import java.io.Serializable;
import java.util.EventListener;

/**
* This abstract class provides default implementations for most of
* the methods in the <code>TableModel</code> interface. It takes care of
* the management of listeners and provides some conveniences for generating
* <code>TableModelEvents</code> and dispatching them to the listeners.
* To create a concrete <code>TableModel</code> as a subclass of
* <code>AbstractTableModel</code> you need only provide implementations
* for the following three methods:
*
* <pre>
* public int getRowCount();
* public int getColumnCount();
* public Object getValueAt(int row, int column);
* </pre>
* <p>
* <strong>Warning:</strong>
* Serialized objects of this class will not be compatible with
* future Swing releases. The current serialization support is
* appropriate for short term storage or RMI between applications running
* the same version of Swing. As of 1.4, support for long term storage
* of all JavaBeans<sup><font size="-2">TM</font></sup>
* has been added to the <code>java.beans</code> package.
* Please see {@link java.beans.XMLEncoder}.
*
* @version 1.39 01/23/03
* @author Alan Chung
* @author Philip Milne
*/
public abstract class AbstractTableModel implements TableModel, Serializable
{
//
// Instance Variables
//

/** List of listeners */
protected EventListenerList listenerList = new EventListenerList();

//
// Default Implementation of the Interface
//

/**
* Returns a default name for the column using spreadsheet conventions:
* A, B, C, ... Z, AA, AB, etc. If <code>column</code> cannot be found,
* returns an empty string.
*
* @param column the column being queried
* @return a string containing the default name of <code>column</code>
*/
public String getColumnName(int column) {
String result = "";
for (; column >= 0; column = column / 26 - 1) {
result = (char)((char)(column%26)+'A') + result;
}
return result;
}

/**
* Returns a column given its name.
* Implementation is naive so this should be overridden if
* this method is to be called often. This method is not
* in the <code>TableModel</code> interface and is not used by the
* <code>JTable</code>.
*
* @param columnName string containing name of column to be located
* @return the column with <code>columnName</code>, or -1 if not found
*/
public int findColumn(String columnName) {
for (int i = 0; i < getColumnCount(); i++) {
if (columnName.equals(getColumnName(i))) {
return i;
}
}
return -1;
}

/**
* Returns <code>Object.class</code> regardless of <code>columnIndex</code>.
*
* @param columnIndex the column being queried
* @return the Object.class
*/
public Class getColumnClass(int columnIndex) {
return Object.class;
}

/**
* Returns false. This is the default implementation for all cells.
*
* @param rowIndex the row being queried
* @param columnIndex the column being queried
* @return false
*/
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}

/**
* This empty implementation is provided so users don't have to implement
* this method if their data model is not editable.
*
* @param aValue value to assign to cell
* @param rowIndex row of cell
* @param columnIndex column of cell
*/
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
}


//
// Managing Listeners
//

/**
* Adds a listener to the list that's notified each time a change
* to the data model occurs.
*
* @paramlthe TableModelListener
*/
public void addTableModelListener(TableModelListener l) {
listenerList.add(TableModelListener.class, l);
}

/**
* Removes a listener from the list that's notified each time a
* change to the data model occurs.
*
* @paramlthe TableModelListener
*/
public void removeTableModelListener(TableModelListener l) {
listenerList.remove(TableModelListener.class, l);
}

/**
* Returns an array of all the table model listeners
* registered on this model.
*
* @return all of this model's <code>TableModelListener</code>s
* or an empty
* array if no table model listeners are currently registered
*
* @see #addTableModelListener
* @see #removeTableModelListener
*
* @since 1.4
*/
public TableModelListener[] getTableModelListeners() {
return (TableModelListener[])listenerList.getListeners(
TableModelListener.class);
}

//
// Fire methods
//

/**
* Notifies all listeners that all cell values in the table's
* rows may have changed. The number of rows may also have changed
* and the <code>JTable</code> should redraw the
* table from scratch. The structure of the table (as in the order of the
* columns) is assumed to be the same.
*
* @see TableModelEvent
* @see EventListenerList
* @see javax.swing.JTable#tableChanged(TableModelEvent)
*/
public void fireTableDataChanged() {
fireTableChanged(new TableModelEvent(this));
}

/**
* Notifies all listeners that the table's structure has changed.
* The number of columns in the table, and the names and types of
* the new columns may be different from the previous state.
* If the <code>JTable</code> receives this event and its
* <code>autoCreateColumnsFromModel</code>
* flag is set it discards any table columns that it had and reallocates
* default columns in the order they appear in the model. This is the
* same as calling <code>setModel(TableModel)</code> on the
* <code>JTable</code>.
*
* @see TableModelEvent
* @see EventListenerList
*/
public void fireTableStructureChanged() {
fireTableChanged(new TableModelEvent(this, TableModelEvent.HEADER_ROW));
}

/**
* Notifies all listeners that rows in the range
* <code>[firstRow, lastRow]</code>, inclusive, have been inserted.
*
* @param firstRow the first row
* @param lastRow the last row
*
* @see TableModelEvent
* @see EventListenerList
*
*/
public void fireTableRowsInserted(int firstRow, int lastRow) {
fireTableChanged(new TableModelEvent(this, firstRow, lastRow,
TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT));
}

/**
* Notifies all listeners that rows in the range
* <code>[firstRow, lastRow]</code>, inclusive, have been updated.
*
* @param firstRow the first row
* @param lastRow the last row
*
* @see TableModelEvent
* @see EventListenerList
*/
public void fireTableRowsUpdated(int firstRow, int lastRow) {
fireTableChanged(new TableModelEvent(this, firstRow, lastRow,
TableModelEvent.ALL_COLUMNS, TableModelEvent.UPDATE));
}

/**
* Notifies all listeners that rows in the range
* <code>[firstRow, lastRow]</code>, inclusive, have been deleted.
*
* @param firstRow the first row
* @param lastRow the last row
*
* @see TableModelEvent
* @see EventListenerList
*/
public void fireTableRowsDeleted(int firstRow, int lastRow) {
fireTableChanged(new TableModelEvent(this, firstRow, lastRow,
TableModelEvent.ALL_COLUMNS, TableModelEvent.DELETE));
}

/**
* Notifies all listeners that the value of the cell at
* <code>[row, column]</code> has been updated.
*
* @param row row of cell which has been updated
* @param column column of cell which has been updated
* @see TableModelEvent
* @see EventListenerList
*/
public void fireTableCellUpdated(int row, int column) {
fireTableChanged(new TableModelEvent(this, row, row, column));
}

/**
* Forwards the given notification event to all
* <code>TableModelListeners</code> that registered
* themselves as listeners for this table model.
*
* @param e the event to be forwarded
*
* @see #addTableModelListener
* @see TableModelEvent
* @see EventListenerList
*/
public void fireTableChanged(TableModelEvent e) {
// Guaranteed to return a non-null array
Object[] listeners = listenerList.getListenerList();
// Process the listeners last to first, notifying
// those that are interested in this event
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i]==TableModelListener.class) {
((TableModelListener)listeners[i+1]).tableChanged(e);
}
}
}

/**
* Returns an array of all the objects currently registered
* as <code><em>Foo</em>Listener</code>s
* upon this <code>AbstractTableModel</code>.
* <code><em>Foo</em>Listener</code>s are registered using the
* <code>add<em>Foo</em>Listener</code> method.
*
* <p>
*
* You can specify the <code>listenerType</code> argument
* with a class literal,
* such as
* <code><em>Foo</em>Listener.class</code>.
* For example, you can query a
* model <code>m</code>
* for its table model listeners with the following code:
*
* <pre>TableModelListener[] tmls = (TableModelListener[])(m.getListeners(TableModelListener.class));</pre>
*
* If no such listeners exist, this method returns an empty array.
*
* @param listenerType the type of listeners requested; this parameter
* should specify an interface that descends from
* <code>java.util.EventListener</code>
* @return an array of all objects registered as
* <code><em>Foo</em>Listener</code>s on this component,
* or an empty array if no such
* listeners have been added
* @exception ClassCastException if <code>listenerType</code>
* doesn't specify a class or interface that implements
* <code>java.util.EventListener</code>
*
* @see #getTableModelListeners
*
* @since 1.3
*/
public EventListener[] getListeners(Class listenerType) {
return listenerList.getListeners(listenerType);
}
} // End of class AbstractTableModel


And finally the CalendarModel class extending the AbstractTableModel

/*
* CalendarModel.java
*
* Created on 8 mars 2005, 17:41
*/

package com.shsolutions.utils;

import javax.swing.table.*;
import java.text.*;
import java.util.GregorianCalendar;
/**
*
* @author Laurent
*/
public class CalendarModel extends AbstractTableModel{

private String strDays[] = new String[7];
private GregorianCalendar calendar = new GregorianCalendar();
private Object data [][]= new Object [6][7];

/** Creates a new instance of CalendarModel */
public CalendarModel(int nMonth,int nYear){
String strTemp[];
int monthLength;
monthLength = daysInMonth(nMonth, nYear);
numDaysInWeek(nMonth, nYear, monthLength);
int i = 0;
strTemp = new DateFormatSymbols().getShortWeekdays();
for(;i<strTemp.length;i++)
{
if (i>0) strDays [i-1] = new String(strTemp[i]);
}


}


public int getRowCount () {
return 6;
}

public int getColumnCount () {
return 7;
}

public Object getValueAt(int r, int c){
return data[r][c];

}

public String getColumnName(int c){
return strDays[c];
}

public void setMonthCalendar (int nMonth, int nYear) {
int monthLength;
monthLength = daysInMonth(nMonth, nYear);
numDaysInWeek(nMonth, nYear, monthLength);
}

private int daysInMonth(int nMonth, int nYear) {
switch (nMonth)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return (31);
case 4:
case 6:
case 9:
case 11:
return (30);
default:
if (calendar.isLeapYear(nYear))
return (29);
else
return (28);


}
}

private void numDaysInWeek (int nMonth, int nYear, int nMonthLength) {
String [] astrWeek1 = new String[7];
String [] astrWeek2 = new String[7];
String [] astrWeek3 = new String[7];
String [] astrWeek4 = new String[7];
String [] astrWeek5 = new String[7];
String [] astrWeek6 = new String[7];
int firstDayOfNextWeek = 0;
int i;
calendar.set(nYear,nMonth,1);
int firstDayOfMonth = calendar.get(calendar.DAY_OF_WEEK);


switch (firstDayOfMonth){
case 1:
{
astrWeek1[0]="1";
astrWeek1[1]="2";
astrWeek1[2]="3";
astrWeek1[3]="4";
astrWeek1[4]="5";
astrWeek1[5]="6";
astrWeek1[6]="7";
firstDayOfNextWeek = 8;
break;
}
case 2:
{
astrWeek1[0]="";
astrWeek1[1]="1";
astrWeek1[2]="2";
astrWeek1[3]="3";
astrWeek1[4]="4";
astrWeek1[5]="5";
astrWeek1[6]="6";
firstDayOfNextWeek = 7;
break;
}
case 3:
{
astrWeek1[0]="";
astrWeek1[1]="";
astrWeek1[2]="1";
astrWeek1[3]="2";
astrWeek1[4]="3";
astrWeek1[5]="4";
astrWeek1[6]="5";
firstDayOfNextWeek = 6;
break;
}
case 4:
{
astrWeek1[0]="";
astrWeek1[1]="";
astrWeek1[2]="";
astrWeek1[3]="1";
astrWeek1[4]="2";
astrWeek1[5]="3";
astrWeek1[6]="4";
firstDayOfNextWeek = 5;
break;
}
case 5:
{
astrWeek1[0]="";
astrWeek1[1]="";
astrWeek1[2]="";
astrWeek1[3]="";
astrWeek1[4]="1";
astrWeek1[5]="2";
astrWeek1[6]="3";
firstDayOfNextWeek = 4;
break;
}
case 6:
{
astrWeek1[0]="";
astrWeek1[1]="";
astrWeek1[2]="";
astrWeek1[3]="";
astrWeek1[4]="";
astrWeek1[5]="1";
astrWeek1[6]="2";
firstDayOfNextWeek = 3;
break;
}
case 7:
{
astrWeek1[0]="";
astrWeek1[1]="";
astrWeek1[2]="";
astrWeek1[3]="";
astrWeek1[4]="";
astrWeek1[5]="";
astrWeek1[6]="1";
firstDayOfNextWeek = 2;
break;
}

}

int j = 0;
for (i = firstDayOfNextWeek;i<(firstDayOfNextWeek+7);i++)
{
astrWeek2[j]= Integer.toString(i);
j = j+1;
}

firstDayOfNextWeek = firstDayOfNextWeek + 7;
j=0;
for (i = firstDayOfNextWeek;i<(firstDayOfNextWeek+7);i++)
{

astrWeek3[j]= Integer.toString(i);
j=j+1;
}

firstDayOfNextWeek = firstDayOfNextWeek + 7;
j=0;
for (i = firstDayOfNextWeek;i<(firstDayOfNextWeek+7);i++)
{

astrWeek4[j]= Integer.toString(i);
j=j+1;
}

firstDayOfNextWeek = firstDayOfNextWeek + 7;
j=0;
for (i = firstDayOfNextWeek;i<(firstDayOfNextWeek+7);i++)
{
if (i<= nMonthLength)
{
astrWeek5[j]= Integer.toString(i);
j=j+1;
}
else
{
astrWeek5[j]= "";
j=j+1;

}
}

firstDayOfNextWeek = firstDayOfNextWeek +7;
j=0;
for (i = firstDayOfNextWeek;i<(firstDayOfNextWeek+7);i++)
{
if (i<= nMonthLength)
{
astrWeek6[j]= Integer.toString(i);
j=j+1;
}
else
{
astrWeek6[j]= "";
j=j+1;
}
}

Object [][] data = {astrWeek1,astrWeek2,astrWeek3,astrWeek4,astrWeek5,astrWeek6};
fireTableDataChanged();

}

}

Could someone tell me why the table stays empty when I run the application even if I test that the data vector is filled in correctly and the application runs without any error?

Thanks in advance for your precious help.
Greetings.

Laurent.
 
reply
    Bookmark Topic Watch Topic
  • New Topic