java jtable行标题_java – JTable多个标题行

我们在上一个项目中也有同样的要求.我所发现的是一个

GroupableTableHeader on java2s.com的一个实现.但是,我已经把它弄了一些,虽然我不记得究竟是什么.下面是我们如何使用这三个类的实现.

ColumnGroup.java

import java.awt.Component;

import java.awt.Dimension;

import java.util.ArrayList;

import java.util.Collections;

import java.util.List;

import javax.swing.JTable;

import javax.swing.table.TableCellRenderer;

import javax.swing.table.TableColumn;

/**

* ColumnGroup

*

* @version 1.0 20.10.1998

* @author Nobuo Tamemasa

*/

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

import java.util.ArrayList;

import java.util.Collections;

import java.util.List;

import javax.swing.table.JTableHeader;

import javax.swing.table.TableColumn;

import javax.swing.table.TableColumnModel;

/**

* GroupableTableHeader

*

* @version 1.0 20.10.1998

* @author Nobuo Tamemasa

*/

@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

import java.awt.Component;

import java.awt.Dimension;

import java.awt.Graphics;

import java.awt.Rectangle;

import java.util.Enumeration;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import javax.swing.JComponent;

import javax.swing.UIManager;

import javax.swing.plaf.basic.BasicTableHeaderUI;

import javax.swing.table.TableCellRenderer;

import javax.swing.table.TableColumn;

import javax.swing.table.TableColumnModel;

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

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Java JTable 的选中事件中弹出一个是或者否的提示框,你可以使用 JOptionPane 类的 showConfirmDialog() 方法。这个方法可以创建一个包含是、否和取消按钮的对话框,并返回用户选择的按钮。 以下是一个示例代码,演示如何在 JTable 的选中事件中弹出一个是或者否的提示框: ```java JTable table = new JTable(); ListSelectionModel selectionModel = table.getSelectionModel(); selectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); selectionModel.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { if (!e.getValueIsAdjusting()) { int selectedRow = table.getSelectedRow(); if (selectedRow != -1) { int choice = JOptionPane.showConfirmDialog(null, "你确定要删除这一吗?", "确认删除", JOptionPane.YES_NO_OPTION); if (choice == JOptionPane.YES_OPTION) { // 在这里添加删除的代码 } } } } }); ``` 在这个示例中,我们首先使用 JOptionPane.showConfirmDialog() 方法创建了一个包含是、否按钮的对话框,并向用户询问是否要删除选中的。这个方法的第一个参数是对话框的父组件,我们在这里传入 null,表示对话框没有父组件。第二个参数是要显示的消息文本,第三个参数是对话框的标题,第四个参数是按钮的类型,这里我们选择了 YES_NO_OPTION,表示显示是、否按钮。 当用户选择了是或者否按钮后,这个方法会返回用户的选择。如果用户选择了是按钮,我们就可以在选中事件中添加删除选中的代码。如果用户选择了否按钮或者关闭了对话框,删除操作就不会执

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值