Java 创建具有多个列标题和行标题的自定义TableModel
我正在尝试创建一个JTable,它看起来像下面的模型: 绿色角落基本上是红色列和行标题的缓冲区空间。细胞不需要渲染成图中的颜色;但是,它们需要与表中的其他“白色”细胞区分开来 此表也不可编辑或选择;它只是在更新时由用户查看 我知道这可以通过使用DefaultTableModel来实现,该模型具有行1,2&&cols 1,2的自定义呈现,并在设置和获取表值时添加+2(考虑用作标题的行和列) 我的问题如下:Java 创建具有多个列标题和行标题的自定义TableModel,java,swing,jtable,Java,Swing,Jtable,我正在尝试创建一个JTable,它看起来像下面的模型: 绿色角落基本上是红色列和行标题的缓冲区空间。细胞不需要渲染成图中的颜色;但是,它们需要与表中的其他“白色”细胞区分开来 此表也不可编辑或选择;它只是在更新时由用户查看 我知道这可以通过使用DefaultTableModel来实现,该模型具有行1,2&&cols 1,2的自定义呈现,并在设置和获取表值时添加+2(考虑用作标题的行和列) 我的问题如下: 有没有一种更干净的方法可以做到这一点,而不用在标题中使用这些静态值来污染我的表模型 我读过
更多的评论,一切取决于你 1) 如果
列有可能
- 调整大小
- 重新排序
列有可能
- 过滤
- 分类
和
columnMoved(TableColumnModelEvent e)
c。每次在JScrollPane中放入一个JPanel
d。如果要更改行数或列数(或过滤/排序),则必须通知JPanel
以获取rezizeJTable\getPreferredScrollableViewportSize()
+维度以获取ontopJTable
仅使用表格标题
非常相似的方式(有你需要的一切)
(对罗布的无限赞誉)
import java.awt.*;
导入javax.swing.*;
导入javax.swing.event.*;
导入javax.swing.table.*;
公共类TableFilterRow扩展JFrame实现TableColumnModelListener{
私有静态最终长serialVersionUID=1L;
专用JTable表;
私人JPanel filterRow;
公共表FilterRow(){
表=新的JTable(3,5);
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane=新的JScrollPane(表);
getContentPane().add(滚动窗格);
table.getColumnModel().addColumnModelListener(此);
//文本字段面板
filterRow=新的JPanel(新的FlowLayout(FlowLayout.CENTER,0,0));
对于(int i=0;i
3) 否则,请查看prepareRederer
4) 这个问题与TableModel
输入限制为20x20,因此包括22x22的标题
也考虑一个<代码> jScR卷卷子< /> >包含<代码> jPoCTs/COD> > <代码> GridLayout < /代码>,并包含22x22实例<代码> jabel>代码>,或一个合适的子类。这很容易扩展到几千个细胞
附录:如有必要,CellRenderPane
可以作为一个很好的渲染器,正如建议的那样
如果使用JTable
进行渲染可伸缩性
这不是滥用;这正是TableModel
的使用方式<代码>表格模型
为您决定的任何内容建立矩形矩阵JTable
只是该模型的一个(高效渲染的)视图
我更喜欢所示的AbstractTableModel
,因为Vector
很少是理想的数据结构。使用任何使索引最方便的容器DefaultTableModel
非常方便,可以作为扩展AbstractTableModel
的指南。特别是,您需要一个setValueAt()
这看起来更像是一个显示问题,而不是一个TableModel问题。你有没有考虑过定制单元渲染?我有。我在问题中提到了这一点。我是
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
public class TableFilterRow extends JFrame implements TableColumnModelListener {
private static final long serialVersionUID = 1L;
private JTable table;
private JPanel filterRow;
public TableFilterRow() {
table = new JTable(3, 5);
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane = new JScrollPane(table);
getContentPane().add(scrollPane);
table.getColumnModel().addColumnModelListener(this);
// Panel for text fields
filterRow = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 0));
for (int i = 0; i < table.getColumnCount(); i++) {
filterRow.add(new JTextField(" Sum at - " + i));
}
columnMarginChanged(new ChangeEvent(table.getColumnModel()));
getContentPane().add(filterRow, BorderLayout.SOUTH);
}
// Implement TableColumnModelListener methods
// (Note: instead of implementing a listener you should be able to
// override the columnMarginChanged and columMoved methods of JTable)
@Override
public void columnMarginChanged(ChangeEvent e) {
TableColumnModel tcm = table.getColumnModel();
int columns = tcm.getColumnCount();
for (int i = 0; i < columns; i++) {
JTextField textField = (JTextField) filterRow.getComponent(i);
Dimension d = textField.getPreferredSize();
d.width = tcm.getColumn(i).getWidth();
textField.setPreferredSize(d);
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
filterRow.revalidate();
}
});
}
@Override
public void columnMoved(TableColumnModelEvent e) {
Component moved = filterRow.getComponent(e.getFromIndex());
filterRow.remove(e.getFromIndex());
filterRow.add(moved, e.getToIndex());
filterRow.validate();
}
@Override
public void columnAdded(TableColumnModelEvent e) {
}
@Override
public void columnRemoved(TableColumnModelEvent e) {
}
@Override
public void columnSelectionChanged(ListSelectionEvent e) {
}
public static void main(String[] args) {
JFrame frame = new TableFilterRow();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
@Override
public void setValueAt(Object aValue, int row, int col) {
... // update your data structure
this.fireTableCellUpdated(row, col); // notify the view
}