JTableまたは高度なセル選択を備えた他のJavaテーブルクラス?
質問
今、私は自分がやっていることのためにJTableを使用しています。 Java APIとさまざまなWebリソースを調べた後、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)[対角線方向]
これを実現するためのアイデアはありますか?
解決
「テーブル」を実際にモデリングしているように聞こえません。 (JTableはテーブルのセマンティクスを想定し、リスト選択モデルを使用します。)ただし、JTableコードをハッキングする意思がある場合、マトリックスからそれほど遠く離れているとは思いません。
代替は、独自の(うん)コンポーネントです。マトリックスセルを含むJPanelです。すべてのキーボード/マウスイベント処理は、親JPanelに委任する必要があります。 JTable(データモデル、選択モデルなど)から関連するサブセットとデザインを複製することをお勧めします。
したがって、基本的に、3つのクラスが必要になります:
JMatrix、JMatrixModel、JMatrixSelectionModel。
JMatrixは、子コンポーネントを持つ拡張JPanelです。 JMatrixSelectionModelは、選択ルールを実装するクラスです。 JMatrixは、選択イベントで選択モデルを呼び出す必要があります(マトリックスセルに登録され、親JMatrixのハンドラーに委任されます)。データモデルはかなり単純です。既存のJTableModelを使用することもできます。
他のヒント
私は同様の状況にいます。私の解決策(申し訳ありませんが、巨大なクラスを作成したくない)は、テーブルのマウスリスナーであるすべての列にセルレンダラーを追加することでした。レンダラーはどのボタンが選択されているかを知っているため、それらを異なる方法でレンダリングできます。
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;
}
}