Avatar billede backupmand Nybegynder
15. december 2003 - 14:57 Der er 15 kommentarer

Underlig cell renderer

Jeg har en underlig cell renderer (som renderer en JCheckBox i en JTable)... når jeg hakker af i øverste checkbox, hakker den alle af.... hvorfor?
Avatar billede arne_v Ekspert
15. december 2003 - 15:03 #1
Jeg tror at du skal poste lidt kode til os.
Avatar billede _carsten Nybegynder
15. december 2003 - 15:23 #2
Har lavet et lille hurtigt eksempel, som måske kan hjælpe dig på vej, samt en enkelt kommentar lidt længere nede hvor jeg tror det måske går galt


public class Test extends javax.swing.JFrame {
   
    public Test() {
        initComponents();
    }
   
    private void initComponents() {
        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ) {
            Class[] types = new Class [] {
                Boolean.class, Object.class, Object.class, Object.class
            };

            // Hvis du har lavet din egen tableModel er det vigtigt
            // at du får denne metode med i modellen
            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }
        });
        jScrollPane1.setViewportView(jTable1);

        getContentPane().add(jScrollPane1, java.awt.BorderLayout.NORTH);

        pack();
    }
   
    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }
   
    public static void main(String args[]) {
        new Test().show();
    }
   
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
}
Avatar billede backupmand Nybegynder
16. december 2003 - 01:36 #3
Jeg poster lige lidt kode:

accelement=new AccessoryElement[row1data.length];                    
for (int i=0;i<accelement.length;i++)
accelement[i]=new AccessoryElement(row1data[i],(row2data.get(i)).toString());
accessorytablemodel=new accessoryTableModel(this,accelement);
aTable=new JTable(accessorytablemodel);                                               
aTable.addMouseListener(this);               
aTable.setShowHorizontalLines(true);
aTable.setShowVerticalLines(false);
aTable.setCellSelectionEnabled(false);
aTable.setSelectionBackground(Color.blue);                   
aTable.setSelectionForeground(Color.blue);                   
                       
accessorytablepane=null;
accessorytablepane=new JScrollPane(aTable);       
accessorytablepane.setBounds(440,120,170,220);   
under1.add(accessorytablepane);                                             
------------

I min tablemodel har jeg sat isCellEditable til at returnere true.
Avatar billede backupmand Nybegynder
16. december 2003 - 01:38 #4
under1 er mit hovedpanel ....
AccessoryElement er en klasse der modellerer et JTable element .. dvs
der er bare en Booelan i (for JCheckBoxes) og en String for de navne,
jeg vil have skal stå i kolonne 2, efter Boolean værdierne.
Avatar billede backupmand Nybegynder
16. december 2003 - 01:54 #5
Carsten-> Jeg har flg metode i min skræddersyede tablemodel klasse:
(så det skulle ikke være noget problem)

public Class getColumnClass(int col) {
  //if col 0 i choosen return an Boolean, else return a String
  return col == 0 ? Boolean.class : String.class;
}

Men det er sgu da skørt, jeg har da gjort det på samme måde som dig, Carsten,
i min egen kode. Forskellen er da bare at min custom tablemodel befinder sig i en inner class.
Avatar billede backupmand Nybegynder
16. december 2003 - 01:55 #6
Altså din version virker jo efter hensigten, kan ikke lige se hvor fejlen er henne i min herlige 2000+ linjers klasse
Avatar billede backupmand Nybegynder
16. december 2003 - 02:02 #7
Det er nok nemmere at jeg poster hele min custom table model:

class accessoryTableModel extends AbstractTableModel  {
   
    private JComponentRepository jc;
    private AccessoryElement aearray[];
    private String[] columns = { "e/u", "tilbehor" };
       
    public accessoryTableModel(JComponentRepository jc, AccessoryElement aearray[]) {
        this.jc=jc;
        this.aearray=aearray;       
    }
   
