JTable或其他一些具有高级单元选择的Java表类?

时间:2009-05-03 18:34:03

标签: java jtable selection

现在我正在使用JTable来完成我正在做的事情。在查看Java API和各种Web资源之后,我认为JTable不会再削减它了。我正在寻找的是一个表格,我可以指定非常严格的选择程序。我希望不仅能够选择行和列,还能选择对角线方向的单元格。更重要的是,我需要能够指定在另一个单元格中可以选择哪些单元格的整体能力。

例如,如果我有10x10表并且我在单元格(4,3)[(行,列)]中,我希望能够说,好的,您可以从这里选择以下间隔:

  • (4,3)至(4,10)
  • (4,3)至(4,1)
  • (4,3)至(10,4)
  • (4,3)至(1,4)
  • (4,3)至(10,10)[对角线]
  • (4,3)至(1,1)[对角线]
  • (4,3)至(1,6)[对角线]
  • (4,3)至(6,1)[对角线]

关于我如何做到这一点的任何想法?

2 个答案:

答案 0 :(得分:1)

听起来你并没有真正为'桌子'建模。 (JTable假设表语义并使用List选择模型。)但是,如果您愿意破解JTable代码,我认为它不会远离矩阵。

替代方案是您自己的(是)组件:包含矩阵单元格的JPanel。需要将所有键盘/鼠标事件处理委托给父JPanel。我当然建议克隆相关子集并从JTable设计(数据模型,选择模型等)。

所以,基本上,你需要3个课程:

JMatrix,JMatrixModel,JMatrixSelectionModel。

JMatrix是带有子组件的扩展JPanel。 JMatrixSelectionModel是将实现选择规则的类。 JMatrix应该在选择事件上调用选择模型(在矩阵单元格上注册,委托给父JMatrix上的处理程序)。数据模型非常简单 - 您甚至可以使用现有的JTableModel。

答案 1 :(得分:0)

我处于类似情况。我的解决方案(对不起,不想写一个庞大的类)是为所有列添加一个Cell Renderer,这些列是该表的鼠标监听器。由于渲染器知道选择了哪些按钮,因此可以以不同方式呈现它们。

public class MultipleSelectionRenderer extends DefaultTableCellRenderer implements MouseListener {
    private JTable table;
    private Map<String, Boolean> selectedMap = new LinkedHashMap<String, Boolean>();
    TableUpdateIfc updater;
public MultipleSelectionRenderer(TableUpdateIfc updater, JTable table, Map<String, Boolean> selectedMap) {
    this.table = table;
    this.selectedMap = selectedMap;
    this.updater = updater;
}

@Override
public void mouseReleased(MouseEvent e) {
    if(e.getSource() == table){
        try {
            if(!e.isControlDown())
                selectedMap.clear();
            selectedMap.put(table.getSelectedRow()+":"+table.getSelectedColumn(), true);
        } catch (Exception ex) {
            selectedMap.clear();
        }
    }
    updater.updateMultipleSelectionTable(table);
}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) { }
public void mouseClicked(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}

/**
 *
 * @param table
 * @param value
 * @param isSelected
 * @param hasFocus
 * @param row
 * @param column
 * @return
 */
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    Component result =super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    if(selectedMap.get(row+":"+column) != null && selectedMap.get(row+":"+column) == true) {
        setText(getHTMLString(value));
    }
    return result;
}

private String getHTMLString(Object value){
    String html = "<html><body><table cellpadding=0><tr>";
    html = html + "<td bgcolor=#bf65a5>";
    html = html + value.toString();
    html = html + "</td><td>&nbsp;" + value+"</td>";
    html = html + "</tr></table></body></html>";
    return html;
}

}