JTable如何像excel一样固定行列,不随滚动条移动

olivesoup 2008-02-19 03:29:33
如题,效果和excel中的固定行(列),好象也叫冻结功能一样
比如要求前两列不随水平滚动条移动,始终显示在初始位置,水平滚动条托动时,
从第3列开始可以滚动

行也要求一样的效果

谁知道请给出关键代码,即刻结贴
...全文
1210 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
RXPY2007 2008-02-29
  • 打赏
  • 举报
回复
....我要固定行和列......我只能固定行:table.setRowHeight(20);,列我固定不了,求助SOS
约翰羊 2008-02-21
  • 打赏
  • 举报
回复
收藏
wdy9927 2008-02-20
  • 打赏
  • 举报
回复
挺好的想法.

学习了.



shengli_liao 2008-02-20
  • 打赏
  • 举报
回复
固定列是行表头的思想,即将所有行的前几列固定,比较好的做法是采用两个表,与楼主列的资料类似。
    
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
olivesoup 2008-02-19
  • 打赏
  • 举报
回复
这个只做了列固定,今天没时间了,就先做这些,大家可以研究研究行固定是不是也可行
谁来把行固定补充上也行,这样就完整了,大家都可以收藏一下,呵呵
dong5945 2008-02-19
  • 打赏
  • 举报
回复
谢谢分享
又长见识了...
olivesoup 2008-02-19
  • 打赏
  • 举报
回复
终于有人肯捧场了,感动ing....

大家互相学习,交流一下!
olivesoup 2008-02-19
  • 打赏
  • 举报
回复
我把代码贴出来给大家共享一下吧,也许有谁用得着的
只是还有一点不够完美,大家运行一下看效果,在最下面一行,固定列和非固定列没对齐
原因是固定列的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);
}
}
heting1024 2008-02-19
  • 打赏
  • 举报
回复
讲讲你怎么解决的吧,分享下方法
olivesoup 2008-02-19
  • 打赏
  • 举报
回复
问题已经解决了,找了点资料,是用两个table做的
大家还有什么不同见解吗,一起来讨论讨论吧,
100分就这么给系统了有点太浪费了啊
sunwei_07 2008-02-19
  • 打赏
  • 举报
回复
实在不懂,帮老兄顶,忘高手解答
紫竹呢?
olivesoup 2008-02-19
  • 打赏
  • 举报
回复
是不是问题太难了啊?
进来看了几次,都是我在自言自语
olivesoup 2008-02-19
  • 打赏
  • 举报
回复
急急如律令!

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