  public int getColumnCount()
  {
  return columns.length;
  } 
   
  public int getRowCount() {
      return aearray.length;
      } 
 
 
  public void setValueAt(Object value, int row, int column) {
     
      System.out.println("setValueAt() setting new value at column ="+column+" row ="+row);
     
      switch( column ) {
          case 0: {
              aearray[row].setExtraWithout((Boolean)value);
          } break;
          case 1: {
              aearray[row].setAccNavn((String)value);
          } break;
       
      }
      fireTableChanged(null);
      //fireTableCellUpdated(row, column);
    }
 
  public Object getValueAt(int row, int column) {
      Vector element=new Vector();
      //element.add((AccessoryElement)data.elementAt(row));
      Object value=null;
   
          switch( column ) {
              case 0: {
                  value=(Boolean)(aearray[column].getExtraWithout());
              } break;
              case 1: {
                  value=(String)(aearray[row].getAccNavn());
              } break;             
          }                           
      return value;
  }


  public Class getColumnClass(int col) {
  //if col 0 i choosen return an Boolean, else return a String
  return col == 0 ? Boolean.class : String.class;
}
 
  public boolean isCellEditable(int row, int col) {
   
      return true;
  } 
   
  public void addRow(Vector rowData)
  {
  data.add(rowData);
  fireTableRowsInserted(data.size(), data.size());   
  }
 
 
   
    public String getColumnName(int column) {
        if (columnNames[column] != null) {
            return columnNames[column];
        } else {
            return "";
        }
    }
   
    public void addTableElement(AccessoryElement element) {
        data.add(element);
        fireTableRowsInserted(data.size(), data.size());
    } 
   
    public void removeTableElement(int index) {
        if( !(index == -1) ) {
            data.removeElementAt(index);           
            fireTableRowsDeleted(index,index);
        }
    }
}
Avatar billede _carsten Nybegynder
16. december 2003 - 11:04 #8
Sorry - havde ikke lige set der var aktivitet herinde

Et hurtigt skud, fjern  fireTableChanged(null); i setValue

Er tilbage om et par timer
Avatar billede backupmand Nybegynder
16. december 2003 - 14:01 #9
Det gjorde jeg og så sker der det, at jeg kun kan krydse af i den øverste checkbox. De andre kan jeg ikke checke af. Strange
Avatar billede _carsten Nybegynder
16. december 2003 - 14:20 #10
Tja - som jeg lige ser det har du både et inner og ydre aearray

Hvad sker der hvis du retter til nedenstående
          switch( column ) {
          case 0: {
              this.aearray[row].setExtraWithout((Boolean)value);
          } break;
          case 1: {
              this.aearray[row].setAccNavn((String)value);
          } break;

          switch( column ) {
              case 0: {
                  value=(Boolean)(this.aearray[column].getExtraWithout());
              } break;
              case 1: {
                  value=(String)(this.aearray[row].getAccNavn());
              } break;
Avatar billede backupmand Nybegynder
16. december 2003 - 14:26 #11
i setValueAt regner jeg med.
Det er det samme.
Avatar billede backupmand Nybegynder
16. december 2003 - 14:28 #12
Det ser ud som om du bruger funktionaliteten fra getValueAt i setValueAt også ... det forstår jeg ikke
Avatar billede _carsten Nybegynder
16. december 2003 - 14:30 #13
Jeg kan ikke lige huske hvordan man får fat i en variabel i en inner klasse
Prøv YdreKlasseNavn.accessoryTableModel.aearray
Avatar billede backupmand Nybegynder
16. december 2003 - 15:16 #14
undskyld mig et par timer :)
Avatar billede backupmand Nybegynder
16. december 2003 - 16:13 #15
Men skulle det være nødvendigt, jeg overfører jo data til min custom model
accessorytablemodel=new accessoryTableModel(this,accelement);
hvorfor jeg har data lokalt.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester