0

こんにちは、1 つの列に対して特定のセル レンダリング モデルを持つ Jtable があります。このモデルでは、テキスト データの代わりにこの列にボタンを配置するだけです。

テーブルの最初の表示はうまくいきます。コンテンツの順序を変更する関数を使用している場合でも、この列に対してモデルが呼び出されます (再描画は fireTableDataChanged() の呼び出しによって強制されます)。

さて、削除キーでテーブルの現在の行を削除したいと思います。このために、次のコードを使用しています。

public void keyTyped(KeyEvent arg0) {
    if (arg0.getKeyChar() == KeyEvent.VK_DELETE) {
        int currentRow = this.m_data.currentRow();
        if (currentRow >= 0) {
            this.m_data.deleteRow(currentRow);
            System.out.println("mise a jour après destruction de ligne");
            this.fireTableRowsDeleted(currentRow, currentRow);
        }
    }
}

(m_data は私のテーブル モデルです)。驚いたことに、データは更新されています (行が消えています) が、最初の列は空です。そして私のトレースは、 getValueAt() だけが呼び出されたことを示しています。getTableCellRendererComponent() は呼び出されません。

fireTableRowsDeleted() の代わりに fireTableDataChanged() を起動しようとしましたが、同じことです。したがって、それは火の機能に関連しているようには見えません。この問題の原因と解決方法について何か考えはありますか?

前もって感謝します。

4

2 に答える 2

1

これは、テーブル モデルに使用するコードです。あなたはそれを使用することができます。ご覧のとおり、とてもシンプルできれいです。

            public abstract class BeanTableModel<B> extends ArrayList<B>
                    implements TableModel {

            private List<TableModelListener> listeners = new ArrayList();
            private TableModelAttributeList attributeList;

            public BeanTableModel() {
                super();
            }

            public BeanTableModel(Object[][] attributes) {
                super();
                this.attributeList = new TableModelAttributeList(attributes) {
                };
            }

            public TableModelAttributeList getAttributeList() {
                return attributeList;
            }

            public final void setAttributeList(TableModelAttributeList attributeList) {
                this.attributeList = attributeList;
            }

            @Override
            public final int getRowCount() {
                return size();
            }

            @Override
            public final int getColumnCount() {
                if (attributeList != null) {
                    return attributeList.size();
                } else {
                    return 0;
                }
            }

            @Override
            public final String getColumnName(int columnIndex) {
                if (attributeList != null) {
                    return attributeList.getColumnName(columnIndex);
                } else {
                    return null;
                }
            }

            @Override
            public final Class<?> getColumnClass(int columnIndex) {
                if (attributeList != null) {
                    return attributeList.getColumnClass(columnIndex);

                } else {
                    return Object.class;
                }
            }

            @Override
            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return false;
            }

            @Override
            public final Object getValueAt(int rowIndex, int columnIndex) {
                try {
                    if (rowIndex >= 0) {
                        return (attributeList != null) ? attributeList.getValue(this.get(
                                rowIndex), columnIndex) : null;
                    } else {
                        return get(rowIndex);
                    }
                } catch (Exception ex) {
                    Logger.getLogger(BeanTableModel.class.getName()).log(Level.SEVERE,
                                                                            null, ex);
                    return null;
                }
            }

            @Override
            public final boolean add(B e) {
                boolean result = super.add(e);

                if (result) {
                    fireListeners();
                }

                return result;
            }

            @Override
            public final boolean addAll(Collection<? extends B> c) {
                boolean result = super.addAll(c);

                if (result) {
                    fireListeners();
                }

                return result;
            }

            public final void change(Collection<? extends B> c) {
                super.clear();
                super.addAll(c);
                fireListeners();
            }

            @Override
            public final boolean addAll(int index, Collection<? extends B> c) {
                boolean result = super.addAll(index, c);

                if (result) {
                    fireListeners();
                }

                return result;
            }

            @Override
            public final void clear() {
                super.clear();
                fireListeners();
            }

            @Override
            public final boolean remove(Object o) {
                boolean result = super.remove(o);

                if (result) {
                    fireListeners();
                }

                return result;
            }

            @Override
            public final boolean removeAll(Collection<?> c) {
                boolean result = super.removeAll(c);

                if (result) {
                    fireListeners();
                }

                return result;
            }

            @Override
            protected final void removeRange(int fromIndex, int toIndex) {
                super.removeRange(fromIndex, toIndex);
                fireListeners();
            }

            @Override
            public final boolean retainAll(Collection<?> c) {
                boolean result = super.retainAll(c);

                if (result) {
                    fireListeners();
                }

                return result;
            }

            @Override
            public final B remove(int index) {
                B b = super.remove(index);
                fireListeners();
                return b;
            }

            @Override
            public final void add(int index, B element) {
                super.add(index, element);
                fireListeners();
            }

            @Override
            public final B set(int index, B element) {
                B b = super.set(index, element);
                fireListeners();
                return b;
            }

            @Override
            public final void trimToSize() {
                super.trimToSize();
                fireListeners();
            }

            @Override
            public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
                //Do Nothing
            }

            @Override
            public final void addTableModelListener(TableModelListener l) {
                listeners.add(l);
            }

            @Override
            public final void removeTableModelListener(TableModelListener l) {
                listeners.remove(l);
            }

            public final void fireListeners() {
                TableModelEvent evt = new TableModelEvent(this);

                for (TableModelListener listener : listeners) {
                    listener.tableChanged(evt);
                }
            }

            public final ArrayList<B> serialize() {
                return new ArrayList<B>(this);
            }
          }

