|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: May 2009
Messaggi: 366
|
[java] Modifica Jtable
salve ragazzi o questo problema ho una Jtable quando clicco su una cella mi compare una JList con degli elementi quando effettuo doppio click su uno degli elementi della jlist mi deve cambiare il valore della cella in JTable mi date qualche consiglio
![]()
__________________
visitate http://www.forumsenzacontro.altervista.org |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Devi creare un tuo TableCellEditor e assegnarlo alla tabella per le celle che vuoi cambiare con quell'editor.
Ho sottomano un esempio in Scala ma è praticamente identico a quello che faresti in Java (le librerie son quelle, _ vale null, var e val sono campi, def sono metodi, il tipo è scritto a destra dopo i : anzichè a sinistra prima del nome, with = implements): Codice:
import javax.swing._ import javax.swing.table._ import java.awt._ import java.awt.event._ object Main { def main(args:Array[String]) { EventQueue.invokeLater(new Runnable { def run = start() }); } def start() { val model = new DefaultTableModel() model.addColumn("Nomi") model.addColumn("Capitali") model.addRow(Array[Object]("", "")) model.addRow(Array[Object]("", "")) val listEditor = new ListEditor() val table = new JTable(model) { override def getCellEditor(row: Int, col: Int) = { if(col == 1) listEditor else super.getCellEditor(row, col) } } table.setRowHeight(Math.round(table.getRowHeight() * 1.5f)) val frame = new JFrame("Test") frame.add(new JScrollPane(table)) frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE) frame.pack() frame.setVisible(true) } } class ListEditor extends AbstractCellEditor with TableCellEditor { private val list : JList = new JList(Array[Object]("Roma", "Atene", "Berlino")) private val component ; JScrollPane = new JScrollPane(list) private var oldValue : Object = _ private var editorValue : Object = _ list.addMouseListener(new MouseAdapter { override def mousePressed(e: MouseEvent) { /** Doppio click col sinistro */ if(SwingUtilities.isLeftMouseButton(e) && e.getClickCount() == 2) { val index = list.locationToIndex(e.getPoint()) if(index >= 0) { editorValue = list.getModel().getElementAt(index) fireEditingStopped() } } } }) def getTableCellEditorComponent(table: JTable, value: Object, isSelected: Boolean, row: Int, column: Int) : Component = { oldValue = value editorValue = value list.setSelectedValue(oldValue, true) return component } def getCellEditorValue() : Object = { return editorValue } override def cancelCellEditing() : Unit { editorValue = oldValue fireEditingCanceled() } override def stopCellEditing() : Boolean = { val selection = Option(list.getSelectedValue) selection.foreach(v => editorValue = v) fireEditingStopped() return true } }
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#3 | |||
Senior Member
Iscritto dal: May 2009
Messaggi: 366
|
ciao grazie dell' aito ma è da poco che ho a che fare con le Jtable e o qualche difficoltà
Quote:
poi Quote:
Quote:
__________________
visitate http://www.forumsenzacontro.altervista.org |
|||
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
La prima è nella sovrascrittura del metodo getCellEditor. Per ogni cella una JTable ha un certo editor - che sarebbe il componente che si occupa di modificare il contenuto di quella cella. JTable ha un paio di modi per personalizzare il tipo di editor che si vuole usare per certe celle. Uno è appunto la sovrascrittura di getCellEditor.
Quel if(col == 1) listEditor else super.getCellEditor(row, col) che sarebbe un: Codice:
if(col == 1) { return listEditor; } else { return super.getCellEditor(row, col) } Il secondo pezzo serve per far apparire il valore attualmente contenuto nella cella anche nell'editor. Quando l'utente esprime la volontà di cambiare il contenuto di una cella - attraverso cliccamenti vari o che altro - la tabella prende il valore della cella e lo passa al metodo getTableCellEditorComponent - nel parametro value. Nello stesso metodo l'editor si prepara a consentire la modifica della cella. Non è obbligatorio ma comune che l'editor appaia usando come valore corrente della modifica il valore che la cella ha. Così il nostro editor in quel metodo dice: quando la tabella mi comunica che devo entrare in gioco, assumo come mio valore quello della cella che devo modificare e poi appaio. IL true serve per far sì che la lista (inserita in un JScrollPane) scorra fino a visualizzare il valore scelto
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#5 | ||
Senior Member
Iscritto dal: May 2009
Messaggi: 366
|
il modello della mia tabella è questo
Quote:
Quote:
__________________
visitate http://www.forumsenzacontro.altervista.org |
||
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
il metodo da sovrascrivere è di JTable, non del suo modello. Da qualche parte avrai una cosa tipo:
JTable table = new JTable(ilModello); Basta cambiarlo in: Codice:
JTable table = new JTable(ilModello) { private final ListEditor editor = new ListEditor(); @Override public TableCellEditor getCellEditor(int row, int col) { ...se la riga o la colonna della tabella identificano ...una cella che vuoi cambiare col tuo editor, restituisci editor ...altrimenti super.getCellEditor(row, col); } }
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#7 | ||
Senior Member
Iscritto dal: May 2009
Messaggi: 366
|
non riesco bene a capire il funzionamento
questa è lamia Jdialog contenente la tabella Quote:
Quote:
![]() ![]() ![]() ![]()
__________________
visitate http://www.forumsenzacontro.altervista.org |
||
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:19.