【Java】 實現一個簡單文件瀏覽器(2)

接着上篇文章java

 

接下來講下程序右側的文件內容表格如何實現數組

 

FileTable類:app

FileTable基礎於JTable類,構造函數裏用setDefaultRenderer設置每行默認的渲染器爲FileTableCellRenderer(下面會說如何實現)ide

setAutoCreateRowSorter(true)函數自動建立一個默認的排序篩選器,等同於:setRowSorter(new TableRowSorter(model))函數

RowSorter:默認狀況下,若是啓用排序,那麼排序時 JTable 將保留基於模型的選擇和可變行高度。例如,若是當前選擇行 0(就底層模型而言),那麼排序以後將選擇行 0(就底層模型而言)。選擇有可能看起來被更改了,但就底層模型而言它仍然保持不變。模型索引再也不可見或者被移除時除外。例如,若是行 0 被過濾掉了,那麼選擇在排序後將爲空。 this

this.setShowHorizontalLines(false);和this.setShowVerticalLines(false);設置表格中不繪製單元格周圍的橫向和縱向網格線url

 

package FileTable; import java.awt.Dimension; import java.io.File; import java.util.Comparator; import javax.swing.JTable; import javax.swing.table.TableModel; /** * Created by Administrator on 2016/3/29. */ public class FileTable extends JTable { /** * */ private static final long serialVersionUID = 1L; public FileTable(){ this.setDefaultRenderer(Object.class, new FileTableCellRenderer()); this.setAutoCreateRowSorter(true); this.getTableHeader().setReorderingAllowed(false); this.setShowHorizontalLines(false); this.setShowVerticalLines(false); setIntercellSpacing(new Dimension(0,0)); //修改單元格間隔,所以也將影響網格線的粗細。 setRowMargin(0);//設置相鄰兩行單元格的距離 } @Override public void setModel(TableModel dataModel) { super.setModel(dataModel); } } 

 

 

FileTableCellRenderer類:spa

FileTableCellRenderer繼承與TableCellRenderer ,返回用於繪製單元格的組件。此方法用於在繪製前適當地配置渲染器。 code

主要目的是重載getTableCellRendererComponent(),裏面根據不一樣列,顯示不一樣數據。如第0列顯示文件圖標和文件名,第二列顯示文件修改時間,第三列顯示文件類型,第四列顯示文件大小orm

 

package FileTable; import java.awt.Component; import java.io.File; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.Date; import javax.swing.JLabel; import javax.swing.JTable; import javax.swing.filechooser.FileSystemView; import javax.swing.table.TableCellRenderer; /** * Created by Administrator on 2016/3/29. */ public class FileTableCellRenderer extends JLabel implements TableCellRenderer { private static final long serialVersionUID = 1L; FileSystemView fileSystemView = FileSystemView.getFileSystemView(); @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { this.setFont(table.getFont()); setOpaque(true); setEnabled(table.isEnabled()); if (isSelected) { this.setBackground(table.getSelectionBackground()); this.setForeground(table.getSelectionForeground()); // fileTable.setShowHorizontalLines(true); // fileTable.setShowVerticalLines(true); } else { this.setBackground(table.getBackground()); this.setForeground(table.getForeground()); // fileTable.setShowHorizontalLines(false); // fileTable.setShowVerticalLines(false); } if (column == 0) { File file = (File) value; this.setText(fileSystemView.getSystemDisplayName(file)); this.setIcon(fileSystemView.getSystemIcon(file)); } else if (column == 1) { long datetime = (long)value; SimpleDateFormat sdf = new SimpleDateFormat(" yyyy/MM/dd/ HH:mm:ss"); Date date = new Date(datetime); this.setText(sdf.format(date)); this.setIcon(null); } else if (column == 2) { String description = (String)value; this.setText(description); this.setIcon(null); } else if (column == 3) { long size = (long)value; String fileSize = FormetFileSize(size); File file = (File)table.getValueAt(row,0); if (fileSystemView.isComputerNode(file) || fileSystemView.isDrive(file) || file.isDirectory()){ this.setText(null); } else { this.setText(fileSize); } this.setIcon(null); } return this; } public String FormetFileSize(long fileS) {//轉換文件大小 DecimalFormat df = new DecimalFormat("#.00"); String fileSizeString = ""; if (fileS == 0){ return fileSizeString; } if (fileS < 1024) { fileSizeString = df.format((double) fileS) + "B"; } else if (fileS < 1048576) { fileSizeString = df.format((double) fileS / 1024) + "K"; } else if (fileS < 1073741824) { fileSizeString = df.format((double) fileS / 1048576) + "M"; } else { fileSizeString = df.format((double) fileS / 1073741824) +"G"; } return fileSizeString; } } 

 

FileTableModel 類:

FileTable繼承與DefaultTableModel類

靜態變量tableHeader 存儲的是表格標題

 

DefaultTableModel有4種構造函數, 這裏我選擇第三種,經過數據的二維數組和表頭數組來初始化

DefaultTableModel()
          構造默認的 DefaultTableModel,它是一個零列零行的表。
DefaultTableModel(int rowCount, int columnCount)
          構造一個具備 rowCount 行和 columnCount 列的 null 對象值的 DefaultTableModel
DefaultTableModel(Object[][] data, Object[] columnNames)
          構造一個 DefaultTableModel,並經過將 data 和 columnNames 傳遞到 setDataVector 方法來初始化該表。
DefaultTableModel(Object[] columnNames, int rowCount)
          構造一個 DefaultTableModel,它的列數與 columnNames 中元素的數量相同,並具備 rowCount 行 null 對象值。
DefaultTableModel(Vector columnNames, int rowCount)
          構造一個 DefaultTableModel,它的列數與 columnNames 中元素的數量相同,並具備 rowCount 行 null 對象值。
DefaultTableModel(Vector data, Vector columnNames)
          構造一個 DefaultTableModel,並經過將 data 和 columnNames 傳遞到 setDataVector 方法來初始化該表。

 

經過重載getValueAt()函數,返回對應行列的值。重載CellEditable() 試其返回false 讓表格內容不能被編輯。

package FileTable; import java.io.File; import javax.swing.filechooser.FileSystemView; import javax.swing.table.DefaultTableModel; /** * Created by Administrator on 2016/3/29. */ public class FileTableModel extends DefaultTableModel { private static final long serialVersionUID = 1L; private static String[] tableHeader = {"名稱", "修改日期", "類型", "大小"}; private FileSystemView fileSystemView = FileSystemView.getFileSystemView(); public FileTableModel(Object[][] objects){ super(objects, tableHeader); } @Override public boolean isCellEditable(int row, int column) { return false; } @Override public Object getValueAt(int row, int column) { File file = (File) super.getValueAt(row, column); if (column == 0){ return file; } else if (column == 1){ return file.lastModified(); } else if (column == 2) { return fileSystemView.getSystemTypeDescription(file); } else if (column == 3){ return file.length(); } return super.getValueAt(row, column); } } 

 

本文連接: http://www.bugcoding.com/entry/16

版權全部。轉載時必須以連接形式註明做者和原始出處及本聲明。

相關文章
相關標籤/搜索