【问题标题】:unable to do sort operation with JTable after adding data to jtable from database dynamically with cellrendering使用 cellrendering 将数据库中的数据动态添加到 jtable 后,无法使用 JTable 进行排序操作
【发布时间】:2014-06-17 02:34:47
【问题描述】:

我有表格文档文件,我在其中存储了文件路径我正在从数据库中检索路径,然后将带有 cellRendering 的 JTable 放入其中我正在添加图标和文本它工作正常但我面临排序问题操作

这是我的代码

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();
                }
            });

    }
}

好吧,我无法找出我哪里出错了,我不知道如何完成它,所以我正在寻求某人的帮助

提前致谢

【问题讨论】:

  • 好吧,上面的代码有一个错误,需要更改一行才能使其正常工作 f=new File(table.getTableModel()...);到 f=new File(color.toString());顺便说一句,单元格渲染器代码可以使用建议的答案进行更改,它工作得非常好:)

标签: java swing jtable jlabel


【解决方案1】:

NOTE:使用排序器时,请始终记住转换单元格坐标。”

【讨论】:

    【解决方案2】:

    试试这个不扩展 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;   
       }
    }
    

    【讨论】:

    • 好吧,我使用 table.setDefaultRenderer(Object.class,cellRenderer) 仍然无法排序,顺便说一句,我认为问题出在 JLabel 上,列是 JLabel,行是 JLabel,所以如果是我可以排序的字符串,它工作正常,但我当时在 JTable 单元格中错过了图标,所以我无法找到解决此问题的方法。
    • 如果您不想覆盖所有方法,请使用 extends AbstractTableModel 而不是 implements TableModel
    • @user2318813 我更新了我的帖子。请看一看。
    • @user2318813 是的,你是对的,问题在于JLabel。试试我的解决方案吧。
    【解决方案3】:

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

    这...

    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(...),因为这会自动在视图和模型索引之间进行转换。

    【讨论】:

      【解决方案4】:

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

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

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

      现在我可以排序了

      【讨论】:

        猜你喜欢
        • 2021-01-10
        • 1970-01-01
        • 2014-02-09
        • 1970-01-01
        • 2011-06-14
        • 2016-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多