remove all columns from jtable

253 views
Skip to first unread message

nickg

unread,
Feb 6, 2010, 12:43:19 PM2/6/10
to jhug
Γειά σας
προσπαθώ να αφαιρέσω όλες τις στήλες από ένα πίνακα (οι γραμμές έχουν
ήδη αφαιρεθεί). Δοκίμασα το

for(int c = colCount-1; c >= 0; c--)
{
TableColumn tcol = table.getColumnModel().getColumn(c);
table.removeColumn(tcol);
}
αλλά οι στήλες παραμένουν.
Επίσης είδα και το παράδειγμα http://www.exampledepot.com/egs/javax.swing.table/RemCol.html
αλλα όταν τρέχω το πρόγραμμα μου βγάζει cast error:

java.lang.ClassCastException: javax.swing.table.DefaultTableModel
cannot be cast to utils.UtilsTable$MyDefaultTableModel

κάθε βοήθεια ευσπρόδεκτη.
Ευχαριστώ προκαταβολικά

Panayiotis Vlissidis

unread,
Feb 6, 2010, 1:04:45 PM2/6/10
to jh...@googlegroups.com
Καλησπερα.

Θες να αφαιρεσεις τις στηλες απο το view (TableColumnModel)
ή από το data model (TableModel) ?

Ο κωδικας που παραθετεις αφαιρει τις κολωνες απο το View
ειναι σωστος και δεν πρεπει να πεταει καποιο exception,
ενώ το exception σχετιζεται με το TableModel.

Χρησιμοποιεις το παραδειγμα όπως ειναι γραμμενο και αν
ναι μπορεις να γραψεις όλο το stacktrace του exception?

nickg

unread,
Feb 6, 2010, 1:24:23 PM2/6/10
to jhug

On Feb 6, 8:04 pm, Panayiotis Vlissidis <pvlissi...@gmail.com> wrote:
> Καλησπερα.
>
> Θες να αφαιρεσεις τις στηλες απο το view (TableColumnModel)
> ή από το data model (TableModel) ?

και από τα δύο, θέλω να σβήσω όλα τα δεδομένα

> Ο κωδικας που παραθετεις αφαιρει τις κολωνες απο το View
> ειναι σωστος και δεν πρεπει να πεταει καποιο exception,
> ενώ το exception σχετιζεται με το TableModel.
>
> Χρησιμοποιεις το παραδειγμα όπως ειναι γραμμενο και αν
> ναι μπορεις να γραψεις όλο το stacktrace του exception?

java.lang.ClassCastException: javax.swing.table.DefaultTableModel


cannot be cast to utils.UtilsTable$MyDefaultTableModel

