java swing table标题,java – 如何在swing中的jtable中组合两个列标题

所以你想要多标题行jtable.您必须对标题进行分组.

GroupableHeaderExample.java

public class GroupableHeaderExample extends JFrame {

GroupableHeaderExample() {

super( "Groupable Header Example" );

DefaultTableModel dm = new DefaultTableModel();

dm.setDataVector(new Object[][]{

{"119","foo","bar","ja","ko","zh"},

{"911","bar","foo","en","fr","pt"}},

new Object[]{"SNo.","1","2","Native","2","3"});

JTable table = new JTable( dm ) {

protected JTableHeader createDefaultTableHeader() {

return new GroupableTableHeader(columnModel);

}

};

TableColumnModel cm = table.getColumnModel();

ColumnGroup g_name = new ColumnGroup("Name");

g_name.add(cm.getColumn(1));

g_name.add(cm.getColumn(2));

ColumnGroup g_lang = new ColumnGroup("Language");

g_lang.add(cm.getColumn(3));

ColumnGroup g_other = new ColumnGroup("Others");

g_other.add(cm.getColumn(4));

g_other.add(cm.getColumn(5));

g_lang.add(g_other);

GroupableTableHeader header = (GroupableTableHeader)table.getTableHeader();

header.addColumnGroup(g_name);

header.addColumnGroup(g_lang);

JScrollPane scroll = new JScrollPane( table );

getContentPane().add( scroll );

setSize( 400, 120 );

}

public static void main(String[] args) {

GroupableHeaderExample frame = new GroupableHeaderExample();

frame.addWindowListener( new WindowAdapter() {

public void windowClosing( WindowEvent e ) {

System.exit(0);

}

});

frame.setVisible(true);

}

}

ColumnGroup.java

public class ColumnGroup {

protected TableCellRenderer renderer;

protected List columns;

protected List groups;

protected String text;

protected int margin = 0;

public ColumnGroup(String text) {

this(text, null);

}

public ColumnGroup(String text, TableCellRenderer renderer) {

this.text = text;

this.renderer = renderer;

this.columns = new ArrayList();

this.groups = new ArrayList();

}

public void add(TableColumn column) {

columns.add(column);

}

public void add(ColumnGroup group) {

groups.add(group);

}

/**

* @param column

* TableColumn

*/

public List getColumnGroups(TableColumn column) {

if (!contains(column)) {

return Collections.emptyList();

}

List result = new ArrayList();

result.add(this);

if (columns.contains(column)) {

return result;

}

for (ColumnGroup columnGroup : groups) {

result.addAll(columnGroup.getColumnGroups(column));

}

return result;

}

private boolean contains(TableColumn column) {

if (columns.contains(column)) {

return true;

}

for (ColumnGroup group : groups) {

if (group.contains(column)) {

return true;

}

}

return false;

}

public TableCellRenderer getHeaderRenderer() {

return renderer;

}

public void setHeaderRenderer(TableCellRenderer renderer) {

this.renderer = renderer;

}

public String getHeaderValue() {

return text;

}

public Dimension getSize(JTable table) {

TableCellRenderer renderer = this.renderer;

if (renderer == null) {

renderer = table.getTableHeader().getDefaultRenderer();

}

Component comp = renderer.getTableCellRendererComponent(table, getHeaderValue() == null || getHeaderValue().trim().isEmpty() ? " "

: getHeaderValue(), false, false, -1, -1);

int height = comp.getPreferredSize().height;

int width = 0;

for (ColumnGroup columnGroup : groups) {

width += columnGroup.getSize(table).width;

}

for (TableColumn tableColumn : columns) {

width += tableColumn.getWidth();

width += margin;

}

return new Dimension(width, height);

}

public void setColumnMargin(int margin) {

this.margin = margin;

for (ColumnGroup columnGroup : groups) {

columnGroup.setColumnMargin(margin);

}

}

}

GroupableTableHeader.java

@SuppressWarnings("serial")

public class GroupableTableHeader extends JTableHeader {

@SuppressWarnings("unused")

private static final String uiClassID = "GroupableTableHeaderUI";

protected List columnGroups = new ArrayList();

public GroupableTableHeader(TableColumnModel model) {

super(model);

setUI(new GroupableTableHeaderUI());

setReorderingAllowed(false);

// setDefaultRenderer(new MultiLineHeaderRenderer());

}

@Override

public void updateUI() {

setUI(new GroupableTableHeaderUI());

}

@Override

public void setReorderingAllowed(boolean b) {

super.setReorderingAllowed(false);

}

public void addColumnGroup(ColumnGroup g) {

columnGroups.add(g);

}

public List getColumnGroups(TableColumn col) {

for (ColumnGroup group : columnGroups) {

List groups = group.getColumnGroups(col);

if (!groups.isEmpty()) {

return groups;

}

}

return Collections.emptyList();

}

public void setColumnMargin() {

int columnMargin = getColumnModel().getColumnMargin();

for (ColumnGroup group : columnGroups) {

group.setColumnMargin(columnMargin);

}

}

}

