本文介绍了JTable冻结列对齐问题(Java 1.6)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我已经实现了JTable的冻结列,当使用垂直滚动条滚动大型数据集时,冻结表中的列与主表不对齐.请帮忙
I have implemented JTable frozen columns as below.When scrolling on a large dataset using vertical scrollbar, the columns in the frozen table are not aligned with the main table.Please help
JTable table,fixedTable
JScrollPane _scrl_table;
table = new JTable();
table.setName("MAIN_TABLE");
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.setVisibleRowCount(8);
fixedTable = new JTable();
fixedTable.setName("FIXED_TABLE");
fixedTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
fixedTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
_scrl_table = new JScrollPane(table,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
fixedTable.setPreferredScrollableViewportSize(fixedTable.getPreferredSize());
_scrl_table.setRowHeaderView( fixedTable );
_scrl_table.setCorner(JScrollPane.UPPER_LEFT_CORNER, fixedTable.getTableHeader());
推荐答案
-
也许没有理由使用两个
JTables
使用正确的 camickr的RowNumberTable 或 RowHeader
您可以共享
AdjustmentListener
,无论是否包含BoundedRangeModel
you can to share
AdjustmentListener
, with or withoutBoundedRangeModel
示例滚动水平方向,必须更改为垂直
example scrolling horizontal directions, have to change to the vertical
import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.table.*; public class FixedRowExample extends JFrame { private static final long serialVersionUID = 1L; private Object[][] data; private Object[] column; private JTable fixedTable, table; private int FIXED_NUM = 2; public FixedRowExample() { super("Fixed Row Example"); data = new Object[][]{ {"a", "", "", "", "", ""}, {"", "b", "", "", "", ""}, {"", "", "c", "", "", ""}, {"", "", "", "d", "", ""}, {"", "", "", "", "e", ""}, {"", "", "", "", "", "f"}, {"fixed1", "", "", "", "", "", "", ""}, {"fixed2", "", "", "", "", "", "", ""}}; column = new Object[]{"A", "B", "C", "D", "E", "F"}; AbstractTableModel model = new AbstractTableModel() { private static final long serialVersionUID = 1L; @Override public int getColumnCount() { return column.length; } @Override public int getRowCount() { return data.length - FIXED_NUM; } @Override public String getColumnName(int col) { return (String) column[col]; } @Override public Object getValueAt(int row, int col) { return data[row][col]; } @Override public void setValueAt(Object obj, int row, int col) { data[row][col] = obj; } public boolean CellEditable(int row, int col) { return true; } }; AbstractTableModel fixedModel = new AbstractTableModel() { private static final long serialVersionUID = 1L; @Override public int getColumnCount() { return column.length; } @Override public int getRowCount() { return FIXED_NUM; } @Override public Object getValueAt(int row, int col) { return data[row + (data.length - FIXED_NUM)][col]; } }; table = new JTable(model); table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); fixedTable = new JTable(fixedModel); fixedTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); fixedTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); JScrollPane scroll = new JScrollPane(table); scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); JScrollPane fixedScroll = new JScrollPane(fixedTable) { private static final long serialVersionUID = 1L; @Override public void setColumnHeaderView(Component view) { } // work around }; // fixedScroll.setColumnHeader(null); fixedScroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); JScrollBar bar = fixedScroll.getVerticalScrollBar(); JScrollBar dummyBar = new JScrollBar() { private static final long serialVersionUID = 1L; @Override public void paint(Graphics g) { } }; dummyBar.setPreferredSize(bar.getPreferredSize()); fixedScroll.setVerticalScrollBar(dummyBar); final JScrollBar bar1 = scroll.getHorizontalScrollBar(); JScrollBar bar2 = fixedScroll.getHorizontalScrollBar(); bar2.addAdjustmentListener(new AdjustmentListener() { @Override public void adjustmentValueChanged(AdjustmentEvent e) { bar1.setValue(e.getValue()); } }); scroll.setPreferredSize(new Dimension(400, 100)); fixedScroll.setPreferredSize(new Dimension(400, 52)); getContentPane().add(scroll, BorderLayout.CENTER); getContentPane().add(fixedScroll, BorderLayout.SOUTH); } public static void main(String[] args) { FixedRowExample frame = new FixedRowExample(); frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.pack(); frame.setVisible(true); } }
这篇关于JTable冻结列对齐问题(Java 1.6)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!