Java 中 TableCellRenderer 和 TableCellEditor 有什麼區別?
TableCellRenderer
- TableCellRenderer 建立一個元件,用於顯示 JTable 單元格的值。
- 預設渲染器使用 JLabel 來顯示每個表格單元格的值。
- TableCellRenderer 介面可以透過兩種方式指定:透過使用 table.setDefaultRenderer() 方法要渲染的物件的類,以及透過使用 tableColumn.setCellRenderer() 方法和 tableColumn.setHeaderRenderer() 方法為特定列標題設定特定的列。
- TableCellRenderer 介面只有一個方法 getTableCellRendererComponent(),並且此方法可以根據值、單元格是否具有焦點或被選中、包含值的列和行返回不同的渲染元件。
TableCellEditor
- TableCellEditor 是一個介面,預設情況下,單元格可以編輯。
- 可以透過呼叫 TableModel 的 isCellEditable() 方法來確定 TableCellEditor。
- 如果單元格值的類是 Boolean,則可以使用 JCheckBox。如果必須雙擊才能進入編輯模式,則可以使用 JTextField。
- TableCellEditor 介面只有一個方法 getTableCellEditorComponent(),並且此方法可以根據值、單元格是否被選中、包含值的列和行返回不同的編輯元件。
示例
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class TableCellRendererEditorTest extends JFrame {
private JTable table;
public TableCellRendererEditorTest() {
setTitle("TableCellRendererEditor Test");
DefaultTableModel dtm = new DefaultTableModel() {
public boolean isCellEditable(int row, int column) {
return !(column == 0);
}
};
dtm.setDataVector(new Object[][]{{"Table Cell Renderer", "Table Cell Editor"}, {"Table Cell Renderer","Table Cell Editor"}}, new Object[]{"Renderer","Editor"});
table = new JTable(dtm);
table.getColumn("Editor").setCellRenderer(new TextAreaRenderer());
table.getColumn("Editor").setCellEditor(new TextAreaEditor());
table.setRowHeight(80);
JScrollPane spane = new JScrollPane(table);
add(spane);
setSize(400, 275);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {
new TableCellRendererEditorTest();
}
}
class TextAreaRenderer extends JScrollPane implements TableCellRenderer {
JTextArea textarea;
public TextAreaRenderer() {
textarea = new JTextArea();
textarea.setLineWrap(true);
textarea.setWrapStyleWord(true);
getViewport().add(textarea);
}
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,int row, int column) {
if (isSelected) {
setForeground(table.getSelectionForeground());
setBackground(table.getSelectionBackground());
textarea.setForeground(table.getSelectionForeground());
textarea.setBackground(table.getSelectionBackground());
} else {
setForeground(table.getForeground());
setBackground(table.getBackground());
textarea.setForeground(table.getForeground());
textarea.setBackground(table.getBackground());
}
textarea.setText((String) value);
textarea.setCaretPosition(0);
return this;
}
}
class TextAreaEditor extends DefaultCellEditor {
protected JScrollPane scrollpane;
protected JTextArea textarea;
public TextAreaEditor() {
super(new JCheckBox());
scrollpane = new JScrollPane();
textarea = new JTextArea();
textarea.setLineWrap(true);
textarea.setWrapStyleWord(true);
scrollpane.getViewport().add(textarea);
}
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
textarea.setText((String) value);
return scrollpane;
}
public Object getCellEditorValue() {
return textarea.getText();
}
}輸出
廣告
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP