Swing Jtable mit Delete Button (Button verschwindet nicht bei Delete))

patrick_e

Aktives Mitglied
Hallo,
ich habe eine Jtable und in der letzten Spalte habe ich einen Delete Button um den Satz zu löschen. Das geht auch wunderbar aber der JButton bleibt sichtbar. Erst wenn ich auf die Table klicke verschwindet er!
tabelle.revalidate() und tabelle.repaint() funktionieren irgendwie nicht! Kann mir jemand helfen?
 
Java:
    private class CustomTableCellEditor extends DefaultCellEditor {

        private boolean isPushed;

        public CustomTableCellEditor(JCheckBox checkBox) {
            super(checkBox);
        }

        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
            if (auswahlCombo.getSelectedIndex() == 0) {
                return super.getTableCellEditorComponent(table, "", isSelected, row, column);
            } else if (auswahlCombo.getSelectedIndex() == 1) {

                final Vacation v = (Vacation) value;
                if (v.getState() == 101 || v.getState() == 102 || v.getState() == 103) {
                    JButton cancel = new JButton("Storno");
                    cancel.addActionListener(new ActionListener() {

                        public void actionPerformed(ActionEvent e) {
                            try {
                                sessionIf.cancelVacation(v, JOptionPane.showInputDialog("Kommentar"));
                                aktualisieren.doClick();
                            } catch (RemoteException ex) {
                                // .....
                            }
                        }
                    });
                    return cancel;
                } else {
                    return super.getTableCellEditorComponent(table, "", isSelected, row, column);
                }
            } else {
                return super.getTableCellEditorComponent(table, "", isSelected, row, column);
            }
        }

        public Object getCellEditorValue() {
            return "";
        }

        public boolean stopCellEditing() {
            isPushed = false;
            return super.stopCellEditing();
        }

        protected void fireEditingStopped() {
            super.fireEditingStopped();
        }
    }
Java:
    private class CustomTableCellRenderer extends DefaultTableCellRenderer {

        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            if (auswahlCombo.getSelectedIndex() == 0) {
                return super.getTableCellRendererComponent(table, "", isSelected, hasFocus, row, column);
            } else if (auswahlCombo.getSelectedIndex() == 1) {

                final Vacation v = (Vacation) value;
                if (v.getState() == 101 || v.getState() == 102 || v.getState() == 103) {
                    JButton cancel = new JButton("Storno");
                    cancel.addActionListener(new ActionListener() {

                        public void actionPerformed(ActionEvent e) {
                            try {
                                sessionIf.cancelVacation(v, JOptionPane.showInputDialog("Kommentar"));
                                aktualisieren.doClick();
                            } catch (RemoteException ex) {
                                // .....
                            }
                        }
                    });
                    return cancel;
                } else {
                    return super.getTableCellRendererComponent(table, "", isSelected, hasFocus, row, column);
                }
            } else {
                return super.getTableCellRendererComponent(table, "", isSelected, hasFocus, row, column);
            }
        }
    }
Java:
private class CustomTableModel implements TableModel {

        private Vector<Vacation> data = null;
        private Vector<TableModelListener> listener = null;

        public CustomTableModel() {
            data = new Vector<Vacation>();
            listener = new Vector<TableModelListener>();
        }

        public void updateTableData(Vector<Vacation> v, int mode) {
            data.removeAllElements();
            data.addAll(v);
            fireTableModelChanged();
        }

        public int getRowCount() {
            return data.size();
        }

        public int getColumnCount() {
            return 6;
        }

        public Class<?> getColumnClass(int columnIndex) {
            if (columnIndex == 5) {
                return Vacation.class;
            }
            return String.class;
        }

        public String getColumnName(int columnIndex) {
            switch (columnIndex) {
                case 0:
                    return "Von";
                case 1:
                    return "Bis";
                case 2:
                    return "Typ";
                case 3:
                    return "Status";
                case 4:
                    return "Stunden";
                case 5:
                    return "Aktion";
                default:
                    return "";
            }
        }

        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return columnIndex == 5;
        }

        public Object getValueAt(int rowIndex, int columnIndex) {
            Vacation v = data.get(rowIndex);
            switch (columnIndex) {
                case 0:
                    return v.getFromDate();
                case 1:
                    return v.getToDate() == null ? "" : v.getToDate();
                case 2:
                    return v.getType().toString();
                case 3:
                    return v.getState().toString();
                case 4: {
                    if (v.getPartDay().doubleValue() == 0.0) {
                        return "";
                    } else if (v.getPartDay().doubleValue() < 1.0) {
                        return "Halbtags";
                    } else {
                        return "" + v.getPartDay().intValue();
                    }
                }
                case 5:
                    return v;
                default:
                    return "";
            }
        }

        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        }

        public void addTableModelListener(TableModelListener l) {
            listener.add(l);
        }

        public void removeTableModelListener(TableModelListener l) {
            listener.remove(l);
        }

        public void fireTableModelChanged() {
            for (TableModelListener l : listener) {
                l.tableChanged(new TableModelEvent(this));
            }
        }
    }
}
 
Hab den Code nur überflogen und hätte dazu ein paar Anmerkungen:
- grundsätzlich unschön ist, dass in Renderer und Editor innerhalb der get...Component(...) immer wieder neue Objekte erzeugt werden
- der/ein ActionListener im Renderer ist wirkungslos, das kann man sich sparen
- wird die JTable darüber informiert, dass das Editieren abgeschlossen ist bzw. wird irgendwo die stopCellEditing() des Editors noch den Knopfdruck aufgerufen?
 

Zurück
Oben