これは、フォーマットとその解釈方法に関するものです。

            public abstract class TableModelAttributeList {

            public static final int COLUMN_NAME = 0;
            public static final int CLASS = 1;
            public static final int ATTRIBUTE_NAME = 2;
            public static final int FORMAT = 3;
            public static final int REPLACE = 4;
            private final Object[][] attributes;
            private final Pattern[] patterns;

            public TableModelAttributeList(Object[][] attributes) {
                this.attributes = attributes;
                patterns = new Pattern[attributes.length];

                for (int i = 0, size = attributes.length; i < size; i++) {
                    if (attributes[i][REPLACE] != null) {
                        patterns[i] = Pattern.compile((String) attributes[i][FORMAT]);
                    }
                }
            }

            public final String getColumnName(int column) {
                return (String) attributes[column][COLUMN_NAME];
            }

            public final Class<?> getColumnClass(int column) {
                return (Class<?>) attributes[column][CLASS];
            }

            public final int size() {
                return attributes.length;
            }

            public final Object getValue(Object bean, int column) throws
                    Exception {

                try {
                    Object value = null;

                    if (attributes[column][ATTRIBUTE_NAME] == null) {
                        return "";
                    }

                    if (attributes[column][ATTRIBUTE_NAME].equals("this")) {
                        return bean;

                    } else {
                        try {
                        value = PropertyUtils.getProperty(bean,
                                                            (String) attributes[column][ATTRIBUTE_NAME]);
                        } catch (NullPointerException ex) {
                        return "";

                        } catch (NestedNullException ex) {
                        return "";
                        }
                    }
                    if (value == null) {
                        return null;

                    } else if (patterns[column] != null) {
                        Matcher matcher = patterns[column].matcher(String.valueOf(value));
                        if (matcher.find()) {
                        return matcher.replaceAll(
                                (String) attributes[column][REPLACE]);
                        } else {
                        return null;
                        }

                    } else if (value instanceof Date) {
                        if (attributes[column][FORMAT] != null) {
                        DateFormat format = new SimpleDateFormat(
                                (String) attributes[column][FORMAT]);
                        return format.format((Date) value);

                        } else {
                        return value;
                        }

                    } else if (attributes[column][FORMAT] != null) {
                        return String.format(
                                (String) attributes[column][FORMAT], value);
                    } else {
                        return value;
                    }
                } catch (IllegalAccessException ex) {
                    String message = "The property named '"
                            + (String) attributes[column][ATTRIBUTE_NAME]
                            + "' has a private getter method";
                    throw new Exception(message, ex);
                } catch (InvocationTargetException ex) {
                    String message = "An exception has ocurred while retrieving value for bean property '"
                            + (String) attributes[column][ATTRIBUTE_NAME] + "'";
                    throw new Exception(message, ex);
                } catch (NoSuchMethodException ex) {
                    String message = "The bean doesn't have a property named '"
                            + (String) attributes[column][ATTRIBUTE_NAME] + "'";
                    throw new InvalidModelAttributesException(message, ex);
                }
            }
          }

テーブル モデルの作成方法は次のとおりです。

            public class SelectEmployeeTableModel extends BeanTableModel<Empleados> {

                public static final String NOMBRE = "Nombre";

                public static final String DEPARTAMENTO = "Departamento";

                public static final String FECHA_BAJA = "FechaBaja";

                public SelectEmployeeTableModel() {
                    super(new Object[][]{
                        {NOMBRE                   ,  Object.class,     "nombreCompleto"           , null, null},
                        {DEPARTAMENTO       ,  Object.class,     "departamentoId.nombre"    , null, null},
                        {FECHA_BAJA       ,  Object.class,     "fechaBaja"    , null, null}
                    });
                }
             }

最初の列は表示される列の名前、2 番目はデータのタイプ (チェックボックスを表示する場合は、Boolean.class に置き換えます)、3 番目はリフレクションを使用するため、"get" プレフィックスを除いた名前です。 、4 番目は形式 (日付の場合は「dd/MM/yyyy」または 10 進数の場合は「$%.2f」) で、5 番目は正規表現に置き換えるためのものです。

次に、それを使用するパネルで次のようにします。

          jtable.setModel(new SelectEmployeeTableModel());

テーブルモデルのデータを変更する必要がある場合

          model.change(collectionName);

何らかの理由でリフレッシュしたいだけの場合は、そうします

          model.fireListeners();

レンダラーが失敗することはありませんでした。それ以下では、エンティティでゲッターを正しく設定しないでください。

ご不明な点がございましたら、お気軽にお問い合わせください。すてきな一日を。

于 2012-09-05T20:46:02.770 に答える
0

OK、ついに問題が見つかりました。ListSelectionListener があり、状況によっては fireTableCellUpdated(-1,0) を送信しました。これは、「愚かなJava」が「テーブルレンダリングを削除する」と解釈したこのコマンドです。

于 2012-09-08T17:34:21.300 に答える