JTable или какой-то другой класс таблиц Java с расширенным выбором ячеек? - PullRequest
1 голос
/ 03 мая 2009

Прямо сейчас я использую JTable для того, что я делаю. Просматривая Java API и различные веб-ресурсы, я не думаю, что 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 ]

1 голос
/ 03 мая 2009

Не похоже, что вы действительно моделируете «стол». (JTable предполагает семантику таблицы и использует модель выбора List.) Однако я не думаю, что она настолько далека от матрицы, если вы хотите взломать код JTable.

Альтернативой является ваш собственный (да) компонент: JPanel, который содержит ячейки матрицы. Вся обработка событий клавиатуры / мыши должна быть делегирована родительскому JPanel. Я бы определенно рекомендовал клонировать соответствующие подмножества и дизайн из JTable (модель данных, модель выбора и т. Д.).

Итак, в основном вам понадобятся 3 класса:

JMatrix, JMatrixModel, JMatrixSelectionModel.

JMatrix - это расширенная JPanel со своими дочерними компонентами. JMatrixSelectionModel - это класс, который будет реализовывать правила выбора. JMatrix должен вызывать модель выбора для событий выбора (зарегистрированных в ячейках матрицы, делегированных обработчику в родительском JMatrix). Модель данных довольно проста - вы даже можете использовать существующую JTableModel.

0 голосов
/ 29 января 2010

Я в похожей ситуации. Мое решение (извините, я не хочу писать огромный класс) состояло в том, чтобы добавить 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;
}

}

...