2009-05-03 34 views
1

現在我正在使用JTable來處理我正在做的事情。在瀏覽Java API和各種網絡資源之後,我認爲JTable不會再削減它了。我正在尋找的是一個表格,我可以指定非常嚴格的選擇程序。我希望不僅能夠選擇行和列,還能夠選擇對角線方向的單元格。除此之外,我需要整體能力來指定在另一個單元格中可以選擇哪些單元格。例如,如果我有一個10x10表格,並且我在單元格(4,3)[(row,column)]中,我想能夠說,好的,您可以從這裏選擇以下區間:JTable或其他一些具有高級單元選擇的Java表類?

  • (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)[對角線]

任何想法我怎麼能做到這一點?

回答

1

聽起來不像你真的是在模擬一個'桌子'。 (JTable假定表的語義並使用List選擇模型。)但是,如果你願意破解JTable代碼,我認爲它不會離矩陣太遠。

另一種方法是您自己的(yep)組件:一個包含矩陣單元的JPanel。所有的鍵盤/鼠標事件處理都需要委託給父JPanel。我肯定會推薦從JTable(數據模型,選擇模型等)克隆相關的子集和設計。

所以,基本上,你將需要3類:

JMatrix,JMatrixModel,JMatrixSelectionModel。

JMatrix是帶有子組件的擴展JPanel。 JMatrixSelectionModel是將實現選擇規則的類。 JMatrix應該在選擇事件(在矩陣單元上註冊,委託給父JMatrix上的處理程序)上調用選擇模型。數據模型非常簡單 - 您甚至可以使用現有的JTableModel。

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

}

相關問題