`请问 JTable 能否简单实现下面的功能?
表头合并? 如1-4列为一组,5-8列为一组?(表头)
 -----------------------------------------------------------
|No. |      String1                 |       String2         |
 -----------------------------------------------------------
|    |      |       |   |   |     |   |   |     |
|    |      |       |   |   |     |   |   |     |
|    |      |       |   |   |     |   |   |     |
|    |      |       |   |   |     |   |   |     |
 -----------------------------------------------------------

解决方案 »

  1.   

    可以实现
    参考http://blog.csdn.net/bradwoo8621/archive/2007/03/26/1541835.aspx
      

  2.   

    Jtable合并??????????http://blog.csdn.net/bradwoo8621/archive/2007/03/26/1541835.aspx这里有个完整的例子。
      

  3.   

    哈哈,楼上竟然比我快一步,其实 Google就可以啦。
      

  4.   

    我试了一下,不行啊,运行出错了。Exception in thread "main" java.lang.NoClassDefFoundError: TableHeaderRenderer
            at GroupableTableHeader.createDefaultRenderer(GroupableTableHeader.java:
    232)
            at javax.swing.table.JTableHeader.initializeLocalVars(Unknown Source)
            at javax.swing.table.JTableHeader.<init>(Unknown Source)
            at javax.swing.table.JTableHeader.<init>(Unknown Source)
            at GroupableTableHeader.<init>(GroupableTableHeader.java:25)
            at GroupableTableHeaderTest.<init>(GroupableTableHeaderTest.java:61)
            at GroupableTableHeaderTest.main(GroupableTableHeaderTest.java:22)
    Caused by: java.lang.ClassNotFoundException: TableHeaderRenderer
            at java.net.URLClassLoader$1.run(Unknown Source)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(Unknown Source)
            at java.lang.ClassLoader.loadClass(Unknown Source)
            at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
            at java.lang.ClassLoader.loadClass(Unknown Source)
            at java.lang.ClassLoader.loadClassInternal(Unknown Source)
            ... 7 more
      

  5.   

    没有简单的方法 只能重写header的render类
      

  6.   

    可以实现了。代码如下。import java.awt.Color;
    import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.GridLayout;
    import java.util.Collections;
    import java.util.Enumeration;
    import java.util.List;
    import javax.swing.*;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.ListSelectionEvent;
    import javax.swing.event.TableColumnModelEvent;
    import javax.swing.event.TableColumnModelListener;
    import javax.swing.table.*;public class MultiSpanHeaderColorTest extends JPanel { private static final long serialVersionUID = -4323306588309001976L; public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override
    public void run() {
    new MultiSpanHeaderColorTest().makeUI();
    }
    });
    } public void makeUI() {
    String[] title = { "", "001", "002", "003", "004", "005", "006", "007", "008", "009",
    "010", "011", "012", "013", "014", "015", "016", "017", "018", "019", "020", "021",
    "022", "023" };
    String[][] data = {
    { "A0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14",
    "15", "16", "17", "18", "19", "20", "21", "22", "23" },
    { "A1", "01", "02", "03", "04", "5", "", "1", "2", "3", "4", "5", "", "1", "2",
    "3", "4", "5" },
    { "B", "001", "002", "003", "004", "5", "", "001", "002", "003", "004", "5", "",
    "001", "002", "003", "004", "5" },
    { "C", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14",
    "15", "16", "17", "18", "19", "20" },
    { "D", "001", "002", "003", "004", "5", "", "001", "002", "003", "004", "5", "",
    "001", "002", "003", "004", "5" },
    { "E", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14",
    "15", "16", "17", "18", "19", "20" },
    { "H", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14",
    "15", "16", "17", "18", "19", "20" } };
    JTable table = new JTable();
    DefaultTableModel defaultTableModel = new DefaultTableModel();
    defaultTableModel.setDataVector(data, title);
    table.setModel(defaultTableModel); final JTableHeader header = table.getTableHeader();
    header.setReorderingAllowed(false);
    final TableColumnModel model = table.getColumnModel();
    Enumeration<TableColumn> enumColumns = model.getColumns();
    final List<TableColumn> columns = Collections.list(enumColumns); String[] dummyTitle = { "", "String1", "String2" };
    final JTable dummyTable = new JTable(null, dummyTitle);
    final JTableHeader dummyHeader = dummyTable.getTableHeader();
    dummyHeader.setReorderingAllowed(false);
    dummyHeader.setResizingAllowed(false);
    final TableColumnModel dummyModel = dummyTable.getColumnModel();
    Enumeration<TableColumn> enumDummyColumns = dummyModel.getColumns();
    final List<TableColumn> dummyColumns = Collections.list(enumDummyColumns); model.addColumnModelListener(new TableColumnModelListener() { @Override
    public void columnAdded(TableColumnModelEvent e) { } @Override
    public void columnRemoved(TableColumnModelEvent e) { } @Override
    public void columnMoved(TableColumnModelEvent e) { } @Override
    public void columnMarginChanged(ChangeEvent e) {
    dummyColumns.get(0).setWidth(columns.get(0).getWidth());
    int nWidth = 0;
    for (int n = 1; n < 11; n++) {
    nWidth = nWidth + columns.get(n).getWidth();
    }
    dummyColumns.get(1).setWidth(nWidth);
    nWidth = 0; for (int n = 11; n < 24; n++) {
    nWidth = nWidth + columns.get(n).getWidth();
    }
    dummyColumns.get(2).setWidth(nWidth);
    } @Override
    public void columnSelectionChanged(ListSelectionEvent e) { }
    });// setTableFormat(table);// set color
    // setTableFormatDummy(dummyTable);// set color JScrollPane scrollPane = new JScrollPane(table);
    scrollPane.setPreferredSize(new Dimension(700, 200)); JFrame frame = new JFrame("Test 2Table Header");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(scrollPane);
    frame.pack(); JPanel panel = new JPanel(new GridLayout(2, 1));
    panel.add(dummyHeader);
    panel.add(header);
    scrollPane.getColumnHeader().setView(panel);
    scrollPane.setBackground(Color.RED);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    }
    }
      

  7.   


    可是还有一个疑问,如何把它做成一个构造函数的形式?
    在主程序中,用如下的方法调用? 请大家帮忙。谢谢public static void main(String[] args) {
    JFrame frame = new JFrame("Test");
    frame.addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent e) {
    System.exit(0);
    }
    });
           frame.setVisible(true);
    } frame.setBounds(30, 60, 780, 250);
    frame.getContentPane().setLayout(null);
    final MultiSpanHeaderColorTest panel = new MultiSpanHeaderColorTest ();
    panel.setBounds(0, 0, 764, 184); frame.getContentPane().add(panel);
      

  8.   

    可是还有一个疑问,如何把它做成一个构造函数的形式?
    在主程序中,用如下的方法调用? 请大家帮忙。谢谢 public static void main(String[] args) {
    JFrame frame = new JFrame("Test");
    frame.addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent e) {
    System.exit(0);
    }
    });frame.setBounds(30, 60, 780, 250);
    frame.getContentPane().setLayout(null);
    final MultiSpanHeaderColorTest panel = new MultiSpanHeaderColorTest ();
    panel.setBounds(0, 0, 764, 184);frame.getContentPane().add(panel);      frame.setVisible(true);
    }
      

  9.   

    UP 有人帮忙看看吗? 上面的代码调试完毕,可以执行。就剩下一个 布局 的问题了,帮帮忙吧。问题: 如何把它做成一个构造函数的形式? 
    我试了一下,独立(做成一个构造函数的形式)后,scrollPane.getColumnHeader() 总为空?为什么?
    (合成上面的形式,就没有问题了。)
      

  10.   

    就剩下一个 布局 的问题了,帮帮忙吧。问题: 如何把它做成一个构造函数的形式?
    把 JFrame frame 独立出去(我想把它放在 Main函数里 )如何做呀?