at utils.UtilsTable.removeTableColumnsAndData(UtilsTable.java:339)
at guicomps.PanelReportFormDesign
$PanelFieldsAddableToForm.setEntity(PanelReportFormDesign.java:2035)
at guicomps.PanelReportFormDesign$ToolBarData
$3.actionPerformed(PanelReportFormDesign.java:1473)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown
Source)
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at
guicomps.EventQueueTxtRightClick.dispatchEvent(EventQueueTxtRightClick.java:
26)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown
Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.Dialog$1.run(Unknown Source)
at java.awt.Dialog$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.awt.Dialog.show(Unknown Source)
at gui.DialogMulti.display(DialogMulti.java:83)
at
guicomps.PanelReportSettings.displayDialogFormDesign(PanelReportSettings.java:
1432)
at guicomps.PanelReportSettings.access$2300(PanelReportSettings.java:
77)
at guicomps.PanelReportSettings$ToolBarData
$5.actionPerformed(PanelReportSettings.java:1608)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.AbstractButton.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI
$Handler.mouseReleased(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI
$MouseInputHandler.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at
guicomps.EventQueueTxtRightClick.dispatchEvent(EventQueueTxtRightClick.java:
26)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown
Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown
Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Panayiotis Vlissidis

unread,
Feb 6, 2010, 1:47:15 PM2/6/10
to jh...@googlegroups.com
Απ' οτι φαινεται μαλλον χρησιμοποιεις τον κωδικα οπως ειναι στο παραδειγμα.
Αν οχι τοτε θα πρεπει να μας δωσεις  και τον κωδικα απο τη μεθοδο: UtilsTable.removeTableColumnsAndData()

Απο το exception και απο τον κωδικα που βλεπω στο παραδειγμα, το λαθος σου μαλλον ειναι
οτι δεν χρησιμοποεις τη custom class MyDefaultTableModel απο το παραδειγμα ως το
TableModel  tou JTable.

Οποτε για να χρησιμοποιησεις τη μεθοδο θα πρεπει να χρησιμποιεις και το MyDefaultTableModel.
e.g

MyDefaultTableModel tableModel = new MyDefaultTableModel();
// add rows and columns
//...
JTable table = new JTable(tableModel);
// remove all columns
.......
UtilsTable.removeTableColumnsAndData(table);

nickg

unread,
Feb 6, 2010, 1:55:35 PM2/6/10
to jhug

public void removeTableColumnsAndData(JTable table)
{
int rowCount = table.getRowCount();
int colCount = table.getColumnCount();

DefaultTableModel tm = (DefaultTableModel)table.getModel();

System.out.println("UtilsTable.removeTableColsAndData c:"+colCount
+" r:"+rowCount);
if(rowCount>0)
{
for (int r = rowCount-1; r >= 0; r--)
{
System.out.println("UtilsTable.removeTableColsAndData remove
row r:"+r);
tm.removeRow(r);
}
tm.fireTableDataChanged();
}

if(colCount>0)
{
MyDefaultTableModel model =
(MyDefaultTableModel)table.getModel();


for(int c = colCount-1; c >= 0; c--)
{

System.out.println("UtilsTable.removeTableColsAndData remove
column c:"+c+" rows "+table.getRowCount());
TableColumn col = table.getColumnModel().getColumn(c);
int columnModelIndex = col.getModelIndex();
Vector colIds = model.getColumnIdentifiers();

// Remove the column from the table
table.removeColumn(col);

// Remove the column header from the table model
colIds.removeElementAt(columnModelIndex);

/*TableColumn tcol = table.getColumnModel().getColumn(c);
table.removeColumn(tcol);*/

}
tm.fireTableStructureChanged();
}

}

// This subclass adds a method to retrieve the columnIdentifiers
// which is needed to implement the removal of
// column data from the table model
class MyDefaultTableModel extends DefaultTableModel
{
public Vector getColumnIdentifiers()
{ return columnIdentifiers; }
}

Μια ερώτηση: Υπάρχει τρόπος να χρεισιμοποιώ διάφορα tablemodel και να
κάνω cast μεσα
στις συναρτήσεις στο UtilsTable έτσι ώστε η συνάρτηση στο UtilsTable
να είναι για καθε tablemodel ;

Panayiotis Vlissidis

unread,
Feb 6, 2010, 2:22:13 PM2/6/10
to jh...@googlegroups.com


2010/2/6 nickg <ngi...@gmail.com>


Μια ερώτηση: Υπάρχει τρόπος να χρεισιμοποιώ διάφορα tablemodel και να
κάνω cast μεσα
στις συναρτήσεις στο UtilsTable έτσι ώστε η συνάρτηση στο UtilsTable
να είναι για καθε tablemodel ;

 
Και βέβαια μπορεις αλλα νομιζω οτι το καλύτερο που εχεις να κανεις,
ειναι να χρησιμοποεις μια συγκεκριμενη class για ολα σου τα TableModels
η οποια να εχει το functionality που θες embedded.

Αν αργοτερα θες να κανεις κατι πιο εξειδικευμενο τοτε απλα κανεις extend
τη βασικη class της επιλογης σου, και αυτη ειναι η ομορφια του OOP αλλωστε.

Καταρχην, αν χρησιμοποιεις το DefaultTableModel για να κανεις clear τα παντα
θα μπορουσες απλα να χρησιμοποιησεις τη μεθοδο setDataVector():

e.g.

DefaultTableModel tableModel = new DefaultTableModel();
//add rows and columns
....


JTable table = new JTable(tableModel);
table.setAutoCreateColumnsFromModel(true); //prepei na einai true gia na doulepsei to pio katw function

//argotera, clear olo to table
// auto einai kai pio grigoro giati kanei fire mono ena event sto telos, opote kai kanei repaint mono mia fora to table
tableModel.setDataVector(new Vector(0), new Vector(0));


Αλλιως θα μπορουσες να κανεις κι extend:

e.g

public class MyDefaultTableModel extends DefaultTableModel {

        public MyDefaultTableModel() {
        }

        public MyDefaultTableModel(int rowCount, int columnCount) {
            super(rowCount, columnCount);
        }

        public MyDefaultTableModel(Vector columnNames, int rowCount) {
            super(columnNames, rowCount);
        }

        public MyDefaultTableModel(Object[] columnNames, int rowCount) {
            super(columnNames, rowCount);
        }

        public MyDefaultTableModel(Vector data, Vector columnNames) {
            super(data, columnNames);
        }

        public MyDefaultTableModel(Object[][] data, Object[] columnNames) {
            super(data, columnNames);
            setDataVector(new Vector(0), new Vector(0));
        }

        public void removeAllRows() {
            dataVector.clear();
            fireTableDataChanged();
        }

        public void removeAllColumns() {
            columnIdentifiers.clear();
            fireTableStructureChanged();
        }

        public void removeColumnsAndData() {
            setDataVector(new Vector(0),new Vector(0));
        }

    }

nickg

unread,
Feb 6, 2010, 2:45:48 PM2/6/10
to jhug
Σε ευχαριστώ.

Αν μπορούσες να δώσεις κάποια κατεύθυνση για το πως θα κάνω cast τα
tablemodels
θα με βοηθούσες.

Συμφωνώ στο οτι θα έπρεπε να υπάρχει μόνο μια tablemodel class αλλά
στην περίπτωσή
μου είναι δύσκολο καθότι είναι πολύς ο κώδικας του κυρίως tablemodel
με αποτέλεσμα
δύσκολή η διαχείριση του κώδικα.

Panayiotis Vlissidis

unread,
Feb 6, 2010, 2:58:52 PM2/6/10
to jh...@googlegroups.com
Gia na kaneis swsta cast tha prepeis na exeis ena if-else chain:

e.g

TableModel model = table.getTableModel();

if(model instanceof DefaultTableModel) {
 DefaultTableModel tableModel = (DefaultTableModel)model;
  //remove code specific to  DefaultTableModel

} else if(model instanceof MyDefaultTableModel) {
   MyDefaultTableModeltableModel = (MyDefaultTableModel)model;
   //remove code specific to  MyDefaultTableModel

} else if(model instanceof CustomTableModel){
   CustomTableModeltableModel = (CustomTableModel)model;
   //remove code specific to  CustomTableModel

}

Omws tha sto ksanapw alli mia fora oti den exeis na kerdiseis tipota etsi,
kathws tha prepei na grapseis ta methods se ola ta table models kai
mesa stin function na tis ksanakaleseis alles toses fores.

Auto einai poor design kai sto telos tha sou vgei se kako,
tha exeis perissotero kwdiak na kaneis maintain.

Oso poluploka kai na einai ta models sou apla tha ta valeis na kanoun
extend ena vasiko TableModel pou exei to basic functionality pou einai koino gia ola,
opws sto paradeigma pou sou egrapsa prin.

e.g.

public class ProductsTableModel extends MyDefaultTableModel {

   // extra functionality...

}

public class CustomersTableModel extends MyDefaultTableModel {

   // extra functionality...

}


P.S: sorry gia ta greeklish alla argw poly me ta ellinika :)

nickg

unread,
Feb 6, 2010, 3:25:11 PM2/6/10
to jhug
μόλις παρατήρησα ότι μετά το

JTable table = new JTable(tableModel);
table.setAutoCreateColumnsFromModel(true);

tableModel.setDataVector(new Vector(0), new Vector(0));

δεν γεμίζει με δεδομένα τον πίνακα
κάποια λύση;

Panayiotis Vlissidis

unread,
Feb 6, 2010, 3:34:04 PM2/6/10
to jh...@googlegroups.com
Nai, i methodos auti kanei clear kai ta 2 vectors tou DefaultTableModel.

Eksartatai ti theleis na kaneis...

Theleis na xrisimpoieis ena DefaultTableModel sto opoio alazeis kathe toso
ta data kai tis kolones? Na allazeis mono tis kolones? Na  allazeis mono ta data?

Periegrapse ligo ti einai auto pou prospatheis na epituxeis

nickg

unread,
Feb 6, 2010, 3:41:09 PM2/6/10
to jhug
ανοίγω από κάποιο αρχείο τα δεδομένα,
αργότερα μπορεί να εισάγω μια γραμή και να αποθηκεύσω τα δεδομένα
ύστερα μοπεί να ανοίξω ξανά το αρχείο
αργότερα μπορεί να αφαιρέσω κάποια γραμμή και να αποθηκεύω.

Χρειάζομαι τη φουλ διαγραφή ώστε να είμαι σίγουρος οτι αυτά
που θα κάνω add (οταν θα ξαναανοίξω το αρχείο) να μην διπλοεμφανιστούν.

Panayiotis Vlissidis

unread,
Feb 6, 2010, 3:59:50 PM2/6/10
to jh...@googlegroups.com
Opote theleis apla na diagrafeis kathe fora ta data (dld mono ta rows kai oxi tis kolones).

An ksanaftiaxneis to Vector me ta data mia fora kai thes na to fortwneis olokliro me ti mia,
tote xrisimopoieis ti setDataVector() pairnontas ta kainouria data kai to idio vector apo kolones, efoson den allazei.

An den tha fortwneis ola mazi, mporeis na kaneis ki auto:
tableModel.setRowCount(0);
for(int i=0 ; i< newRowCount; i++){
  Vector rowData = ...
  tableModel.addRow(rowData);
}

An kanw lathos kai allazeis kai data kai kolwnes tote apla prepei na peraseis
ta kainouria data kai tis kolwnes stin setDateVector() kathe fora.

Tha mporouses vevaia na kaneis re-set kai to TableModel entelws
an allazoun toso poly kai ta data kai oi kolwnes,  table.setModel(new DefaultTableModel(data,columns));

Reply all
Reply to author
Forward
0 new messages