Hi kynn.
I made some changes to your code, but it's no gem :-)
The changes are marked with @001@ and @002@ and corresponds with your two
questions.
Radim
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
import java.util.Random;
public class RowHeaderProblem extends JFrame {
private static int N_COLS = 5;
private MyTableModel data = new MyTableModel(N_COLS);
private ListModel lm = new AbstractListModel() {
public int getSize() { return data.getRowCount(); }
public Object getElementAt(int index) {
return String.valueOf(index + 1);
}
};
private JList rowHeaders = new JList(lm);
public RowHeaderProblem() {
super( "Row Header Problem" );
setSize( 300, 300 );
final JTable table = new JTable( data );
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.getTableHeader().setReorderingAllowed(false);
table.getSelectionModel().
setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
DefaultTableCellRenderer renderer =
(DefaultTableCellRenderer)
table.getDefaultRenderer(table.getColumnClass(0));
renderer.
setHorizontalAlignment(DefaultTableCellRenderer.RIGHT);
// Hard-coded: no good
rowHeaders.setFixedCellWidth(46);
rowHeaders.setFixedCellHeight(table.getRowHeight());
rowHeaders.setCellRenderer(new RowHeaderRenderer(table));
final JScrollPane scroll = new JScrollPane( table );
scroll.getViewport().
setBackground(table.getTableHeader().getBackground());
scroll.setRowHeaderView(rowHeaders);
// ----------------------------------- @001@ -------------------------------
Color background = table.getTableHeader().getBackground();
scroll.setBackground(background);
rowHeaders.setBackground(background);
// -------------------------------------------------------------------------
getContentPane().add(scroll, BorderLayout.CENTER);
final JButton update = new JButton("Update");
update.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
data.update();
table.tableChanged(new TableModelEvent(data));
table.repaint();
// Bad things happen if one omits the next line!
scroll.setRowHeaderView(rowHeaders);
// ------------------------------- @002 ----------------------------------
int maxLength = String.valueOf(data.getRowCount()).length();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < maxLength; i++)
sb.append('0');
int width = rowHeaders.getFontMetrics(rowHeaders.getFont()).stringWidth(
sb.toString()
);
rowHeaders.setFixedCellWidth(width);
// -----------------------------------------------------------------------
rowHeaders.repaint();
} });
JPanel panel = new JPanel();
panel.add(update);
getContentPane().add(panel, BorderLayout.SOUTH);
Dimension dim = getToolkit().getScreenSize();
setLocation(dim.width/2 - getWidth()/2,
dim.height/2 - getHeight()/2);
}
int q;
public static void main(String[] args) {
RowHeaderProblem frame = new RowHeaderProblem();
frame.addWindowListener( new WindowAdapter() {
public void windowClosing( WindowEvent e ) {
System.exit(0);
}
});
frame.setVisible(true);
}
}
class MyTableModel extends AbstractTableModel {
private int nCols;
private int[][] data;
private Random prng = new Random();
public MyTableModel(int c) {
nCols = c;
}
public int getColumnCount() {
return nCols;
}
public int getRowCount() {
return data == null ? 0 : data.length;
}
public Object getValueAt(int r, int c) {
return String.valueOf(data[r][c]);
}
private int modulo(int x, int m) {
return ((x % m) + m) % m; // to avoid negative values
}
public void update() {
int r = 100 + modulo(prng.nextInt(), 1991); // 100 <= * <= 2000;
data = new int[r][nCols];
for(int i = 0; i < r; ++i) {
for(int j = 0; j < nCols; ++j) {
data[i][j] = prng.nextInt() % 100000;
}
}
}
}
class RowHeaderRenderer extends JLabel implements ListCellRenderer {
RowHeaderRenderer(JTable table) {
JTableHeader header = table.getTableHeader();
setOpaque(true);
setBorder(UIManager.getBorder("TableHeader.cellBorder"));
setHorizontalAlignment(RIGHT);
setForeground(header.getForeground());
setBackground(header.getBackground());
setFont(header.getFont());
}
public Component getListCellRendererComponent( JList list,
Object value, int index, boolean isSelected, boolean cellHasFocus) {
setText((value == null) ? "" : value.toString());
return this;
}
}