GroupableTableHeaderUI.java

public class GroupableTableHeaderUI extends BasicTableHeaderUI {

protected GroupableTableHeader getHeader() {

return (GroupableTableHeader) header;

}

@Override

public void paint(Graphics g, JComponent c) {

Rectangle clipBounds = g.getClipBounds();

if (header.getColumnModel().getColumnCount() == 0) {

return;

}

int column = 0;

Dimension size = header.getSize();

Rectangle cellRect = new Rectangle(0, 0, size.width, size.height);

Map groupSizeMap = new HashMap();

for (Enumeration enumeration = header.getColumnModel().getColumns(); enumeration.hasMoreElements();) {

cellRect.height = size.height;

cellRect.y = 0;

TableColumn aColumn = enumeration.nextElement();

List groups = getHeader().getColumnGroups(aColumn);

int groupHeight = 0;

for (ColumnGroup group : groups) {

Rectangle groupRect = groupSizeMap.get(group);

if (groupRect == null) {

groupRect = new Rectangle(cellRect);

Dimension d = group.getSize(header.getTable());

groupRect.width = d.width;

groupRect.height = d.height;

groupSizeMap.put(group, groupRect);

}

paintCell(g, groupRect, group);

groupHeight += groupRect.height;

cellRect.height = size.height - groupHeight;

cellRect.y = groupHeight;

}

cellRect.width = aColumn.getWidth();

if (cellRect.intersects(clipBounds)) {

paintCell(g, cellRect, column);

}

cellRect.x += cellRect.width;

column++;

}

}

private void paintCell(Graphics g, Rectangle cellRect, int columnIndex) {

TableColumn aColumn = header.getColumnModel().getColumn(columnIndex);

TableCellRenderer renderer = aColumn.getHeaderRenderer();

if (renderer == null) {

renderer = getHeader().getDefaultRenderer();

}

Component c = renderer.getTableCellRendererComponent(header.getTable(), aColumn.getHeaderValue(), false, false,

-1, columnIndex);

c.setBackground(UIManager.getColor("control"));

rendererPane.paintComponent(g, c, header, cellRect.x, cellRect.y, cellRect.width, cellRect.height, true);

}

private void paintCell(Graphics g, Rectangle cellRect, ColumnGroup cGroup) {

TableCellRenderer renderer = cGroup.getHeaderRenderer();

if (renderer == null) {

renderer = getHeader().getDefaultRenderer();

}

Component component = renderer.getTableCellRendererComponent(header.getTable(), cGroup.getHeaderValue(), false,

false, -1, -1);

rendererPane

.paintComponent(g, component, header, cellRect.x, cellRect.y, cellRect.width, cellRect.height, true);

}

private int getHeaderHeight() {

int headerHeight = 0;

TableColumnModel columnModel = header.getColumnModel();

for (int column = 0; column < columnModel.getColumnCount(); column++) {

TableColumn aColumn = columnModel.getColumn(column);

TableCellRenderer renderer = aColumn.getHeaderRenderer();

if (renderer == null) {

renderer = getHeader().getDefaultRenderer();

}

Component comp = renderer.getTableCellRendererComponent(header.getTable(), aColumn.getHeaderValue(), false,

false, -1, column);

int cHeight = comp.getPreferredSize().height;

List groups = getHeader().getColumnGroups(aColumn);

for (ColumnGroup group : groups) {

cHeight += group.getSize(header.getTable()).height;

}

headerHeight = Math.max(headerHeight, cHeight);

}

return headerHeight;

}

@Override

public Dimension getPreferredSize(JComponent c) {

int width = 0;

for (Enumeration enumeration = header.getColumnModel().getColumns(); enumeration.hasMoreElements();) {

TableColumn aColumn = enumeration.nextElement();

width += aColumn.getPreferredWidth();

}

return createHeaderSize(width);

}

private Dimension createHeaderSize(int width) {

TableColumnModel columnModel = header.getColumnModel();

width += columnModel.getColumnMargin() * columnModel.getColumnCount();

if (width > Integer.MAX_VALUE) {

width = Integer.MAX_VALUE;

}

return new Dimension(width, getHeaderHeight());

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值