Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

ความแตกต่างระหว่าง TableCellRenderer และ TableCellEditor ใน Java

TableCellRenderer

  • TableCellRenderer สร้างคอมโพเนนต์เพื่อแสดงค่าของเซลล์ JTable
  • Renderer เริ่มต้นใช้ JLabel เพื่อแสดงค่าของแต่ละเซลล์
  • อินเทอร์เฟซ TableCellRenderer สามารถระบุได้ 2 วิธี: โดยคลาสของอ็อบเจกต์ที่จะแสดงด้วย table.setDefaultRenderer() และโดยคอลัมน์ด้วย tableColumn.setCellRenderer() รวมถึง tableColumn.setHeaderRenderer() สำหรับหัวคอลัมน์เฉพาะ
  • อินเทอร์เฟซ TableCellRenderer มีเพียงเมธอดเดียวคือ getTableCellRendererComponent() ซึ่งสามารถคืนค่าคอมโพเนนต์แสดงผลที่แตกต่างกันได้ตามค่า โฟกัส สถานะการเลือก แถว และคอลัมน์

TableCellEditor

  • TableCellEditor เป็นอินเทอร์เฟซ โดยค่าเริ่มต้นเซลล์สามารถแก้ไขได้
  • สามารถกำหนดได้โดยการเรียกเมธอด isCellEditable() ของ TableModel
  • ถ้าคลาสของค่าเซลล์เป็น 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();
    }
}

ผลลัพธ์

ความแตกต่างระหว่าง TableCellRenderer และ TableCellEditor ใน Java