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;
  }
}

Reply via email to