JTable如何像excel一样固定行列,不随滚动条移动 如题,效果和excel中的固定行(列),好象也叫冻结功能一样比如要求前两列不随水平滚动条移动,始终显示在初始位置,水平滚动条托动时,从第3列开始可以滚动行也要求一样的效果谁知道请给出关键代码,即刻结贴 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 问题已经解决了,找了点资料,是用两个table做的大家还有什么不同见解吗,一起来讨论讨论吧,100分就这么给系统了有点太浪费了啊 我把代码贴出来给大家共享一下吧,也许有谁用得着的只是还有一点不够完美,大家运行一下看效果,在最下面一行,固定列和非固定列没对齐原因是固定列的footer边框稍大一些造成的,谁能把这个问题解决了也行啊,不想把分就这么扔掉了附代码,jdk1.6下通过public class TestFixTable extends JFrame { private static final long serialVersionUID = 1L; Object[][] data; Object[] column; JTable fixedTable, table; public TestFixTable() { super("Fixed Column Example"); setSize(400, 150); data = new Object[][] { { "1", "11", "A", "", "", "", "", "" }, { "2", "22", "", "B", "", "", "", "" }, { "3", "33", "", "", "C", "", "", "" }, { "4", "44", "", "", "", "D", "", "" }, { "5", "55", "", "", "", "", "E", "" }, { "6", "66", "", "", "", "", "", "F" } }; column = new Object[] { "fixed 1", "o", "a", "b", "c", "d", "e", "f" }; AbstractTableModel fixedModel = new AbstractTableModel() { private static final long serialVersionUID = 1L; public int getColumnCount() { return 1; } public int getRowCount() { return data.length; } public String getColumnName(int col) { return (String) column[col]; } public Object getValueAt(int row, int col) { return data[row][col]; } }; AbstractTableModel model = new AbstractTableModel() { private static final long serialVersionUID = 1L; public int getColumnCount() { return column.length - 2; } public int getRowCount() { return data.length; } public String getColumnName(int col) { return (String) column[col + 1]; } public Object getValueAt(int row, int col) { return data[row][col + 1]; } public void setValueAt(Object obj, int row, int col) { data[row][col + 1] = obj; } public boolean CellEditable(int row, int col) { return true; } }; fixedTable = new JTable(fixedModel); fixedTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); fixedTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); fixedTable.getSelectionModel().addListSelectionListener( new ListSelectionListener() { public void valueChanged(ListSelectionEvent arg0) { checkSelection(true); } }); table = new JTable(model); table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); table.getSelectionModel().addListSelectionListener( new ListSelectionListener() { public void valueChanged(ListSelectionEvent arg0) { checkSelection(false); } }); JViewport viewport = new JViewport(); viewport.setView(fixedTable); viewport.setPreferredSize(fixedTable.getPreferredSize()); JScrollPane scroll = new JScrollPane(table); scroll.setRowHeaderView(viewport); scroll.setCorner(JScrollPane.UPPER_LEFT_CORNER, fixedTable .getTableHeader()); getContentPane().add(scroll, BorderLayout.CENTER); } private void checkSelection(boolean isFixedTable) { int fixedSelectedIndex = fixedTable.getSelectedRow(); int selectedIndex = table.getSelectedRow(); if (fixedSelectedIndex != selectedIndex) { if (isFixedTable) { table.setRowSelectionInterval(fixedSelectedIndex, fixedSelectedIndex); } else { fixedTable .setRowSelectionInterval(selectedIndex, selectedIndex); } } } public static void main(String[] args) { TestFixTable frame = new TestFixTable(); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.setVisible(true); }} 终于有人肯捧场了,感动ing....大家互相学习,交流一下! 固定列是行表头的思想,即将所有行的前几列固定,比较好的做法是采用两个表,与楼主列的资料类似。 public static JScrollPane createAJScrollPane(JTable sideTb,int sideViewWidth,JTable Tb){ JScrollPane result = new JScrollPane(Tb); JViewport dataviewport = new JViewport(); result.getViewport().setBackground(Color.white); result.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); //添加左边表格 dataviewport.setView(sideTb); dataviewport.setBackground(Color.white); dataviewport.setPreferredSize(new Dimension(sideViewWidth, 100)); result.setRowHeader(dataviewport); result.setCorner(JScrollPane.UPPER_LEFT_CORNER, sideTb.getTableHeader()); return result;}固定行是多表头的思想,网上比较多的资料是重写UI的思想,可以搜索GroupableTableHeaderUI,但这种做法存在很多问题,例如导出,或多表头个别数据的修改。前两天看到了利用layout实现的方式,可以看看:http://topic.csdn.net/u/20080218/08/4d73d35f-af01-4914-b3a2-e2e2efb858c6.html ....我要固定行和列......我只能固定行:table.setRowHeight(20);,列我固定不了,求助SOS 多個? : 的嵌套問題 spring注入 jdbcTemplate空指针 final修饰变量n,n有几种赋值方法? 为什么类中声明为protected的构造函数不能被调用? !!!急问linux的jni编程。。。头都大了耶:( 图片显示的相对路径问题! 大家讨论一下客户关系管理软件 菜鸟初学java,关于移位操作老看不明白,请高手帮忙解释一下 50分 求助弱问题-------------------[ 菜鸟的呼声 ] java开发IOS成熟吗? 求助!如何自己执行存储过程代码? javascript里面的变量怎么传到scriptlet里?
大家还有什么不同见解吗,一起来讨论讨论吧,
100分就这么给系统了有点太浪费了啊
只是还有一点不够完美,大家运行一下看效果,在最下面一行,固定列和非固定列没对齐
原因是固定列的footer边框稍大一些造成的,谁能把这个问题解决了也行啊,不想把分就这么扔掉了
附代码,jdk1.6下通过public class TestFixTable extends JFrame {
private static final long serialVersionUID = 1L; Object[][] data; Object[] column; JTable fixedTable, table; public TestFixTable() {
super("Fixed Column Example");
setSize(400, 150); data = new Object[][] { { "1", "11", "A", "", "", "", "", "" },
{ "2", "22", "", "B", "", "", "", "" },
{ "3", "33", "", "", "C", "", "", "" },
{ "4", "44", "", "", "", "D", "", "" },
{ "5", "55", "", "", "", "", "E", "" },
{ "6", "66", "", "", "", "", "", "F" } };
column = new Object[] { "fixed 1", "o", "a", "b", "c", "d", "e", "f" }; AbstractTableModel fixedModel = new AbstractTableModel() {
private static final long serialVersionUID = 1L; public int getColumnCount() {
return 1;
} public int getRowCount() {
return data.length;
} public String getColumnName(int col) {
return (String) column[col];
} public Object getValueAt(int row, int col) {
return data[row][col];
}
};
AbstractTableModel model = new AbstractTableModel() {
private static final long serialVersionUID = 1L; public int getColumnCount() {
return column.length - 2;
} public int getRowCount() {
return data.length;
} public String getColumnName(int col) {
return (String) column[col + 1];
} public Object getValueAt(int row, int col) {
return data[row][col + 1];
} public void setValueAt(Object obj, int row, int col) {
data[row][col + 1] = obj;
} public boolean CellEditable(int row, int col) {
return true;
}
}; fixedTable = new JTable(fixedModel);
fixedTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
fixedTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
fixedTable.getSelectionModel().addListSelectionListener(
new ListSelectionListener() {
public void valueChanged(ListSelectionEvent arg0) {
checkSelection(true); }
}); table = new JTable(model);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table.getSelectionModel().addListSelectionListener(
new ListSelectionListener() {
public void valueChanged(ListSelectionEvent arg0) {
checkSelection(false);
}
}); JViewport viewport = new JViewport();
viewport.setView(fixedTable);
viewport.setPreferredSize(fixedTable.getPreferredSize()); JScrollPane scroll = new JScrollPane(table);
scroll.setRowHeaderView(viewport);
scroll.setCorner(JScrollPane.UPPER_LEFT_CORNER, fixedTable
.getTableHeader()); getContentPane().add(scroll, BorderLayout.CENTER);
} private void checkSelection(boolean isFixedTable) {
int fixedSelectedIndex = fixedTable.getSelectedRow();
int selectedIndex = table.getSelectedRow();
if (fixedSelectedIndex != selectedIndex) {
if (isFixedTable) {
table.setRowSelectionInterval(fixedSelectedIndex,
fixedSelectedIndex);
} else {
fixedTable
.setRowSelectionInterval(selectedIndex, selectedIndex);
}
} } public static void main(String[] args) {
TestFixTable frame = new TestFixTable();
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frame.setVisible(true);
}
}
public static JScrollPane createAJScrollPane(JTable sideTb,int sideViewWidth,JTable Tb){
JScrollPane result = new JScrollPane(Tb); JViewport dataviewport = new JViewport(); result.getViewport().setBackground(Color.white);
result.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); //添加左边表格
dataviewport.setView(sideTb);
dataviewport.setBackground(Color.white);
dataviewport.setPreferredSize(new Dimension(sideViewWidth, 100));
result.setRowHeader(dataviewport);
result.setCorner(JScrollPane.UPPER_LEFT_CORNER, sideTb.getTableHeader()); return result;
}
固定行是多表头的思想,网上比较多的资料是重写UI的思想,可以搜索GroupableTableHeaderUI,但这种做法存在很多问题,例如导出,或多表头个别数据的修改。前两天看到了利用layout实现的方式,可以看看:http://topic.csdn.net/u/20080218/08/4d73d35f-af01-4914-b3a2-e2e2efb858c6.html