方法一(很簡單,也很笨的方法,缺點,只能顯示多列,但不能顯示多行)
效果圖:
代碼:
import java.awt.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
public class MutilHeadTable extends JTable {
public MutilHeadTable(TableModel tm) {
super(tm);
init();
}
private void init(){
//爲每個列添加自定義的RENDER.這個Api設計比較麻煩.
CustomizedHeaderRender r = new CustomizedHeaderRender();
for (int i=0; i< getModel().getColumnCount(); i++) {
TableColumn column = getColumnModel().getColumn(i);
column.setHeaderRenderer(new CustomizedHeaderRender());
}
}
//一個自己定義的頭部渲染器.可以根據自己的需要來返回不同的組件顯示內容.
private class CustomizedHeaderRender extends DefaultTableCellRenderer{
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
if(value!=null && value instanceof String){
StringTokenizer t = new StringTokenizer((String)value,"/");
StringBuffer bf = new StringBuffer();
bf.append("<html>");
while (t.hasMoreElements()){
bf.append(t.nextElement());
if(t.hasMoreElements())
bf.append("<br/>");
else
bf.append("</html>");
}
JLabel jl =new JLabel(bf.toString());
jl.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
return jl;
}
return this;
}
}
public static void main(String[] args) {
JFrame frame = new JFrame("Leaders");
Container contentPane = frame.getContentPane();
String headers[] = {"Line1/line2/line3", "Country"};
String data[][] = {
{"Tony Blair", "England"},
{"Thabo Mbeki", "South Africa"},
};
TableModel model = new DefaultTableModel(data, headers);
MutilHeadTable table = new MutilHeadTable(model);
JScrollPane scrollPane = new JScrollPane(table);
contentPane.add(scrollPane, BorderLayout.CENTER);
frame.setSize(300, 100);
frame.setVisible(true);
}
}
方法二(比較複雜,重寫了很多東西,看起來滿眩的,但有致命缺點,列不能改變寬度)
效果圖:
代碼:
import java.awt.*;
import java.util.HashMap;
import javax.swing.*;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumnModel;
public class T {
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}
JTable table = new JTable(20, 4) {
@Override
protected JTableHeader createDefaultTableHeader() {
Header header = new Header(20);
header.add(new HeaderCellLabel("abc", 0, 0, 1, 1), new HeaderCellConstraints(0, 0));
header.add(new HeaderCellLabel("ss", 0, 0, 1, 1), new HeaderCellConstraints(1, 0));
header.add(new HeaderCellLabel("s", 0, 0, 1, 1), new HeaderCellConstraints(2, 0));
header.add(new HeaderCellLabel("dhc", 0, 0, 1, 1), new HeaderCellConstraints(3, 0));
header.add(new HeaderCellLabel("aaaabbbb", 0, 0, 1, 1), new HeaderCellConstraints(0, 1, 3));
header.add(new HeaderCellLabel("abc", 0, 0, 1, 1), new HeaderCellConstraints(0, 2, 1, 2));
header.add(new HeaderCellLabel("ss", 0, 0, 1, 1), new HeaderCellConstraints(1, 2));
header.add(new HeaderCellLabel("ss", 0, 0, 1, 1), new HeaderCellConstraints(1, 3));
header.add(new HeaderCellLabel("s", 0, 0, 1, 1), new HeaderCellConstraints(2, 2));
header.add(new HeaderCellLabel("s", 0, 0, 1, 1), new HeaderCellConstraints(2, 3));
header.add(new HeaderCellLabel("<html>ss<p>nn<p>b</html>", 0, 0, 1, 1), new HeaderCellConstraints(3, 1, 1, 3));
return header;
}
};
JScrollPane sp = new JScrollPane(table);
JPanel p = new JPanel(new BorderLayout());
p.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
p.add(sp);
JFrame f = new JFrame();
f.getContentPane().add(p, BorderLayout.CENTER);
f.pack();
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
class Header extends JTableHeader {
private int rowHeight = 20;
public Header(int rowHeight) {
setLayout(new HeaderLayout());
this.rowHeight = rowHeight;
}
@Override
public Dimension getPreferredSize() {
Dimension d = super.getPreferredSize();
HeaderLayout layout = (HeaderLayout) getLayout();
d.height = layout.getRowCount() * rowHeight;
return d;
}
}
class HeaderCellLabel extends JLabel {
public HeaderCellLabel(Icon icon, int top, int left, int bottom, int right) {
this("", icon, top, left, bottom, right);
}
public HeaderCellLabel(String text, Icon icon, int top, int left, int bottom, int right) {
super(text, icon, JLabel.CENTER);
setBorder(BorderFactory.createMatteBorder(top, left, bottom, right, Color.gray));
}
public HeaderCellLabel(String text, int top, int left, int bottom, int right) {
this(text, null, top, left, bottom, right);
}
}
class HeaderCellConstraints {
public final int x;
public final int y;
public final int colSpan;
public final int rowSpan;
public HeaderCellConstraints(final int x, final int y, final int colSpan, final int rowSpan) {
this.x = x;
this.y = y;
this.colSpan = colSpan;
this.rowSpan = rowSpan;
}
public HeaderCellConstraints(final int x, final int y, final int colSpan) {
this(x, y, colSpan, 1);
}
public HeaderCellConstraints(final int x, final int y) {
this(x, y, 1, 1);
}
}
class HeaderLayout implements LayoutManager2 {
private HashMap<Component, HeaderCellConstraints> compCellMap =
new HashMap<Component, HeaderCellConstraints>();
private int rowCount = 0;
public void addLayoutComponent(Component comp, Object constraints) {
if (constraints == null || !(constraints instanceof HeaderCellConstraints)) {
return;
}
HeaderCellConstraints cell = (HeaderCellConstraints) constraints;
compCellMap.put(comp, cell);
rowCount = Math.max(rowCount, cell.y + cell.rowSpan);
}
public int getRowCount() {
return rowCount;
}
public float getLayoutAlignmentX(Container target) {
return 0;
}
public float getLayoutAlignmentY(Container target) {
return 0;
}
public void invalidateLayout(Container target) {
}
public Dimension maximumLayoutSize(Container target) {
return preferredLayoutSize(target);
}
public void addLayoutComponent(String name, Component comp) {
throw new IllegalArgumentException();
}
public void layoutContainer(Container parent) {
JTableHeader header = (JTableHeader) parent;
JTable table = header.getTable();
TableColumnModel columnModel = table.getColumnModel();
int rowHeight = header.getHeight() / rowCount;
Component[] cellComps = parent.getComponents();
for (Component cellComp : cellComps) {
HeaderCellConstraints cell = compCellMap.get(cellComp);
if (cell == null) {
continue;
}
int cellX = 0;
for (int i = 0; i < cell.x; i++) {
cellX += columnModel.getColumn(i).getWidth();
}
int cellWid = 0;
for (int i = 0; i < cell.colSpan; i++) {
cellWid += columnModel.getColumn(cell.x + i).getWidth();
}
int cellY = rowHeight * cell.y;
int cellHei = rowHeight * cell.rowSpan;
cellComp.setBounds(cellX, cellY, cellWid, cellHei);
}
}
public Dimension minimumLayoutSize(Container parent) {
return preferredLayoutSize(parent);
}
public Dimension preferredLayoutSize(Container parent) {
return new Dimension(1,1);
}
public void removeLayoutComponent(Component comp) {
compCellMap.remove(comp);
rowCount = 0;
for (HeaderCellConstraints cell : compCellMap.values()) {
rowCount = Math.max(rowCount, cell.y + cell.rowSpan);
}
}
}