2009-05-03 12 views
1

今、私は何をしているのかのためにJTableを使用しています。 Java APIとさまざまなWebリソースを調べた結果、JTableがこれ以上切り詰めるつもりはないと思います。私が探しているのは、非常に厳格な選択手順を指定できるテーブルです。私は、行と列を選択するだけでなく、斜め方向のセルも選択できるようにしたい。それよりも、別のセルにあるときにどのセルを選択できるかを指定できる総合的な能力が必要です。JTableまたは高度なセル選択を持つその他のJavaテーブルクラス?

例えば、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)[斜め]

任意のアイデア私はこれをどうやってできるのか?

答えて

1

実際に 'テーブル'をモデリングしているようには聞こえません。 (JTableはテーブルセマンティクスを想定していて、リスト選択モデルを使用しています)。しかし、JTableコードをハックしようとしているのであれば、それは行列から遠く離れているとは思いません。

独自の(yep)コンポーネントがあります。マトリックスセルを含むJPanel。すべてのキーボード/マウスイベント処理を親JPanelに委譲する必要があります。 JTable(データモデル、選択モデルなど)から適切なサブセットとデザインをクローン作成することをお勧めします。

JMatrix、JMatrixModel、JMatrixSelectionModel:

だから、基本的に、あなたは3つのクラスが必要になります。

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

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

}

関連する問題