多行標題的jTable

方法一(很簡單,也很笨的方法,缺點,只能顯示多列,但不能顯示多行)

效果圖:

 

代碼:

 

package com.zami.wms.main.test;

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(
300100);
        frame.setVisible(
true);
    }
    
    
}

 

 方法二(比較複雜,重寫了很多東西,看起來滿眩的,但有致命缺點,列不能改變寬度)

 效果圖:

代碼:

 

package com.zami.wms.main.test;
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(204) {
            @Override
                    
protected JTableHeader createDefaultTableHeader() {
                Header header 
= new Header(20);
                header.add(
new HeaderCellLabel("abc"0011), new HeaderCellConstraints(00));
                header.add(
new HeaderCellLabel("ss"0011), new HeaderCellConstraints(10));
                header.add(
new HeaderCellLabel("s"0011), new HeaderCellConstraints(20));
                header.add(
new HeaderCellLabel("dhc"0011), new HeaderCellConstraints(30));
                header.add(
new HeaderCellLabel("aaaabbbb"0011), new HeaderCellConstraints(013));
                header.add(
new HeaderCellLabel("abc"0011), new HeaderCellConstraints(0212));
                header.add(
new HeaderCellLabel("ss"0011), new HeaderCellConstraints(12));
                header.add(
new HeaderCellLabel("ss"0011), new HeaderCellConstraints(13));
                header.add(
new HeaderCellLabel("s"0011), new HeaderCellConstraints(22));
                header.add(
new HeaderCellLabel("s"0011), new HeaderCellConstraints(23));
                header.add(
new HeaderCellLabel("<html>ss<p>nn<p>b</html>"0011), new HeaderCellConstraints(3113));
                
                
return header;
            }
        };
        JScrollPane sp 
= new JScrollPane(table);
        JPanel p 
= new JPanel(new BorderLayout());
        p.setBorder(BorderFactory.createEmptyBorder(
10101010));
        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, 11);
    }
}

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);
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章