Swing里的提供的表格过于简单。要做复杂的表格得花一番功夫。现把以前做过的整理如下:
package test; /** * Another JTable example, showing how column attributes can be refined * even when columns have been created automatically. Here we create some * specialised renderers and editors as well as changing widths and colors * for some of the columns in the SwingSet demo table. * * @version 1.19 11/17/05 * @author Philip Milne */ import javax.swing.*; import javax.swing.table.*; import javax.swing.border.*; import java.awt.Dimension; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.Color; public class TableExample4 { public TableExample4() { JFrame frame = new JFrame("Table"); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);}}); // Take the dummy data from SwingSet. final String[] names = {"First Name", "Last Name", "Favorite Color", "Favorite Number", "Vegetarian"}; final Object[][] data = { {"Mark", "Andrews", "Red", new Integer(2), Boolean.TRUE}, {"Tom", "Ball", "Blue", new Integer(99), Boolean.FALSE}, {"Alan", "Chung", "Green", new Integer(838), Boolean.FALSE}, {"Jeff", "Dinkins", "Turquois", new Integer(8), Boolean.TRUE}, {"Amy", "Fowler", "Yellow", new Integer(3), Boolean.FALSE}, {"Brian", "Gerhold", "Green", new Integer(0), Boolean.FALSE}, {"James", "Gosling", "Pink", new Integer(21), Boolean.FALSE}, {"David", "Karlton", "Red", new Integer(1), Boolean.FALSE}, {"Dave", "Kloba", "Yellow", new Integer(14), Boolean.FALSE}, {"Peter", "Korn", "Purple", new Integer(12), Boolean.FALSE}, {"Phil", "Milne", "Purple", new Integer(3), Boolean.FALSE}, {"Dave", "Moore", "Green", new Integer(88), Boolean.FALSE}, {"Hans", "Muller", "Maroon", new Integer(5), Boolean.FALSE}, {"Rick", "Levenson", "Blue", new Integer(2), Boolean.FALSE}, {"Tim", "Prinzing", "Blue", new Integer(22), Boolean.FALSE}, {"Chester", "Rose", "Black", new Integer(0), Boolean.FALSE}, {"Ray", "Ryan", "Gray", new Integer(77), Boolean.FALSE}, {"Georges", "Saab", "Red", new Integer(4), Boolean.FALSE}, {"Willie", "Walker", "Phthalo Blue", new Integer(4), Boolean.FALSE}, {"Kathy", "Walrath", "Blue", new Integer(8), Boolean.FALSE}, {"Arnaud", "Weber", "Green", new Integer(44), Boolean.FALSE} }; // Create a model of the data. TableModel dataModel = new AbstractTableModel() { // These methods always need to be implemented. public int getColumnCount() { return names.length; } public int getRowCount() { return data.length;} public Object getValueAt(int row, int col) {return data[row][col];} // The default implementations of these methods in // AbstractTableModel would work, but we can refine them. public String getColumnName(int column) {return names[column];} public Class getColumnClass(int c) {return getValueAt(0, c).getClass();} public boolean isCellEditable(int row, int col) {return true;} public void setValueAt(Object aValue, int row, int column) { System.out.println("Setting value to: " + aValue); data[row][column] = aValue; } }; // Create the table JTable tableView = new JTable(dataModel); // Turn off auto-resizing so that we can set column sizes programmatically. // In this mode, all columns will get their preferred widths, as set blow. tableView.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); // Create a combo box to show that you can use one in a table. JComboBox comboBox = new JComboBox(); comboBox.addItem("Red"); comboBox.addItem("Orange"); comboBox.addItem("Yellow"); comboBox.addItem("Green"); comboBox.addItem("Blue"); comboBox.addItem("Indigo"); comboBox.addItem("Violet"); TableColumn colorColumn = tableView.getColumn("Favorite Color"); // Use the combo box as the editor in the "Favorite Color" column. colorColumn.setCellEditor(new DefaultCellEditor(comboBox)); // Set a pink background and tooltip for the Color column renderer. DefaultTableCellRenderer colorColumnRenderer = new DefaultTableCellRenderer(); colorColumnRenderer.setBackground(Color.pink); colorColumnRenderer.setToolTipText("Click for combo box"); colorColumn.setCellRenderer(colorColumnRenderer); // Set a tooltip for the header of the colors column. TableCellRenderer headerRenderer = colorColumn.getHeaderRenderer(); if (headerRenderer instanceof DefaultTableCellRenderer) ((DefaultTableCellRenderer)headerRenderer).setToolTipText("Hi Mom!"); // Set the width of the "Vegetarian" column. TableColumn vegetarianColumn = tableView.getColumn("Vegetarian"); vegetarianColumn.setPreferredWidth(100); // Show the values in the "Favorite Number" column in different colors. TableColumn numbersColumn = tableView.getColumn("Favorite Number"); DefaultTableCellRenderer numberColumnRenderer = new DefaultTableCellRenderer() { public void setValue(Object value) { int cellValue = (value instanceof Number) ? ((Number)value).intValue() : 0; setForeground((cellValue > 30) ? Color.black : Color.red); setText((value == null) ? "" : value.toString()); } }; numberColumnRenderer.setHorizontalAlignment(JLabel.RIGHT); numbersColumn.setCellRenderer(numberColumnRenderer); numbersColumn.setPreferredWidth(110); // Finish setting up the table. JScrollPane scrollpane = new JScrollPane(tableView); scrollpane.setBorder(new BevelBorder(BevelBorder.LOWERED)); scrollpane.setPreferredSize(new Dimension(430, 200)); frame.getContentPane().add(scrollpane); frame.pack(); frame.setVisible(true); } public static void main(String[] args) { new TableExample4(); } }
2. 固定列的表格
package aaa; import java.awt.BorderLayout; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JViewport; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.AbstractTableModel; /** * @version 1.0 12/05/98 */ public class FixedColumnExample extends JFrame { Object[][] data; Object[] column; JTable fixedTable, table; public FixedColumnExample() { super("Fixed Column Example"); setSize(400, 150); data = new Object[][]{ {"1","11","A","","","","",""}, {"2","22","","B","","","",""}, {"3","33","","","C","","",""}, {"4","44","","","","D","",""}, {"5","55","","","","","E",""}, {"6","66","","","","","","F"}}; column = new Object[]{"fixed 1","o","a","b","c","d","e","f"}; AbstractTableModel fixedModel = new AbstractTableModel() { public int getColumnCount() { return 1; } public int getRowCount() { return data.length; } public String getColumnName(int col) { return (String) column[col]; } public Object getValueAt(int row, int col) { return data[row][col]; } }; AbstractTableModel model = new AbstractTableModel() { public int getColumnCount() { return column.length - 2; } public int getRowCount() { return data.length; } public String getColumnName(int col) { return (String) column[col + 1]; } public Object getValueAt(int row, int col) { return data[row][col + 1]; } public void setValueAt(Object obj, int row, int col) { data[row][col + 1] = obj; } }; fixedTable = new JTable(fixedModel); fixedTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); fixedTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); fixedTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent arg0) { checkSelection(true); } }); table = new JTable(model); table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); table.getSelectionModel().addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent arg0) { checkSelection(false); } }); JViewport viewport = new JViewport(); viewport.setView(fixedTable); viewport.setPreferredSize(fixedTable.getPreferredSize()); JScrollPane scroll = new JScrollPane(table); scroll.setRowHeaderView(viewport); scroll.setCorner(JScrollPane.UPPER_LEFT_CORNER, fixedTable.getTableHeader()); getContentPane().add(scroll, BorderLayout.CENTER); } private void checkSelection(boolean isFixedTable) { int fixedSelectedIndex = fixedTable.getSelectedRow(); int selectedIndex = table.getSelectedRow(); if (fixedSelectedIndex != selectedIndex) { if (isFixedTable) { table.setRowSelectionInterval(fixedSelectedIndex, fixedSelectedIndex); } else { fixedTable.setRowSelectionInterval(selectedIndex, selectedIndex); } } } public static void main(String[] args) { FixedColumnExample frame = new FixedColumnExample(); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.setVisible(true); } }
3.表格列里有radiobutton的表格
/* (swing1.1beta3) */ //package jp.gr.java_conf.tame.swing.examples; /** * @version 1.0 12/03/98 */ import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.table.*; import javax.swing.event.*; class RadioButtonRenderer implements TableCellRenderer { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (value == null) return null; return (Component) value; } } class RadioButtonEditor extends DefaultCellEditor implements ItemListener { private JRadioButton button; public RadioButtonEditor(JCheckBox checkBox) { super(checkBox); } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { if (value == null) return null; button = (JRadioButton) value; button.addItemListener(this); return (Component) value; } public Object getCellEditorValue() { button.removeItemListener(this); return button; } public void itemStateChanged(ItemEvent e) { super.fireEditingStopped(); } } public class JRadioButtonTableExample extends JFrame { public JRadioButtonTableExample() { super("JRadioButtonTable Example"); UIDefaults ui = UIManager.getLookAndFeel().getDefaults(); UIManager.put("RadioButton.focus", ui.getColor("control")); DefaultTableModel dm = new DefaultTableModel(); dm.setDataVector(new Object[][] { { "Group 1", new JRadioButton("A") }, { "Group 1", new JRadioButton("B") }, { "Group 1", new JRadioButton("C") }, { "Group 2", new JRadioButton("a") }, { "Group 2", new JRadioButton("b") } }, new Object[] { "String", "JRadioButton" }); JTable table = new JTable(dm) { public void tableChanged(TableModelEvent e) { super.tableChanged(e); repaint(); } }; ButtonGroup group1 = new ButtonGroup(); group1.add((JRadioButton) dm.getValueAt(0, 1)); group1.add((JRadioButton) dm.getValueAt(1, 1)); group1.add((JRadioButton) dm.getValueAt(2, 1)); ButtonGroup group2 = new ButtonGroup(); group2.add((JRadioButton) dm.getValueAt(3, 1)); group2.add((JRadioButton) dm.getValueAt(4, 1)); table.getColumn("JRadioButton").setCellRenderer( new RadioButtonRenderer()); table.getColumn("JRadioButton").setCellEditor( new RadioButtonEditor(new JCheckBox())); JScrollPane scroll = new JScrollPane(table); getContentPane().add(scroll); setSize(200, 140); setVisible(true); } public static void main(String[] args) { JRadioButtonTableExample frame = new JRadioButtonTableExample(); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } }
4.列header表格
/* (swing1.1beta3) */ //package jp.gr.java_conf.tame.swing.examples; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.table.*; /** * @version 1.0 11/09/98 */ class RowHeaderRenderer extends JLabel implements ListCellRenderer { RowHeaderRenderer(JTable table) { JTableHeader header = table.getTableHeader(); setOpaque(true); setBorder(UIManager.getBorder("TableHeader.cellBorder")); setHorizontalAlignment(CENTER); setForeground(header.getForeground()); setBackground(header.getBackground()); setFont(header.getFont()); } public Component getListCellRendererComponent( JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { setText((value == null) ? "" : value.toString()); return this; } } public class RowHeaderExample extends JFrame { public RowHeaderExample() { super( "Row Header Example" ); setSize( 300, 150 ); ListModel lm = new AbstractListModel() { String headers[] = {"a", "b", "c", "d", "e", "f", "g", "h", "mmm"}; public int getSize() { return headers.length; } public Object getElementAt(int index) { return headers[index]; } }; DefaultTableModel dm = new DefaultTableModel(lm.getSize(),10); JTable table = new JTable( dm ); table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); JList rowHeader = new JList(lm); rowHeader.setFixedCellWidth(50); // rowHeader.setFixedCellHeight(table.getRowHeight() // ); // + table.getIntercellSpacing().height); rowHeader.setCellRenderer(new RowHeaderRenderer(table)); JScrollPane scroll = new JScrollPane( table ); scroll.setRowHeaderView(rowHeader); getContentPane().add(scroll, BorderLayout.CENTER); } public static void main(String[] args) { RowHeaderExample frame = new RowHeaderExample(); frame.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent e ) { System.exit(0); } }); frame.setVisible(true); } }