【问题标题】:JTable or some other Java table class with advanced cell selection?JTable 或其他具有高级单元格选择的 Java 表类?
【发布时间】:2009-05-03 18:34:03
【问题描述】:
现在我正在使用 JTable 来完成我的工作。在查看了 Java API 和各种 Web 资源之后,我认为 JTable 不会再削减它了。我正在寻找的是一张我可以指定非常严格的选择程序的表格。我希望不仅可以选择行和列,还可以选择对角方向的单元格。不仅如此,我还需要能够指定在另一个单元格中时可以选择哪些单元格的整体能力。
例如,如果我有一个 10x10 的表格并且我在单元格 (4, 3) [(row, column)] 中,我想说,好吧,您可以从这里选择以下间隔:
- (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) [对角线]
关于如何做到这一点的任何想法?
【问题讨论】:
标签:
java
jtable
selection
【解决方案1】:
听起来你不是真的在为“桌子”建模。 (JTable 假定表语义并使用列表选择模型。)但是,如果您愿意破解 JTable 代码,我认为它与矩阵相距不远。
另一种选择是您自己的(是的)组件:包含矩阵单元的 JPanel。所有键盘/鼠标事件处理都需要委托给父 JPanel。我当然会建议从 JTable 中克隆相关的子集和设计(数据模型、选择模型等)。
所以,基本上,你需要 3 个类:
JMatrix、JMatrixModel、JMatrixSelectionModel。
JMatrix 是扩展的 JPanel 及其子组件。 JMatrixSelectionModel 是实现选择规则的类。 JMatrix 应该在选择事件上调用选择模型(在矩阵单元上注册,委托给父 JMatrix 上的处理程序)。数据模型相当简单——您甚至可以使用现有的 JTableModel。
【解决方案2】:
我也有类似的情况。我的解决方案(抱歉,不想编写一个庞大的类)是为所有列添加一个 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> " + value+"</td>";
html = html + "</tr></table></body></html>";
return html;
}
}