0

での使用に問題がjTableありDefaultTableModelます。

上書きされたアイコンを表示する2つの列がありますDefaultTableCellRenderer

private static ImageIcon errorIcon = new ImageIcon("workDir/icons/error.png");
private static ImageIcon pageIcon = new ImageIcon("workDir/icons/page_white.png");
private static ImageIcon serverIcon = new ImageIcon("workDir/icons/server_go.png");
private static ImageIcon acceptIcon = new ImageIcon("workDir/icons/accept.png");

private class ImageRenderer extends DefaultTableCellRenderer {  

    JLabel lbl = new JLabel();

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {

        //lbl.setText((String) value);
        lbl.setVerticalAlignment(SwingConstants.CENTER);
        lbl.setHorizontalAlignment(SwingConstants.CENTER);

        if (value.equals("e")) {
            lbl.setIcon(pageIcon);
            return lbl;
        }

        ServiceTicket t = TICKET_DICT.get((UUID) tableModel.getValueAt(row, 3));

        if (t == null) {
            throw new IllegalStateException("Cannot find Ticket for UUID");
        }

        if (t.getReport().getElsterCode().equals("0")) {
            if (t.getSendMode().equals(EricSendMode.VALIDATE_LOCALLY)) {
                lbl.setIcon(acceptIcon);
            } else {
                lbl.setIcon(serverIcon);
            }
        } else {
            lbl.setIcon(errorIcon);
        }

        lbl.repaint();
        return lbl;
    }
}

ImageRendererビューの初期化フェーズで設定しました。

    resultTable.getColumnModel().getColumn(0).setCellRenderer(new ImageRenderer());
    resultTable.getColumnModel().getColumn(4).setCellRenderer(new ImageRenderer());

テーブルを並べ替え可能にしたい。そこで、この行を使用してデフォルトの並べ替えを有効にしました。

resultTable.setAutoCreateRowSorter(true);

私の問題は、並べ替えがうまく機能することですが、列0と4のアイコンは並べ替えイベントの後で再描画されません。

セルの値が変更されたことをテーブルに通知するイベントを追加しようとしましたが、機能しませんでした。

    resultTable.getRowSorter().addRowSorterListener(
            new RowSorterListener() {

                @Override
                public void sorterChanged(RowSorterEvent e) {                        
                    if (e.getType().equals(RowSorterEvent.Type.SORTED)) {
                        for (int i = 0; i < tableModel.getRowCount(); i++) {
                            tableModel.fireTableCellUpdated(i, 0);
                            tableModel.fireTableCellUpdated(i, 4);
                        }
                    }

                }
            });

テーブルが並べ替えられた後にアイコンを再描画するのを手伝ってもらえますか。テーブルモデルを確認したところ、すべてのセルと列が正しく並べ替えられました。アイコンとしてレンダリングされるセルの値ですら。

ありがとう!

4

1 に答える 1

1

実際には答えではないが、コメントするには長すぎるいくつかのコメント。

ServiceTicket t = TICKET_DICT.get((UUID) tableModel.getValueAt(row, 3));

TableModelテーブルがソートされたときに、から誤った値を取得します。その時点で、row渡されるインデックスrowは、モデルのインデックスの要素と一致しません(並べ替えのため)。

を使用しJTable#convertRowIndexToModelて、インデックスをモデルインデックスに変換します。

さらに、ソーターが変更されたときに呼び出すリスナーfireTableCellUpdatedは不要であり、正しくありません。表によって要素が表示される順序が変更される場合がありますが、基になるデータには何も変更されていません。

そして最後

テーブルモデルを確認したところ、すべてのセルと列が正しく並べ替えられました。アイコンとしてレンダリングされるセルの値も

「テーブルモデルをチェックした」とはどういう意味かわかりません。並べ替えても何も変わりませんTableModel。並べ替えは、モデル側ではなく、ビュー側でのみ行われます。

于 2012-10-05T14:25:50.133 に答える