Frage

Im Moment bin ich mit einem JTable für das, was ich tue. Nach einem Blick durch den Java-API und verschiedene Web-Ressourcen, glaube ich nicht, ein JTable schneiden mehr geht. Was ich suche ist eine Tabelle, für die ich sehr strenges Auswahlverfahren festlegen. Ich möchte in der Lage, nicht nur Zeilen und Spalten auswählen, aber auch ausgewählte Zellen in diagonaler Richtung. Mehr als das, ich brauche die allgemeine Fähigkeit, die Zellen ausgewählt, wenn sie in einer anderen Zelle können Sie angeben zu können.

Zum Beispiel, wenn ich einen 10x10 Tisch haben, und ich bin in der Zelle (4, 3) [(Zeile, Spalte)], möchte ich in der Lage sein, zu sagen, okay, Sie können folgende Intervalle wählen von hier:

  • (4, 3) bis (4, 10)
  • (4, 3) bis (4, 1)
  • (4, 3) bis (10, 4)
  • (4, 3) bis (1, 4)
  • (4, 3) bis (10, 10) [diagonal]
  • (4, 3) bis (1, 1) [diagonal]
  • (4, 3) bis (1, 6) [diagonal]
  • (4, 3) bis (6, 1) [diagonal]

Irgendwelche Ideen, wie ich dies tun könnte?

War es hilfreich?

Lösung

Klingt nicht wie Sie wirklich einen ‚Tisch‘ modellieren. (JTable übernimmt Tabellen Semantik und verwendet eine Liste Auswahlmodell.) Aber ich glaube nicht, es ist so weit von einer Matrix entfernt, wenn Sie bereit sind, den JTable Code zu hacken.

Eine Alternative ist, Ihre eigene (yep) Komponente: Ein JPanel, die die Matrixzellen enthält. Alle Tastatur / Maus-Ereignisverarbeitung muss die Mutter JPanel delegiert werden. Ich würde auf jeden Fall empfehlen die relevanten Untergruppen und Design aus JTable Klonen (Datenmodell, Auswahlmodell, usw.).

Also, im Grunde, müssen Sie drei Klassen:

JMatrix, JMatrixModel, JMatrixSelectionModel.

Die JMatrix ist der erweiterten JPanel mit seinen untergeordneten Komponenten. Die JMatrixSelectionModel ist die Klasse, die die Auswahlregeln umsetzt. Die JMatrix sollte das Auswahlmodell auf Selektionsereignisse nennen (auf Matrixzellen registriert, übertragen auf den übergeordneten JMatrix Handler). Das Datenmodell ist recht einfach -. Sie sogar in der Lage sein können bestehende JTableModel verwenden

Andere Tipps

Ich bin in einer ähnlichen Situation. Meine Lösung (sorry, nicht wollen, eine große Klasse schreiben) Es wurde eine Zelle Renderer für alle Spalten hinzufügen, die eine Maus-Listener für die Tabelle war. Da der Renderer weiß, welche Tasten ausgewählt wurden, kann es sie anders machen.

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

}

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top