我正在尝试创建一个看起来像下面的模型的JTable:

绿色角基本上是红色列和行标题的缓冲空间.单元格不需要以图中的颜色渲染; 但是它们需要与表中其他"白色"细胞区分开来.
该表也不可编辑或可选择; 它只是在用户更新时才被用户查看.
我知道这可以使用DefaultTableModel实现,其中自定义渲染用于行1,2 && cols 1,2并在设置和获取表值时添加+2(考虑用作标题的行和列).
输入限制为20x20,因此包括22x22的标头.
还考虑JScrollPane包含JPanel具有GridLayout和包含22×22的实例JLabel,或合适的子类.这容易扩展到几千个细胞.
附录:如果需要,请按照此处的建议CellRendererPane制作一个好的flyweight渲染器.
如果您继续使用JTable渲染可伸缩性,
这不是滥用; 它正是TableModel打算如何使用.TableModel模拟任何你决定的矩形矩阵.JTable只是该模型的(有效渲染)视图.
我更喜欢AbstractTableModel,这里显示,因为Vector很少是理想的数据结构.使用任何容器使您的索引最方便.DefaultTableModel是方便的,并作为扩展的指南AbstractTableModel.特别是,你需要一个setValueAt().
@Override
public void setValueAt(Object aValue, int row, int col) {
... // update your data structure
this.fireTableCellUpdated(row, col); // notify the view
}
Run Code Online (Sandbox Code Playgroud)更长的评论,一切都取决于
1)如果可能的话 Columns
调整
重新排序
2)如果可能的话 Columns
滤波
排序
一个.然后你看看两个JTable,第一个JTable只有TableHeader,简单的删除行和第二个完整大小的JTable与TableHeader和列和行,
湾 对于两个JTableHeader之间的交互有
TableColumnModelListener#columnMarginChanged(ChangeEvent e)和columnMoved(TableColumnModelEvent e)
C.每一个都JPanel放在JScrollPane里面
d.如果你要更改行数或列数(或过滤/排序),那么你必须通知JPanelrezize JTable#getPreferredScrollableViewportSize()+ Dimensionfor ontop JTableonly withTableHeader
非常类似的方式(你需要的一切)



(Rob的无尽荣誉)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
3),否则看如何使用超募国界的prepareRederer
4)这个问题与类型无关 TableModel
| 归档时间: |
|
| 查看次数: |
2009 次 |
| 最近记录: |