[ My mailer tells me this message didn't go through; please pardon any
repeats. ]
I'm having 2 annoying difficulties implementing a GUI that uses JTable
with row headers. The code below is a radically simplified mock-up of
the GUI-based application I'm trying to develop, but it illustrates
the problems. In the mock-up, a table that is initially empty becomes
(re-)populated with new data whenever the user clicks the Update
button.
1. The first problem is that initially, before the table is
populated, the (empty) header area has a different color (white) from
the rest of the (empty) table. How can I make the two colors match?
I have tried setting the viewport's background color to match the
color of the table's headers, to no avail.
2. The second problem is that I have not found a way to
programmatically determine the width of the row headers column (which
changes every time that one hits the Update button) so that the row
headers are just wide enough to hold every header value. I want to
have this information so I can adjust the width of the header whenever
the data changes. How can I do this?
Thanks!
kynn
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);
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);
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);
}
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;
}
}
_______________________________________________
Swing mailing list
[EMAIL PROTECTED]
http://eos.dk/mailman/listinfo/swing