我正在使用 Java 6.0 + Swing + JTable。
通常,JTable 将标题呈现为第一行。(左图)
但是,我想将标题呈现为第一列。(右图)
我不认为这是 JTable 中的一个简单标志。
您能否推荐一种方法或现有的小部件库?
我假设我需要覆盖 JTableHeader 和 JTable 的 paint() 方法。
谢谢
哎呀,没关系你想要一个转置的 TableModel,而不仅仅是行标题。
见http://tips4java.wordpress.com/2008/11/18/row-number-table/
我有同样的问题。这是我的实现。我有一个固定的标头数组,还有一个用于其余数据的二维数组,这些数据是通过 json 填充的,尽管不相关也不在这里显示。请注意,这支持列级别的动态填充:
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class Test {
public static void main(String[] argv) throws Exception {
DefaultTableModel model = new DefaultTableModel();
JTable table = new JTable(model);
model.addColumn("Header");
String[] headers = { //If you wish to separate the headers array from columns array
"Header 1",
"Header 2",
"Header 3"
};
String [][]columnData = new String[][]{
{
"Column 1.1",
"Column 1.2",
"Column 1.3"
},{
"Column 2.1",
"Column 2.2",
"Column 2.3"
},{
"Column 3.1",
"Column 3.2",
"Column 3.3"
}
};
for(int col=1;col<(columnData.length+1);col++){
model.addColumn("Col"+col);
}
for(int i=0;i<headers.length;i++){
model.addRow(new Object[] { headers[i] });
}
for(int r=0;r<columnData.length;r++){
for(int c=0;c<columnData[0].length;c++){
model.setValueAt(columnData[r][c],c,r+1);
}
}
JFrame f = new JFrame();
f.setSize(500, 300);
f.add(new JScrollPane(table));
f.setVisible(true);
}
}
这是输出:
您可以使用 TableModel 来做到这一点,您应该在 getColumnClass 中返回一个特定的类,使用渲染器将其绘制为标题列。并且可能,您将使您的 getValueAt 垂直。
这并不简单,但却是可能的。
当我发布它时,您发布的图像不可见,对于您的情况,您应该使用 CellRenderer 使其像 Header,但它仍然在 TableModel 上。
这个怎么样,你基本上覆盖了 getValueAt(int row, int column)。这是一个测试类:
package so.pivot;
import javax.swing.JFrame;
import javax.swing.JTable;
public class Test extends JFrame{
public static void main(String[] args){
Test test = new Test();
String[] columnNames = {"First Name",
"Last Name",
"Sport",
"# of Years",
"Vegetarian"};
Object[][] data = {
{"Kathy", "Smith",
"Snowboarding", new Integer(5), new Boolean(false)},
{"John", "Doe",
"Rowing", new Integer(3), new Boolean(true)},
{"Sue", "Black",
"Knitting", new Integer(2), new Boolean(false)},
{"Jane", "White",
"Speed reading", new Integer(20), new Boolean(true)},
{"Joe", "Brown",
"Pool", new Integer(10), new Boolean(false)}
};
JTable table = new JTable(data, columnNames){
@Override
public Object getValueAt(int row, int column){
return super.getValueAt(column, row);
}
};
test.add(table);
test.pack();
test.setVisible(true);
}
}