使用cellrendering动态地从数据库向jtable添加数据后,无法使用JTable进行排序操作

时间:2014-04-30 16:47:13

标签: java swing jtable jlabel

我有表文件文件,其中我已经存储了文件路径我从数据库中检索路径然后使用cellRendering放入JTable,其中我添加了图标和文本它工作正常但是我&#39 ; m面临排序操作问题

这是我的代码

import java.awt.Component;
import java.awt.Dimension;
import java.io.File;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.swing.*;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;

public class GUI extends JPanel {
    static JTable table;
    static JPanel jPanel;
     private static ArrayList<ArrayList<?>> cells = new ArrayList<ArrayList<?>>();
     private static ArrayList<JLabel> columnNames =new ArrayList<JLabel>();

    public GUI(){
         columnNames.add(new JLabel("Name"));
            columnNames.add(new JLabel("Type"));
            columnNames.add(new JLabel("Size"));
            columnNames.add(new JLabel("FilePath"));
        table =new JTable();
        table.setAutoCreateRowSorter(true);
        jPanel=new JPanel();
        new TableForm();
        jPanel.setPreferredSize(new Dimension(300,300));

        add(jPanel);
    }
public static class TableForm {

        public TableForm() {
            try {
                System.out.println(".......");
           ResultSet rs;

              rs=InsertDB.s.executeQuery(" select filepath from documentfiles ");

             table.setModel(new ResultSetTableModel(rs, columnNames));
             table.setDefaultRenderer(JLabel.class, new CellRenderer());
               table.setAutoCreateRowSorter(true);

            JScrollPane jsp=new JScrollPane(table);


            jsp.revalidate();
            jsp.repaint();
            jPanel.add(jsp);

            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        public static void showTable() {
            new TableForm();

        }
    }

    public static class ResultSetTableModel   implements TableModel{

        private int rowCount, columnCount=4;


        @Override
        public int getRowCount() {
            return rowCount;
        }
         public ResultSetTableModel(ResultSet resultSet, ArrayList<JLabel> titles) {
            try {
                ResultSetMetaData metaData = resultSet.getMetaData();
                columnCount = metaData.getColumnCount();

                cells = new ArrayList<ArrayList<?>>();

                while (resultSet.next()) {
                    ArrayList<Object> row = new ArrayList(columnCount);

                        row.add(resultSet.getString(1));
                    cells.add(row);
                }

                rowCount = cells.size();
                System.out.println(rowCount);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        @Override
        public int getColumnCount() {
            return columnCount;
        }

        @Override
        public String getColumnName(int columnIndex) {
            return columnNames.get(columnIndex).getText();
        }

        @Override
        public Class<?> getColumnClass(int columnIndex) {

            return JLabel.class;
        }

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

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            return cells.get(rowIndex).get(columnIndex);
        }

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

        }

        @Override
        public void addTableModelListener(TableModelListener l) {

        }

        @Override
        public void removeTableModelListener(TableModelListener l) {

        }


    }

    public static class CellRenderer extends JLabel implements TableCellRenderer {
         File f;
         public CellRenderer() {

         setOpaque(false);//MUST do this for background to show up.

         }

         public Component getTableCellRendererComponent(
              JTable table, Object color,
              boolean isSelected, boolean hasFocus,
              int row, int column) {
                 f=new File(table.getModel().getValueAt(row, column).toString());
         Icon icon= javax.swing.filechooser.FileSystemView.getFileSystemView().getSystemIcon(f);
         setIcon(icon);
         setText(f.getName());
         setToolTipText(f.getName());

         return this;
         }

         } 


     private static void createAndShowGUI() {
            //Create and set up the window.
            JFrame frame = new JFrame("TableDemo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            JComponent newContentPane = new GUI();
            newContentPane.setOpaque(true); //content panes must be opaque
            frame.setContentPane(newContentPane);
            frame.pack();
            frame.setVisible(true);
        }
    public static void main(String args[]){
         javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGUI();
                }
            });

    }
}
好吧,我无法找到我出错的地方,我不知道如何完成它,所以我正在寻找某人的帮助< / p>

提前致谢

4 个答案:

答案 0 :(得分:1)

NOTE:使用分拣机时,请务必记住转换单元格坐标。”

答案 1 :(得分:1)

尝试使用而不扩展JLabel

public static class CellRenderer extends DefaultTableCellRenderer{

    ...
    public Component getTableCellRendererComponent(JTable table, Object color,
            boolean isSelected, boolean hasFocus, int row, int column) {
        JLabel label = (JLabel)super.getTableCellRendererComponent(table, color, isSelected, hasFocus, row, column);
        // set icon and other properties of label
        ...
        return label;   
   }
}

答案 2 :(得分:0)

&#34;价值&#34;通过(在您的情况下为getTableCellRendererComponent ...?)参数将单元格传递给color,无需再次从表中获取值。

此...

f=new File(table.getModel().getValueAt(row, column).toString());

是多余的......

相反,你可以使用......

public Component getTableCellRendererComponent(
        JTable table, Object value,
        boolean isSelected, boolean hasFocus,
        int row, int column) {
    if (value instanceof File) {
        f= (File)value;
        Icon icon= javax.swing.filechooser.FileSystemView.getFileSystemView().getSystemIcon(f);
        setIcon(icon);
        setText(f.getName());
        setToolTipText(f.getName());
    } else {
        setText("Not a valid file");
    }

    return this;
}

如果您确实需要从表模型中获取值,则应该使用table.getValueAt(...),因为这将自动在视图和模型指示之间进行转换。

答案 3 :(得分:0)

好吧,我可以让它工作BTW感谢所有答案,但没有一个答案有效 我在这里做的错误是我忽略了对象值,而不是我从表格模型中使用的值我的意思 这是我改变的线,使它完美地工作 我改变了

 f=new File(table.getModel()...)

   f=new File(color.toString());

现在我能够排序