セルをクリックしたときにテーブルで行全体を選択しようとしています (これは、列の選択をオフにすることで実行できます) が、クリックした特定のセルの周りの余分な太い境界線を強調表示したくありません。これが簡単になることを望んでいましたが、どうやらレンダラーが関係しているようですので、多くの調査を行いました。
JTable contactTable = new JTable(tableModel);
contactTable.setCellSelectionEnabled(true);
contactTable.setColumnSelectionAllowed(false);
contactTable.setRowSelectionAllowed(false);
contactTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
// This renderer extends a component. It is used each time a
// cell must be displayed.
class MyTableCellRenderer extends JLabel implements TableCellRenderer {
// This method is called each time a cell in a column
// using this renderer needs to be rendered.
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int rowIndex, int vColIndex) {
// 'value' is value contained in the cell located at
// (rowIndex, vColIndex)
if (isSelected) {
// cell (and perhaps other cells) are selected
}
if (hasFocus) {
// this cell is the anchor and the table has the focus
this.setBackground(Color.blue);
this.setForeground(Color.green);
} else {
this.setForeground(Color.black);
}
// Configure the component with the specified value
setText(value.toString());
// Set tool tip if desired
// setToolTipText((String)value);
// Since the renderer is a component, return itself
return this;
}
// The following methods override the defaults for performance reasons
public void validate() {}
public void revalidate() {}
protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {}
public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {}
}
int vColIndex = 0;
TableColumn col = contactTable.getColumnModel().getColumn(vColIndex);
col.setCellRenderer(new MyTableCellRenderer());
例から Renderer をコピーし、必要な色を使用するように hasFocus() 関数のみを変更しました。色を設定しisSelected()
ても何も起こりませんでした。
このコードの問題は次のとおりです。
下部の vColIndex で指定された 1 つの列でのみ機能します。明らかに、これをすべての列に適用したいので、1 つのセルをクリックすると行全体が強調表示されます。forループを作成してすべてのセルに変更することもできますが、すべての列のcellRendererを一度に変更するより良い方法があると思います。
setForegroundColor()
テキストを変更するために機能しますがsetBackgroundColor()
、セルの背景には何もしません。プロパティが示すように、実際に背景色を変更したいと思います。- #2 の解決策:
this.setOpaque(true);
backgroundcolor を割り当てる前に使用します。
- #2 の解決策:
レンダラーが機能する場合、単一のセルでのみ機能します。行内のすべてのセルに色を付けるにはどうすればよいですか?
- #3 の解決策: わかった! 単一のセルにのみ影響するを使用する代わりに、
hasFocus()
行の選択 ( ) を有効にする場合は、ステートメントtable.setRowSelectionAllowed(true)
に色の変更を入れます。if(isSelected)
次に、行全体が選択されたと見なされ、すべてのセルに色が付けられます!
- #3 の解決策: わかった! 単一のセルにのみ影響するを使用する代わりに、
3 は大きなものでしたが、誰かが #1 を知っているか、レンダラーを一度に 1 つの列にしか適用できないように設計された理由を説明していただければ幸いです。