1

現在、私は自分がしていることに 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) [斜め]

これを行う方法についてのアイデアはありますか?

4

2 に答える 2

1

あなたが本当に「テーブル」をモデリングしているようには聞こえません。(JTable はテーブル セマンティクスを想定し、List 選択モデルを使用します。) ただし、JTable コードをハックする意思がある場合は、マトリックスからそれほど離れているとは思いません。

別の方法は、独自の (そう) コンポーネントです。マトリックス セルを含む JPanel です。すべてのキーボード/マウス イベント処理は、親 JPanel に委譲する必要があります。関連するサブセットと設計を JTable (データ モデル、選択モデルなど) から複製することをお勧めします。

したがって、基本的に、3 つのクラスが必要になります。

JMatrix、JMatrixModel、JMatrixSelectionModel。

JMatrix は、子コンポーネントを持つ拡張された JPanel です。JMatrixSelectionModel は、選択ルールを実装するクラスです。JMatrix は、選択イベントで選択モデルを呼び出す必要があります (マトリックス セルに登録され、親 JMatrix のハンドラーに委譲されます)。データ モデルは非常に簡単です。既存の JTableModel を使用することもできます。

于 2009-05-03T19:13:57.560 に答える
0

私も同じような状況です。私の解決策(申し訳ありませんが、巨大なクラスを書きたくない)は、テーブルのマウスリスナーであるすべての列にセルレンダラーを追加することでした。レンダラーはどのボタンが選択されているかを知っているので、それらを異なる方法でレンダリングできます。

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

}

于 2010-01-29T06:40:54.587 に答える