2011-07-28 34 views
8

Tôi có JTable xoay cơ bản và yêu cầu là khi được nhấp vào bất kỳ ô nào, toàn bộ hàng phải được tô sáng và cũng là ô được nhấp phải là màu khác với phần còn lại của hàng được đánh dấu.Swing JTable - Đánh dấu ô đã chọn bằng màu khác với phần còn lại của hàng đã chọn?

Hiện nay, tôi có isRowSelectionAllowed như đúng

tôi đã cố gắng sử dụng một tùy chỉnh TableCellRenderer đó là như sau:

public class CustomTableCellRenderer extends DefaultTableCellRenderer 
{ 

public static final DefaultTableCellRenderer DEFAULT_RENDERER = new DefaultTableCellRenderer(); 
    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
    Component c = DEFAULT_RENDERER.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 

    if (isSelected) { 
     c.setBackground(Color.red); 
    } 
    else { 
     c.setForeground(Color.black); 
     c.setBackground(Color.white); 
    } 
    return c; 
    }  
} 

Nhưng điều đó dường như không làm việc (toàn bộ hàng là đánh dấu màu đỏ).

Tôi cũng đã cố gắng thiết lập thuộc tính UIManager như sau:

UIManager.put("Table.focusCellBackground", 
     new javax.swing.plaf.ColorUIResource (Color.red)); 

Nhưng điều đó dường như không làm việc, hoặc (mặc dù, khi tôi cố gắng thiết lập một biên giới sử dụng

UIManager.put("Table.focusCellHighlightBorder", 
     new BorderUIResource.LineBorderUIResource(Color.red)); 

rằng làm việc tốt)

Bạn có thể đưa ra bất kỳ đề xuất nào mà tôi có thể cần làm không?

Trả lời

10

Hãy thử điều này:

jtable.setCellSelectionEnabled(true); 

Sau đó, trong getTableCellRendererComponent

if (table.isCellSelected(row, column)) 
    setForeground(Color.red); 
else if (table.isRowSelected(row)) 
    setForeground(Color.green); 
else if (table.isColumnSelected(column)) 
    setForeground(Color.blue); 
else 
    setForeground(Color.black); 

Điều đó sẽ làm cho ô đã chọn màu đỏ, phần còn lại của hàng trong xanh, và phần còn lại của cột màu xanh lam . Lưu ý: lựa chọn ô yêu cầu mô hình lựa chọn là duy nhất, các mô hình lựa chọn khác có thể gây ra các hành vi không thể đoán trước.

+0

Tôi đã thử điều này, nhưng nó không thay đổi màu sắc. Nó đi vào điều kiện if cho 'isCellSelected' và' isRowSelected', nhưng dường như không làm gì cả. –

+0

Xin lỗi, lỗi của tôi - tôi đã thử, và điều này hoạt động. Cảm ơn rất nhiều. (Đặt câu trả lời này là câu trả lời được chấp nhận vì mã làm việc. Các câu trả lời khác cũng hữu ích cho việc học). –

3

Bạn cần phải tắt lựa chọn hàng và chọn ô trên bảng. Sau đó, tìm cách quay lại và đánh dấu hàng nếu cần.

+0

Bạn có nghĩa là tôi bật CellSelectionEnabled (true) và sau đó xử lý một lựa chọn hàng bằng cách sử dụng một cái gì đó như thế này? table.changeSelection (hàng, col, chuyển đổi, mở rộng); ? Nó là loại cho kết quả tương tự. –

+0

Có, cho phần đầu tiên, không đến phần thứ hai. Bạn sẽ cần một Cell Renderer làm nổi bật hàng đã chọn với màu khác với ô đã chọn. – jzd

+0

Tôi sẽ cố gắng và cho bạn biết. –

4

Nhưng điều đó dường như không hoạt động (toàn bộ hàng được đánh dấu bằng màu đỏ).

Bạn cần kiểm tra biến "hasFocus", chứ không phải biến "isSelected".

Tùy chọn khác thay vì tạo trình kết xuất tùy chỉnh mulutiple (trong trường hợp bảng của bạn có các cột thuộc các loại lớp khác nhau) là sử dụng phương pháp Table Row Renderering.

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