2014-10-22 74 views
1

我有JTable帶有布爾值列。根據存儲在模型中的狀態,我會使其中一些或全部不可編輯(模型的isCellEditable()返回false)。但是,這不會使JTable布爾型渲染器將複選框呈現爲對不可編輯單元格禁用。JTable設置禁用複選框尋找不可編輯的單元格

有沒有辦法如何實現這個比編寫自定義布爾渲染器?

如果我需要編寫自己的渲染器我應該擴展除JCheckbox以外的什麼類?我只是簡單地需要在渲染前禁用複選框,並且不想實現所有渲染代碼並處理選定的外觀和內容。

+2

爲了更好地幫助越早,張貼[MCVE(http://stackoverflow.com/help/mcve)(最小完整可驗證示例)。 – 2014-10-22 07:55:39

+0

與SSCCE/MCVE一致,短,可運行,可編譯,硬編碼值用於局部變量中的JTable/XxxTableModel – mKorbel 2014-10-22 10:13:09

回答

0

沒有一個工作的例子,很難說出什麼是錯誤的,但它聽起來像你可能已經忘記引發一個表修改事件來通知它需要重繪它自己的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。您需要閱讀這些內容才能確定哪些適合您的特定情況。

我懷疑自定義布爾渲染器是必需的。

2

但是,這不會使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: use a TableCellEditor and TableCellRenderer for a specific cell instead of the whole column

相關問題