为JTable加上行头(下)

把上次没有写完的方法补全一下(上一篇 http://daimojingdeyu.iteye.com/blog/417915),先来看一下JScrollPane的结构
为JTable加上行头(下)
只要在JScrollPane的rowheader位置增加一下可以作为表头的组件就可以了,这里我们选择JTable,也就是说这个关键就是用一个table来作为另一个table的行头。
上图的左上角,即JScrollPane的rowheader和columnheader的交界处,为一个corn组件,选用一个JLabel来填充。代码如下:
import java.awt.Color;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JViewport;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;


public class TableWithRowHeader2 {

	public static void main(String[] args) {
		final JFrame f = new JFrame("有行头的表格2");
		String[][] tableData = {
				{"90" , "89" , "67" , "88"},
				{"80" , "99" , "77" , "58"},
				{"80" , "99" , "77" , "58"}
		};
		String[] columnNames = {"数学", "语文", "英语", "化学"};
		String[] rowNames = {"张三", "李四", "王二"};
		String tableCorn = "姓名\\课程";
		
		JTable table = new JTable(tableData, columnNames);
		
		JScrollPane scrollPane = new JScrollPane(table);
		
		// 设置表格的行头和行列交界处的边角的显示
		scrollPane.setRowHeader(createRowHeader(rowNames));
		JLabel corner = new JLabel(tableCorn);
		corner.setBackground((Color) UIManager.get("TableHeader.background"));
		scrollPane.setCorner(JScrollPane.UPPER_LEFT_CORNER, corner);
		
		f.add(scrollPane);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.pack();
		SwingUtilities.invokeLater(new Runnable()
		{

			@Override
			public void run() {
				f.setVisible(true);
			}
			
		});
	}

	/**
	 * 获取到一个使用表格加入到ScrollPane的rowheader,使其作为表的行头
	 * @param rowNames
	 * @return
	 */
	private static JViewport createRowHeader(String[] rowNames) {
		String[][] data = new String[rowNames.length][1];
		for (int i = 0; i < rowNames.length; i++) {
			data[i][0] = rowNames[i];
		}
		//列头随便取一个,在JViewport里是不能显示的
		JTable table = new JTable(data, new String[]{"aa"});
		table.setEnabled(false);
		table.setBackground((Color) UIManager.get("TableHeader.background"));
		JViewport view = new JViewport();
		view.setView(table);
		view.setPreferredSize(new Dimension(60,54));
		return view;
	}
}


效果图可以参考 http://daimojingdeyu.iteye.com/blog/417915

思路应该就这2种吧(1、行头和数据混合。2、使用JScrollPane分离显示),其他的暂时没见到过。

你可能感兴趣的:(数据结构,swing,F#,Blog)