JTable 表头 合并

ilovesnow 2009-10-23 04:00:15
`请问 JTable 能否简单实现下面的功能?
表头合并? 如1-4列为一组,5-8列为一组?(表头)


-----------------------------------------------------------
|No. | String1 | String2 |
-----------------------------------------------------------
| |   |   |   |   | |   |   | |
| |   |   |   |   | |   |   | |
| |   |   |   |   | |   |   | |
| |   |   |   |   | |   |   | |
-----------------------------------------------------------
...全文
645 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
jtlaaa 2012-05-31
  • 打赏
  • 举报
回复
谢谢7楼!
jtlaaa 2012-05-31
  • 打赏
  • 举报
回复
谢谢!
ilovesnow 2009-11-09
  • 打赏
  • 举报
回复
望帮忙。
ilovesnow 2009-11-03
  • 打赏
  • 举报
回复
望帮忙。
not_bad_boy2000 2009-11-02
  • 打赏
  • 举报
回复
解决了吗?
ilovesnow 2009-11-02
  • 打赏
  • 举报
回复
还没有。
望帮忙。
ilovesnow 2009-10-30
  • 打赏
  • 举报
回复
UP,
帮帮忙吧
ilovesnow 2009-10-29
  • 打赏
  • 举报
回复
UP,
帮帮忙吧。
zl3450341 2009-10-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ilovesnow 的回复:]
可以实现了。代码如下。

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);
}
}


[/Quote]

这个可以了 刚运行了下

学习了
zl3450341 2009-10-28
  • 打赏
  • 举报
回复
路过

顶顶
ilovesnow 2009-10-28
  • 打赏
  • 举报
回复
UP 有人帮忙看看吗? 上面的代码调试完毕,可以执行。

就剩下一个 布局 的问题了,帮帮忙吧。

问题: 如何把它做成一个构造函数的形式?
我试了一下,独立(做成一个构造函数的形式)后,scrollPane.getColumnHeader() 总为空?为什么?
(合成上面的形式,就没有问题了。)
not_bad_boy2000 2009-10-28
  • 打赏
  • 举报
回复
帮你顶
ilovesnow 2009-10-28
  • 打赏
  • 举报
回复
就剩下一个 布局 的问题了,帮帮忙吧。

问题: 如何把它做成一个构造函数的形式?
把 JFrame frame 独立出去(我想把它放在 Main函数里 )

如何做呀?
ilovesnow 2009-10-26
  • 打赏
  • 举报
回复
可是还有一个疑问,如何把它做成一个构造函数的形式?
在主程序中,用如下的方法调用? 请大家帮忙。谢谢

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);
}
ilovesnow 2009-10-26
  • 打赏
  • 举报
回复

可是还有一个疑问,如何把它做成一个构造函数的形式?
在主程序中,用如下的方法调用? 请大家帮忙。谢谢

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);
ilovesnow 2009-10-26
  • 打赏
  • 举报
回复
可以实现了。代码如下。

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);
}
}

一洽客服系统 2009-10-23
  • 打赏
  • 举报
回复
没有简单的方法 只能重写header的render类
ilovesnow 2009-10-23
  • 打赏
  • 举报
回复
我试了一下,不行啊,运行出错了。

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
youjianbo_han_87 2009-10-23
  • 打赏
  • 举报
回复
哈哈,楼上竟然比我快一步,其实 Google就可以啦。
youjianbo_han_87 2009-10-23
  • 打赏
  • 举报
回复
Jtable合并??????????

http://blog.csdn.net/bradwoo8621/archive/2007/03/26/1541835.aspx

这里有个完整的例子。

加载更多回复(2)

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