我有表文件文件,其中我已经存储了文件路径我从数据库中检索路径然后使用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>
提前致谢
答案 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)
f=new File(table.getModel()...)
到
f=new File(color.toString());
现在我能够排序