JButton dans JTable qui supprime ligne
bonjour,
j'ai une jtable dans laquelle j'ai une colonne avec un éditor et renderer Jbutton.
lorque je clique sur le bouton, la ligne doit se supprimer.
lorque je passe par un bouton qui est en dehors de la jtable je n'ai pas de message d'erreur.
par contre avec le bouton intégré à la ligne de la jtable, le bouton reste affiché, la ligne est effacée, mais il y a un problème de rafraichissement.
code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.EventObject;
import javax.swing.AbstractCellEditor;
import javax.swing.DefaultCellEditor;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JTable;
import javax.swing.event.CellEditorListener;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;
@SuppressWarnings("serial")
public class InvoiceTableCellEditorButton extends AbstractCellEditor implements TableCellEditor {
private JButton button;
public InvoiceTableCellEditorButton() {
button = new JButton();
button.setBorderPainted(false);
}
@Override
public Component getTableCellEditorComponent(final JTable table, Object value,
boolean isSelected, final int row, int column) {
ImageIcon monImage=new ImageIcon(getClass().getResource("/Images/delete.png"));
button.setIcon(monImage);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
InvoiceCorpsmodel model;
model = (InvoiceCorpsmodel) table.getModel();
System.out.println("Index row : "+row+ " nbre row : "+model.getRowCount());
if (model.getRowCount()==0){
InvoiceApplication.buttonTest().requestFocus();
}
model.removeRow(row);
//button.validate();
//button.repaint();
//InvoiceApplication.getTableCorpsInvoice().repaint();
//InvoiceApplication.getFrame().repaint();
InvoiceApplication.getScroll().repaint();
if (row==0) {
//InvoiceApplication.setCellSelect(row, 0);
}
else if (row>0){
//InvoiceApplication.setCellSelect(row, 0);
}
}
}) ;
return button;
}
@Override
public Object getCellEditorValue() {
return false;
}
} |
lors de la suppression le fond blanc de la ligne venant être supprimée et le button reste affiché. lorsque je clique sur cette ligne j'ai le message d'erreur suivant :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.RangeCheck(ArrayList.java:547)
at java.util.ArrayList.get(ArrayList.java:322)
at Invoice.InvoiceCorpsmodel.setValueAt(InvoiceCorpsmodel.java:94)
at javax.swing.JTable.setValueAt(JTable.java:2710)
at javax.swing.JTable.editingStopped(JTable.java:4712)
at javax.swing.AbstractCellEditor.fireEditingStopped(AbstractCellEditor.java:125)
at javax.swing.AbstractCellEditor.stopCellEditing(AbstractCellEditor.java:68)
at javax.swing.plaf.basic.BasicTableUI$Handler.mousePressed(BasicTableUI.java:980)
at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:263)
at java.awt.Component.processMouseEvent(Component.java:6260)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6028)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4235)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) |
je pense que c'est un problème de mise à jour de l'affichage, puisque lorque je redimensionne la JFrame qui contien la JTable, la ligne blanche et le bouton disparaissent.
merci de vos solutions.
Edition ok mais message d'erreur
bonsoir,
après recherches et tests j'ai fini par trouver une solution en faisant :
CellEditor c = table.getCellEditor();
c.stopCellEditing();
et en effet il faut validate() le JscrollPane.
l'application fonctionne mais j'ai une erreur dans la console java :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Invoice.InvoiceTableCellEditorButton$1.actionPerformed(InvoiceTableCellEditorButton.java:47)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6263)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6028)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at javax.swing.plaf.basic.BasicTableUI$Handler.repostEvent(BasicTableUI.java:918)
at javax.swing.plaf.basic.BasicTableUI$Handler.mouseReleased(BasicTableUI.java:1134)
at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:273)
at java.awt.Component.processMouseEvent(Component.java:6263)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6028)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
index : 0 nbre row : 1 |
quelqu'un connait-il l'origine du problème ?
merci