2009-09-25 67 views

Trả lời

32

Bạn không thêm nó vào một hàng - bạn thêm nó vào ô. This tutorial mô tả những gì bạn cần.

+2

ok, Cảm ơn Droidln.net –

+7

Không cần phải cảm ơn, chỉ cần đánh dấu vào ô :) – Bostone

+2

waw! Tôi vừa mở ví dụ đó và nhận ra rằng mã nguồn đã thêm một "JCheckbox mới" vào CellEditor. Nhưng thực ra nó được hiển thị dưới dạng JButton. Dù sao, câu hỏi của tôi là, tại sao chúng ta nên đặt JCheckBox vào nó? :( – gumuruh

20

Bạn có thể thêm Thành phần làm ô bảng.

Trước hết, bạn nên triển khai một lớp có JButton làm lớp cha và hai giao diện TableCellRenderer và TableCellEditor.

Lý do nên triển khai TableCellEditor là dành cho ActionEvent của nút nhận.

public class TableButton extends JButton implements TableCellRenderer, TableCellEditor { 
    private int selectedRow; 
    private int selectedColumn; 
    Vector<TableButtonListener> listener; 

    public TableButton(String text) { 
    super(text); 
    listener = new Vector<TableButtonListener>(); 
    addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
     for(TableButtonListener l : listener) { 
      l.tableButtonClicked(selectedRow, selectedColumn); 
     } 
     } 
    }); 
    } 

    public void addTableButtonListener(TableButtonListener l) { 
    listener.add(l); 
    } 

    public void removeTableButtonListener(TableButtonListener l) { 
    listener.remove(l); 
    } 

    @Override 
    public Component getTableCellRendererComponent(JTable table, 
    Object value, boolean isSelected, boolean hasFocus, int row, int col) { 
    return this; 
    } 

    @Override 
    public Component getTableCellEditorComponent(JTable table, 
     Object value, boolean isSelected, int row, int col) { 
    selectedRow = row; 
    selectedColumn = col; 
    return this; 
    } 

    @Override 
    public void addCellEditorListener(CellEditorListener arg0) {  
    } 

    @Override 
    public void cancelCellEditing() { 
    } 

    @Override 
    public Object getCellEditorValue() { 
    return ""; 
    } 

    @Override 
    public boolean isCellEditable(EventObject arg0) { 
    return true; 
    } 

    @Override 
    public void removeCellEditorListener(CellEditorListener arg0) { 
    } 

    @Override 
    public boolean shouldSelectCell(EventObject arg0) { 
    return true; 
    } 

    @Override 
    public boolean stopCellEditing() { 
    return true; 
    } 
} 

Sau đó, tôi đã thêm EventListener có tên TableButtonListener cho sự kiện nút xử lý như sau.

public interface TableButtonListener extends EventListener { 
    public void tableButtonClicked(int row, int col); 
} 

Và sử dụng ở trên Trình kết xuất/biên tập.

TableButton buttonEditor = new TableButton("Button"); 
buttonEditor.addButtonListener(new TableButtonListener() { 
    @Override 
    public void tableButtonClicked(int row, int col) { 
    // do something 
    }  
}); 

TableColumn col = new TableColumn(1, 80); 
col.setCellRenderer(buttonEditor); 
col.setCellEditor(buttonEditor); 

cols.addColumn(colPattern); 

Nếu bạn muốn hiển thị nhãn nút khác nhau cho mỗi hàng, bạn nên chèn khối mã vào getTableCellRendererComponent và getTableCellEditorComponent mà là để thay đổi nhãn nút của.

chỉnh sửa: Mã biên dịch ngay bây giờ. Lỗi khung trong TableButton constructor cố định.

+0

Cảm ơn xrath đã trợ giúp –

+3

-1 đây là việc triển khai bất hợp pháp CellEditor: hợp đồng, nó _must_ thông báo cho CellEditorListeners đã đăng ký, mà nó tầm thường không thể với việc thực hiện trống của addEditorListener ;-) Siêu hợp đồng _must_ được phục vụ bằng cách triển khai, không có cách nào xung quanh. – kleopatra

+1

Tôi đã thử nó, và tôi có .... biến không xác định 'nghe' ... đó là gì? :( – gumuruh

Các vấn đề liên quan