12. marts 2006 - 01:25 Der er 9 kommentarer og
1 løsning

Ændring af JTable Listener

Hej

Jeg har lavet en jTable med comboboxe i hver celle. Trykker jeg på en knap bliver værdien, der fremstår øverst i comboboxene talt sammen. Jeg ønsker at lægge en lytter på tabellen, så disse værdier automatisk opdateres, når jeg ændre i comboboxene.

Lytteren jeg har lavet til nu, ser sådan ud:

ListSelectionModel selectionModel = jTable4.getSelectionModel();
selectionModel.addListSelectionListener( new ListSelectionListener()
      {       
          public void valueChanged( ListSelectionEvent event )
          {         
            getPanel5();                                             
          }
      });

Den kalder en metode "getPanel5()"; som også knappen kalder, der lægger værdierne sammen.

Problemet er nu at en ListSelectionListener, reagere i det samme jeg trykker et sted på tabellen, og venter derfor ikke til at jeg har valgt en ny værdi i en combobox.
Kan man derfor implementere en mousereleased Listener i forbindelse hermed???

....

Er der desuden nogen mulighed for at tilgå en actionEvent metode udenom lytteren???

eksempelvis. private void jButton1_actionPerformed(ActionEvent e)

...problemet er jo at man ikke kan sende parameteren med???

-på forhånd tak
Avatar billede javatosse Nybegynder
17. marts 2006 - 21:28 #1
Prøv dette:

jTable4.getCellEditor().addCellEditorListener(new TableListener());


Dette er en indre klasse som du kan placerer i samme klasse

private class TableListener implements CellEditorListener
{

        public void editingStopped(ChangeEvent e)
        {
            getPanel5(); //hvad der skal ske når editeringen er slut
        }
}
Avatar billede javatosse Nybegynder
17. marts 2006 - 21:51 #2
jeg glemte lige at du skal importere følgende:

import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
Avatar billede javatosse Nybegynder
17. marts 2006 - 22:41 #3
Prøv dette:

jTable4.getCellEditor().addCellEditorListener(new TableListener());


Dette er en indre klasse som du kan placerer i samme klasse

private class TableListener implements CellEditorListener
{

        public void editingStopped(ChangeEvent e)
        {
            getPanel5(); //hvad der skal ske når editeringen er slut
        }
}
19. marts 2006 - 21:39 #4
hej javatosse

den indre klasse mangler metoden  public void editingCanceled(ChangeEvent ce).

men ud over det, så virkere det desværre ikke..

Den kommer med en nullpointerException..

Fik et svar et andet sted

    JComboBox combo = new JComboBox(MyTableModel4.fag);
    combo.addItemListener(new MyItemListener( ));     
    jTable4.getColumn( MyTableModel4.COLUMN_NAME[i+1]).
    setCellEditor(new DefaultCellEditor(combo));

  class MyItemListener implements ItemListener
  {   
      public  void itemStateChanged(ItemEvent evt)
      {
        if (evt.getStateChange() == ItemEvent.SELECTED)
        {       
            getPanel5();       
        }       
      }
  }


og det virkede...
19. marts 2006 - 21:45 #5
Måske kan du dog svare mig på hvorfor metoden getPanel5 ter sig anderledes når den bliver kaldt fra denne listener end fra actionlistener på knappen.

Knappen kalder selv samme metode getPanel5. metoden bliver gennemløbet og viser et nyt redigeret panel i stedet for det gamle....fint

Fra denne listener bliver metoden også gennnemløbet, men der sker intet på skærmen...
underligt i mine øjne....

Kan det være noget med trådhåndtering???
Avatar billede javatosse Nybegynder
19. marts 2006 - 22:24 #6
Ja det virker underligt

kan det være et opdateringsproblem der kan løses ved at kalde fireTableDataChanged() på din TableModel efter du har kørt getPanel5() i din listener????

Et skud i tågen...men måske det virker :)
22. marts 2006 - 00:41 #7
Hej Javatosse

Hvis jeg kender firePropertyChanged()ret...(regner med at det er den du mener) , så  skal jeg ikke sætte disse lyttere på tabellen, men på de komponenter (og der ligger mange i panel5), comboboxene skal ændre på. Så umiddelbart virker det som en uoverskuelig fremgangsmåde. Det vil simpelthen blive for rodet, på baggrund deraf Må der være en simplere løsning.
Avatar billede javatosse Nybegynder
22. marts 2006 - 18:30 #8
Nej jeg mener fireTableDataChanged()

Dette er fra Javadoc:

fireTableDataChanged

public void fireTableDataChanged()

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 JTable 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 Also:
TableModelEvent, EventListenerList, JTable.tableChanged(TableModelEvent)


Det er en metode der tilhører AbstractTableModel som din tablemodel arver fra. Du kan evt. prøve at kigge på de andre opdateringsmetoder AbstractTableModel tilbyder
23. marts 2006 - 00:22 #9
Jeg kigger lige engang på den...sjovt at jeg ikke har kunnet finde den i mit API...kører  ellers 1.5

For din ihærdighed for du pointene...

Tak for hjælpen
Avatar billede javatosse Nybegynder
23. marts 2006 - 00:27 #10
Tak. Du må gerne skrive hvis det virker
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