Mac OS X: Problems with custom widget in JTable
--=-=-=
hello,
I am using a simple "graph widget" (a subclass of JComponent that
overrides the paint() method) as a cell renderer in a simple
JTable.
This works fine on Linux and Windows (you see the /\ /\ in each cell),
but on Mac OS X (also with Java 1.6) the cells are empty (just plain
white window).
A minimal example that shows this behavior is attached.
Do you have any ideas?
Thanks in advance!
--
Felix Natter
--=-=-=
Content-Type: text/x-java
Content-Disposition: inline; filename=TestJTable5.java
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
class AlignmentStatisticsRenderWidget extends JComponent {
private double[] col_significance;
public void paint(Graphics g) {
int cellLeftPadding = 7;
int cellBottomPadding = 5;
int colwidth = 10;
int colheight = 15;
for (int i = 1; i < col_significance.length; i++) {
g.drawLine(cellLeftPadding + (i-1)*colwidth, (int)(col_significance[i-1]*colheight)+cellBottomPadding, cellLeftPadding + i*colwidth, (int)(col_significance[i]*colheight)+cellBottomPadding);
}
}
public AlignmentStatisticsRenderWidget(double[] col_significance) {
this.col_significance = col_significance;
}
}
class MyDataModel extends AbstractTableModel {
private Object[][] data;
private Object[] column;
public int getColumnCount() { return column.length; }
public int getRowCount() { return data.length; }
public String getColumnName(int col) {
return (String)column[col];
}
public Object getValueAt(int row, int col) {
// this gets called all the time!
System.out.println("getValueAt("+row+","+col+")");
return data[row][col];
}
public void setValueAt(Object obj, int row, int col) {
data[row][col] = obj;
}
public boolean CellEditable(int row, int col) {
return true;
}
public MyDataModel() {
data = new Object[][]{
{ "a","","","","",""},
{ "","b","","","",""},
{ "","","c","","",""},
{ "","","","d","",""},
{ "","","","","e",""},
{ "","","","","","f"}};
column = new Object[]{"A","B","C","D","E","F"};
}
}
class MyJTable extends JTable implements TableCellRenderer {
public TableCellRenderer getCellRenderer(int r, int c) {
return this;
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
//return new JLabel(String.format("%d/%d", row, column));
double[] values = {1.0, 0.0, 1.0, 0.0, 1.0};
AlignmentStatisticsRenderWidget w = new AlignmentStatisticsRenderWidget(values);
return w;
}
public MyJTable(TableModel tm) {
super(tm);
}
}
public class TestJTable5 extends JFrame {
JTable dataTable;
MyDataModel datamodel;
JScrollPane tblSP;
public TestJTable5() {
setSize(320,240);
datamodel = new MyDataModel();
dataTable = new MyJTable(datamodel);
dataTable.setAutoCreateRowSorter(true);
dataTable.setVisible(true);
add(dataTable);
setVisible(true);
}
public static void main(String[] args) {
TestJTable5 frame = new TestJTable5();
frame.addWindowListener( new WindowAdapter() {
public void windowClosing( WindowEvent e ) {
System.exit(0);
}
});
//frame.pack();
frame.setVisible(true);
}
}
/*
Local Variables:
compile-command: "make run"
End:
*/
--=-=-=--