现在我用JTable为我在做什么。在寻找通过Java API和各种网络资源,我不认为JTable要切它了。我在寻找什么是一个表格,我可以指定非常严格的甄选程序。我希望不仅能够选择排列,但也选择细胞中的一个角方向。多于那,我需要的整体能力,以便能够指定其中的细胞时,可以选择在另一个小区。

例如,如果我有一个10×10表和我在细胞(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)[对角线]

任何想法,我怎么能这么做?

有帮助吗?

解决方案

不喜欢你的声音真的模拟a'表'。(JTable假定表语义和使用名单挑选的模型。) 然而,我不认为这是远离一个矩阵,如果你愿意黑客JTable代码。

一种选择是你自己的(没错)的部件:一JPanel包含的矩阵的单元。所有键盘、鼠标事件处理需要下放给父JPanel.我一定会推荐的克隆相关的子集和设计从JTable(数据模型,选择模型,等等)。

所以,基本上,你将需要3类:

JMatrix,JMatrixModel,JMatrixSelectionModel.

该JMatrix是扩展JPanel与其孩子组成。该JMatrixSelectionModel类将实施选择规则。该JMatrix应该叫的选择模型在选择的活动(登记在矩阵的细胞,授权处理程序上的父JMatrix).该数据模型是相当直截了当的--你甚至可以利用现有的JTableModel.

其他提示

我在类似的情况。我的解决方案(对不起,可不想写一个巨大的类)是增加一个细胞呈示所有列,这是一个老鼠听众表。由于呈示知道哪个按钮被选择,它可以使他们以不同的方式。

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;
}

}

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top