Re: Code Included: Freeze column
I have modified the code at the below link. Everything seems to work
except horizontal scrolling across the two tables:
http://www.java2s.com/Code/Java/Swing-Components/FixedTableColumnExample.htm.
Again, at run-time (via the routine attached to the timer) the project
will add different data to the bottom of each table. The bottom row is
highlighted in each table. The frozen columns are doing what they're
suppose to.
But, when I use the scrollbar on the right table, the left table does
not move.
Here is a non-compilable summary of the resulting code. (The timer
class is not there) Can you get the left table to match the scrolling
on the right table?
Thanks
package test;
class Test extends JFrame{
public static FixedModel fixedModel;//FixedModel extends
AbstractTableModel see below
public static ModelWithScrollbar mainModel;//ModelWithScrollbar
extends AbstractTableModel see below
public static JTable fixedTable; //Has the frozen columns
public static JTable scrollTable; //Has a visible scrollbar
public Test ()[
t.startTimer();
this.setVisible(true);
this.setTitle ("An example");
fixedModel = new FixedModel ();
fixedTable = new JTable (fixedModel){
@Override
public void valueChanged(ListSelectionEvent e){
super.valueChanged(e);
checkSelection(true);
}
};
mainModel = new ModelWithScrollbar();
scrollTable = new JTable (mainModel){
@Override
public void valueChanged(ListSelectionEvent e){
super.valueChanged(e);
checkSelection(false);
}
};
Dimension dimensin = new Dimensin(0,0);
fixedTable.getTableHeader().setPreferredSize(dimension);
scrollTable.getTableHeader().setPreferredSize(dimension);
fixedTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
scrollTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
fixedTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
scrollTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
scrollTable.setFocusable(false);
JScrollPane jScrollPane1 = new JScrollPane(scrollTable);
JViewport viewport = new JViewport();
viewport.setView(fixedTable);
viewport.setPreferredSize(fixedTable,getPreferredSize());
jScrollPane1.setRowHeaderView(viewport);
jScrollPane1.setCorner(JScrollPane.UPPER_LEFT_CORNER,fixedTable.getTableHeader());
getContentPane().add(jScrollPane1,BorderLayout.CENTER);
}
//Indirectly called via Timer t
public static void add_Rows_To_Tables (){
String[] tmp1 = new String [3];
String[] tmp2 = new String [90];
//...
fixedModel.addRow(Arrays.asList(tmp1));
mainModel.addRow(Arrays.asList(tmp2));
fixedTable.getSelectionMode().setSelectionInterval(
fixedTable.getRowCount () - 1,
fixedTable.getRowCount () - 1);
scrollTable.getSelectionMode().setSelectionInterval(
scrollTable.getRowCount () - 1,
scrollTable.getRowCount () - 1);
fixedTable.scrollRectToVisible(
new Rectangle (
fixedTable.getCellRect(
fixedTable.getRowCount() - 1,
0,
true)));
scrollTable.scrollRectToVisible(
new Rectangle (
scrollTable.getCellRect(
scrollTable.getRowCount() - 1,
0,
true)));
}
private void checkSelection(boolean isFixedTable){
int fixedSelectedIndex = fixedTaboe.geSelectedRow();
int selectedIndex = scrollTable.getSelectedRow();
if (fixedSelectedIndex != selectedIndex){
if (isFixedTable){
scrollTable.setRowSelectionInterval(fixedSelectedIndex,fixedSelectedIndex);
} else {
fixedTable.setRowSelectionInterval(selectedIndex,selectedIndex);
}
}
}
public static main (String[] args){
Test frame = new Test ();
frame.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
frame.setVisible (true);
}
}
public class FixedModel extends AbstractTableModel{
static public List<String> columnNames = new ArrayList();
static public List<List> data = new ArrayList();
{//annonymous class
for (int i = 0;i < 3; i++){
columnNames.add(" ");
}
}
public void addRow(List rowData){
data.add(rowData);
fireTableRowsInserted(data.size() - 1,data.size() - 1);
}
public int getColumnCount() {
return columnNames.size();
}
public int getRowCount() {
return data.size();
}
@Override
public String getColumnName(int col) {
try {
return columnNames.get(col);
} catch (Exception exception) {
return null;
}
}
public Object getValueAt(int row, int col) {
return data.get(row).get(col);
}
public boolean isCellEditable(int row, int col) {
return false;
}
public Class getColumnClass(int c) {
return getValueAt(0,c).getClass();
}
};
public class ModelWithScrollbar extends AbstractTableModel{
static public List<String> columnNames = new ArrayList();
static public List<List> data = new ArrayList();
{//annonymous class
for (int i = 0;i < 90; i++){
columnNames.add(" ");
}
}
public void addRow(List rowData){
data.add(rowData);
fireTableRowsInserted(data.size() - 1,data.size() - 1);
}
public int getColumnCount() {
return columnNames.size();
}
public int getRowCount() {
return data.size();
}
@Override
public String getColumnName(int col) {
try {
return columnNames.get(col);
} catch (Exception exception) {
return null;
}
}
public Object getValueAt(int row, int col) {
return data.get(row).get(col);
}
public boolean isCellEditable(int row, int col) {
return false;
}
public Class getColumnClass(int c) {
try {
return getValueAt(0,c).getClass();
}
catch (Exceptin exception) {// MAY LEAD TO ERROR
return this.getClass();
}
}
};