tableutils.java

来自「java ftp 操作代码,程序可以直接运行」· Java 代码 · 共 339 行

JAVA
339
字号
package net.sf.jftp.gui.base.dir;import java.awt.BorderLayout;import java.awt.Component;import java.lang.reflect.Constructor;import java.lang.reflect.Method;import java.util.Vector;import javax.swing.DefaultListModel;import javax.swing.ImageIcon;import javax.swing.JComponent;import javax.swing.JLabel;import javax.swing.JList;import javax.swing.JTable;import javax.swing.table.JTableHeader;import javax.swing.table.TableCellRenderer;import javax.swing.table.TableColumn;import javax.swing.table.TableColumnModel;import javax.swing.table.TableModel;import net.sf.jftp.config.Settings;public class TableUtils {			/**	 * Setzt die Breite der TableColumns.	 * 	 * Quelle: http://www.chka.de/swing/table/cell-sizes.html	 * 	 * @param table	 */	public static void calcColumnWidths(JTable table)	{	    JTableHeader header = table.getTableHeader();	    TableCellRenderer defaultHeaderRenderer = null;	    if (header != null)	        defaultHeaderRenderer = header.getDefaultRenderer();	    TableColumnModel columns = table.getColumnModel();	    TableModel data = table.getModel();	    int margin = columns.getColumnMargin(); // only JDK1.3	    int rowCount = data.getRowCount();	    int totalWidth = 0;	    for (int i = columns.getColumnCount() - 1; i >= 0; --i)	    {	        TableColumn column = columns.getColumn(i);	            	        int columnIndex = column.getModelIndex();	            	        int width = -1; 	        TableCellRenderer h = column.getHeaderRenderer();	          	        if (h == null)	            h = defaultHeaderRenderer;	            	        if (h != null) // Not explicitly impossible	        {	            Component c = h.getTableCellRendererComponent	                   (table, column.getHeaderValue(),	                    false, false, -1, i);	                    	            width = c.getPreferredSize().width;	        }	       	        for (int row = rowCount - 1; row >= 0; --row)	        {	            TableCellRenderer r = table.getCellRenderer(row, i);	                 	            Component c = r.getTableCellRendererComponent	               (table,	                data.getValueAt(row, columnIndex),	                false, false, row, i);	        	                width = Math.max(width, c.getPreferredSize().width);	        }	        if (width >= 0)	            column.setPreferredWidth(width + margin); // <1.3: without margin	        else	            ; // ???	            	        totalWidth += column.getPreferredWidth();	    }//	 only <1.3:   totalWidth += columns.getColumnCount() * columns.getColumnMargin();	    /* If you like; This does not make sense for two many columns!	    Dimension size = table.getPreferredScrollableViewportSize();	    size.width = totalWidth;	    table.setPreferredScrollableViewportSize(size);	    */	    // table.sizeColumnsToFit(-1); <1.3; possibly even table.revalidate()	    // if (header != null)	    //     header.repaint(); only makes sense when the header is visible (only <1.3)	}		public static void setFixedWidths(JTable table) {	    JTableHeader header = table.getTableHeader();	    TableCellRenderer defaultHeaderRenderer = null;	    if (header != null)	        defaultHeaderRenderer = header.getDefaultRenderer();	    TableColumnModel columns = table.getColumnModel();	    TableModel data = table.getModel();	    int rowCount = data.getRowCount();	    for (int i = 0; i<columns.getColumnCount(); i++)	    {	        TableColumn column = columns.getColumn(i);            	        int columnIndex = column.getModelIndex();            	        int width = -1; 	        if(i == 0) {	        	column.setPreferredWidth(20); 	        	column.setMaxWidth(20);	        }	        else if(i == 1) {	        	column.setMinWidth(100); 	        	column.setPreferredWidth(400); 	        }	        else if(i == 2) {	        	column.setMinWidth(60); 	        	column.setPreferredWidth(80); 	        	//column.setMaxWidth(90);	        }	        else if(i == 3) {	        	column.setMinWidth(25); 	        	column.setPreferredWidth(25); 	        	//column.setMaxWidth(90);	        }	    }	}		/**	 * Synchronisiert eine JList mit einem JTable.	 * 	 * Die Selections werden von dem Table auf die List kopiert.	 * 	 * @param list	 * @param listTbl	 */	public static void copyTableSelectionsToJList(JList list, JTable listTbl) {				list.setSelectedIndices(new int[0]);		int rows = listTbl.getRowCount();		Vector sel = new Vector();				for(int i=0; i<rows; i++) {			if(listTbl.getSelectionModel().isSelectedIndex(i)) sel.add(new Integer(i));		}				int tmp[] = new int[sel.size()];		for(int i=0; i<sel.size(); i++) tmp[i] = ((Integer)sel.get(i)).intValue();				list.setSelectedIndices(tmp);	}			/**	 * Generisches Modell erzeugen.	 * 	 * JList muss Vektoren von im JTable anzeigbaren Objekten enthalten.	 * 	 * @param l	 * @return	 */	private static synchronized TableModel generateTableModel(JList l) {			      TableModel dataModel = new MaterializedTableModel(l) {	    	  	          public Class getColumnClass(int columnIndex) {	                if(columnIndex == 0) return ImageIcon.class;	                else if(columnIndex == 3) return JLabel.class;	                else return String.class;	          }	    	  	          public int getColumnCount() { 	        	  //return (list.getModel().getSize() > 0 ? ((Vector)list.getModel().getElementAt(0)).size() : 0);	        	  return 4;	          }	          	          public int getRowCount() { 	        	  return list.getModel().getSize();	          }	          	          public Object getValueAt(int row, int col) {	        	  if(list.getModel().getSize() == 0) return ""+null;	        	  DirEntry ret = (DirEntry) list.getModel().getElementAt(row);	        	  	        	  if(col == 0) return ret.getImageIcon();	        	  else if(col == 1) return ret.toString();	        	  else if(col == 2) {	        		  String tmp = ""+ret.getFileSize();	        		  String r = tmp.replaceAll(" >", "");	        		  return r;	        	  }	        	  else if(col == 3) {	        		  return ret;	        	  }	        	  //System.out.println(">>> "+ret.get(col)+" -> "+(ret.get(col) instanceof Status));	        	  //return ret.size() > col ? ret.get(col) : "<ERROR>";	        	  return ret;	          }	      };	      return dataModel;	}			/**	 * F?hrt Updates auf einen beliebigen JTable durch.	 * 	 * list muss hierzu vom Typ Vector<String> sein.	 * 	 * @param list	 * @param listTbl	 */	public static void layoutTable(JList list, JTable listTbl) {		layoutTable(list, listTbl, null);	}		/**	 * F?hrt Updates auf einen beliebigen JTable durch.	 * 	 * list muss hierzu vom Typ Vector<String> sein.	 */	public static void layoutTable(JList list, JTable listTbl, Vector names) {		    listTbl.setModel(generateTableModel(list));		    		    if(Settings.useFixedTableWidths) {		    	setFixedWidths(listTbl);		    }		    else {		    	calcColumnWidths(listTbl);		    }		    			if(names != null) modifyTableHeader(listTbl.getTableHeader(), names);						// 1.6+ only			tryToEnableRowSorting(listTbl);						//listTbl.doLayout();	}		/**	 * Versucht ?ber die Java-Reflection-API das automatische JTable-sort zu aktivieren.	 * 	 * Das Feature ist neu in JDK1.6 und erlaubt es dem Benutzer durch Clicks auf die	 * jeweiligen Tabellenspalten Zeilen automatisch zu sortieren.	 * 	 * @param listTbl JTable	 */	public static void tryToEnableRowSorting(JTable listTbl) {		/*		try {			TableModel mdl = listTbl.getModel(); 			Class c = Class.forName("javax.swing.table.TableRowSorter");			Class c2 = Class.forName("javax.swing.RowSorter");						Constructor con = c.getConstructor(TableModel.class);						Object args[] = new Object[1];			args[0] = mdl;			                        Method meth = listTbl.getClass().getMethod("setRowSorter", c2);            Object retobj = meth.invoke(listTbl, con.newInstance(args));                        Settings.IS_JAVA_1_6 = true;            		//	System.out.println("JTable-Sortierung wurde aktiviert.");		}		catch(Exception e) {		//	System.out.println("JTable-Sortierung konnte nicht aktiviert werden.");		}		catch(Error ex) {		//	System.out.println("JTable-Sortierung konnte nicht aktiviert werden.");		}		*/	}		/**	 * Setzt den Header einer JTable	 * @param head	 * @param columnNames	 */	public static void modifyTableHeader(JTableHeader head, Vector columnNames) {				TableColumnModel m = head.getColumnModel();				if(m.getColumnCount() != columnNames.size()) {			System.out.println("Column mismatch: "+m.getColumnCount()+"/"+columnNames.size());			return;		}				for(int i=0; i<columnNames.size(); i++) {			TableColumn c = m.getColumn(i);			c.sizeWidthToFit();			c.setHeaderValue(columnNames.get(i));		}	}		/**	 * Erzeugt einen Panel mit View und Header eines JTables.	 * 	 */	public static JComponent makeTable(JTable table, JComponent cont) {		JTableHeader header = table.getTableHeader();				cont.setLayout(new BorderLayout());		cont.add(header, BorderLayout.NORTH);		cont.add(table, BorderLayout.CENTER);				return cont;	}	}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?