1 package org.antlr.xjlib.appkit.swing; 2 3 import org.antlr.xjlib.foundation.XJSystem; 4 5 import javax.swing.*; 6 import javax.swing.table.DefaultTableCellRenderer ; 7 import javax.swing.table.TableCellRenderer ; 8 import javax.swing.table.TableColumn ; 9 import javax.swing.table.TableColumnModel ; 10 import java.awt.*; 11 import java.awt.event.ComponentAdapter ; 12 import java.awt.event.ComponentEvent ; 13 43 44 public class XJTableView extends JScrollPane { 45 46 private XJTable table = new XJTable(); 47 private boolean alternateBackground = true; 48 49 public XJTableView() { 50 setViewportView(table); 51 52 addComponentListener(new ComponentAdapter () { 53 public void componentResized(ComponentEvent e) { 54 autoresizeColumns(); 55 } 56 }); 57 58 table.setDefaultRenderer(Object .class, new XJTableAlternateRenderer()); 59 table.setShowGrid(false); 60 table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 61 62 setWheelScrollingEnabled(true); 63 getViewport().setBackground(Color.white); 64 } 65 66 public XJTable getTable() { 67 return table; 68 } 69 70 public boolean isAlternateBackground() { 71 return alternateBackground; 72 } 73 74 public void setAlternateBackground(boolean alternateBackground) { 75 this.alternateBackground = alternateBackground; 76 if(alternateBackground) { 77 table.setDefaultRenderer(Object .class, new XJTableAlternateRenderer()); 78 } else { 79 table.setDefaultRenderer(Object .class, new DefaultTableCellRenderer ()); 80 } 81 } 82 83 public void autoresizeColumns() { 84 resizeTableColumnsToFitContent(table, 20); 85 86 TableColumnModel model = table.getColumnModel(); 87 int columnTotalWidth = 0; 88 for(int i=0; i<model.getColumnCount()-1; i++) { 89 columnTotalWidth += model.getColumn(i).getPreferredWidth(); 90 } 91 92 int offset; 94 if(getVerticalScrollBar().isVisible()) { 95 if(XJSystem.isWindows()) { 96 offset = 20; 97 } else { 98 offset = 20; 99 } 100 } else { 101 if(XJSystem.isWindows()) { 102 offset = 3; 103 } else { 104 offset = 4; 105 } 106 } 107 108 int spWidth = getWidth(); 109 if(spWidth == 0) { 110 spWidth = getPreferredSize().width; 111 } 112 113 if(model.getColumnCount() > 0) { 114 TableColumn c = model.getColumn(model.getColumnCount()-1); 115 int prefWidth = c.getPreferredWidth(); 116 c.setPreferredWidth(Math.max(spWidth - columnTotalWidth - offset, prefWidth)); 117 } 118 } 119 120 public static void resizeTableColumnsToFitContent(JTable table, int margin) { 121 for(int c = 0; c < table.getColumnCount(); c++) { 122 resizeColumnToFitContent(table, c, margin); 123 } 124 } 125 126 public static void resizeColumnToFitContent(JTable table, int columnIndex, int margin) { 127 TableColumn column = table.getColumnModel().getColumn(columnIndex); 128 TableCellRenderer renderer = column.getHeaderRenderer(); 129 if (renderer == null) { 130 renderer = table.getTableHeader().getDefaultRenderer(); 131 } 132 Component c = renderer.getTableCellRendererComponent(table, 133 column.getHeaderValue(), 134 false, false, 135 0, 0); 136 int maxWidth = c.getPreferredSize().width; 137 138 for(int row=0; row<table.getRowCount(); row++) { 139 renderer = table.getCellRenderer(row, columnIndex); 140 c = renderer.getTableCellRendererComponent(table, 141 table.getValueAt(row, columnIndex), 142 false, false, 143 row, columnIndex); 144 maxWidth = Math.max(maxWidth, c.getPreferredSize().width); 145 } 146 147 column.setPreferredWidth(maxWidth+margin); 148 } 149 150 public void scrollToLastRow() { 151 table.scrollRectToVisible(table.getCellRect(table.getRowCount()-1, 0, true)); 152 } 153 } 154 | Popular Tags |