簡體   English   中英

JTable set disabled復選框查找不可編輯的單元格

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM