Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Khác biệt giữa TableCellRenderer và TableCellEditor trong Java

TableCellRenderer

  • TableCellRenderer tạo thành phần hiển thị giá trị của ô JTable.
  • Renderer mặc định sử dụng JLabel để hiển thị giá trị mỗi ô.
  • Giao diện TableCellRenderer có thể được chỉ định theo hai cách: theo lớp của đối tượng cần render dùng table.setDefaultRenderer() và theo cột dùng tableColumn.setCellRenderer() cũng như tableColumn.setHeaderRenderer() cho header cột cụ thể.
  • Giao diện TableCellRenderer chỉ có một phương thức getTableCellRendererComponent(), phương thức này có thể trả về các thành phần render khác nhau dựa trên giá trị, ô có focus hay được chọn, hàng và cột chứa giá trị.

TableCellEditor

  • TableCellEditor là một giao diện và mặc định các ô có thể chỉnh sửa.
  • Một TableCellEditor có thể được xác định bằng cách gọi phương thức isCellEditable() của TableModel.
  • Nếu lớp của giá trị ô là Boolean, có thể dùng JCheckBox. Nếu cần nhấp đúp để vào chế độ chỉnh sửa, có thể dùng JTextField.
  • Giao diện TableCellEditor chỉ có một phương thức getTableCellEditorComponent(), phương thức này có thể trả về các thành phần chỉnh sửa khác nhau dựa trên giá trị, ô được chọn, hàng và cột chứa giá trị.

Ví dụ

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();
    }
}

Kết quả

Khác biệt giữa TableCellRenderer và TableCellEditor trong Java