[英]JTable set disabled checkbox look for uneditable cell
我有一個布爾值列的JTable
。 根據模型中存儲的狀態,我可以使其中的部分或全部不可編輯(模型的isCellEditable()
返回false)。 但是,這不會使JTable
布爾渲染器將復選框呈現為對不可編輯單元格禁用。
除了編寫自定義布爾渲染器之外,有沒有辦法解決這個問題?
如果我需要編寫自己的渲染器,除了JCheckbox
之外,我應該擴展哪個類? 我只是需要在渲染之前禁用復選框,並且不希望實現所有渲染代碼並處理選定的外觀和內容。
但是,這不會使JTable布爾渲染器將復選框呈現為對不可編輯單元格禁用。
這是正確的,因為它是默認渲染器的行為: JCheckBox
是不可編輯的但未禁用 。
除了編寫自定義布爾渲染器之外,有沒有辦法解決這個問題?
不,據我所知。
如果我需要編寫自己的渲染器,除了JCheckbox之外,我應該擴展哪個類?
擴展任何類以實現TableCellRenderer接口並不是必需的。 您可以完美地將JCheckBox
作為渲染器的類成員。 實際上,組合比繼承更受歡迎。
我只是需要在渲染之前禁用復選框,並且不希望實現所有渲染代碼並處理選定的外觀和內容。
這並不困難,你可以控制正在發生的事情。 考慮以下示例:
class CheckBoxCellRenderer implements TableCellRenderer {
private final JCheckBox renderer;
public CheckBoxCellRenderer() {
renderer = new JCheckBox();
renderer.setHorizontalAlignment(SwingConstants.CENTER);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Color bg = isSelected ? table.getSelectionBackground() : table.getBackground();
renderer.setBackground(bg);
renderer.setEnabled(table.isCellEditable(row, column));
renderer.setSelected(value != null && (Boolean)value);
return renderer;
}
}
有關相關問題,請參閱此問答: JXTable:對特定單元格使用TableCellEditor和TableCellRenderer而不是整列
如果沒有一個工作示例,很難確切地說出錯誤是什么,但聽起來您可能忘記觸發表修改事件來通知它需要重繪自己的JTable。 當您進行更改時,您需要在模型中使用以下內容:
fireTableChanged(new TableModelEvent(sourceModel, firstRow, lastRow, tableCol));
您可以觸發不同的表更改事件以及可以傳遞給TableModelEvent構造函數的不同參數。 您可以在Javadocs中找到更多信息: http : //docs.oracle.com/javase/8/docs/api和Java教程: http : //docs.oracle.com/javase/tutorial/uiswing/components /table.html#fire 。 您需要閱讀這些內容,以確定哪些適合您的特定情況。
我懷疑是否需要自定義布爾渲染器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.