2012-04-04 68 views
6

Tôi đang cố gắng làm cho bảng của tôi chọn toàn bộ hàng khi bạn bấm vào ô (có thể thực hiện bằng cách tắt cột chọn), nhưng, tôi không muốn viền dày thêm xung quanh ô cụ thể mà bạn đã bấm để được đánh dấu. Tôi đã hy vọng điều này sẽ được dễ dàng nhưng dường như nó liên quan đến kết xuất đồ họa vì vậy tôi đã làm rất nhiều nghiên cứu và gần nhất tôi có thể nhận được là thế này:Java - Swing - JTable - Đặt màu cho hàng đã chọn, nhưng không phải ô

JTable contactTable = new JTable(tableModel); 

    contactTable.setCellSelectionEnabled(true); 
    contactTable.setColumnSelectionAllowed(false); 
    contactTable.setRowSelectionAllowed(false); 
    contactTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 

    // This renderer extends a component. It is used each time a 
    // cell must be displayed. 
    class MyTableCellRenderer extends JLabel implements TableCellRenderer { 
     // This method is called each time a cell in a column 
     // using this renderer needs to be rendered. 
     public Component getTableCellRendererComponent(JTable table, Object value, 
       boolean isSelected, boolean hasFocus, int rowIndex, int vColIndex) { 
      // 'value' is value contained in the cell located at 
      // (rowIndex, vColIndex) 

      if (isSelected) { 
       // cell (and perhaps other cells) are selected 

      } 

      if (hasFocus) { 
       // this cell is the anchor and the table has the focus 
       this.setBackground(Color.blue); 
       this.setForeground(Color.green); 
      } else { 
       this.setForeground(Color.black); 
      } 

      // Configure the component with the specified value 
      setText(value.toString()); 

      // Set tool tip if desired 
      // setToolTipText((String)value); 

      // Since the renderer is a component, return itself 
      return this; 
     } 

     // The following methods override the defaults for performance reasons 
     public void validate() {} 
     public void revalidate() {} 
     protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {} 
     public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {} 
    } 

    int vColIndex = 0; 
    TableColumn col = contactTable.getColumnModel().getColumn(vColIndex); 
    col.setCellRenderer(new MyTableCellRenderer()); 

tôi đã sao chép Renderer từ một ví dụ và chỉ thay đổi) chức năng (hasFocus để sử dụng các màu tôi muốn. Đặt màu ở isSelected() không làm gì cả.

Vấn đề với mã này là:

  1. Nó chỉ hoạt động trên một cột được chỉ định bởi vColIndex ở phía dưới. Rõ ràng là tôi muốn điều này được áp dụng cho tất cả các cột, do đó, nhấp vào một ô trong một cột làm nổi bật toàn bộ hàng. Tôi có thể thực hiện một vòng lặp for để thay đổi nó cho mỗi tế bào nhưng tôi con số có một cách tốt hơn để làm điều này mà thay đổi cellRenderer cho tất cả các cột cùng một lúc.

  2. setForegroundColor() hoạt động để thay đổi văn bản nhưng setBackgroundColor() không làm gì với nền ô. Tôi muốn nó thực sự thay đổi màu nền như tài sản ngụ ý.

    • Giải pháp cho # 2: Sử dụng this.setOpaque(true); trước khi gán màu nền.
  3. Khi trình kết xuất hoạt động, nó chỉ hoạt động trên một ô duy nhất. Làm thế nào tôi có thể làm cho nó tô màu tất cả các ô trong hàng?

    • Giải pháp cho # 3: Tôi đã tìm ra! Thay vì sử dụng hasFocus(), chỉ ảnh hưởng đến ô đơn lẻ, nếu bạn bật chọn hàng (table.setRowSelectionAllowed(true)) thì bạn đặt màu thay đổi trong câu lệnh if(isSelected). Sau đó, toàn bộ hàng được coi là lựa chọn và nó màu sắc tất cả các tế bào trong!

3 là người lớn nhưng nếu có ai biết # 1 hoặc có thể giải thích cho tôi lý do tại sao nó được thiết kế như vậy mà bạn chỉ có thể áp dụng các renderer đến một cột tại một thời điểm nó sẽ được nhiều đánh giá cao.

Trả lời

5

Các hướng dẫn bài viết Concepts: Editors and Renderers giải thích rằng "một đơn cell renderer thường được sử dụng để vẽ tất cả các tế bào có chứa cùng một loại dữ liệu", như được trả về bởi phương pháp của mô hình getColumnClass().

Cách khác, ghi đè prepareRenderer(), được gọi cho tất cả các ô, để thay đổi có chọn lọc giao diện của hàng. Điều này example so sánh hai phương pháp tiếp cận và bài viết Table Row Rendering mở rộng tính linh hoạt của phương pháp tiếp cận.

0

Đối với câu hỏi thứ hai, bạn có thể thử phương thức setSelectionBackground (Color) và setSelectionForeGround (Color). Tôi không chắc làm thế nào bạn có thể giải quyết cái đầu tiên. Và một đề nghị cuối cùng bạn có thể sử dụng một số plugin thiết kế swing như JBuilder ass. Nó sẽ giúp ích rất nhiều.

+0

Cảm ơn đã phản ứng. Tôi đã cố gắng sử dụng setSelectionBackground (Color) nhưng Eclipse cờ xuống nó như một phương thức không tồn tại. – Daniel

+0

Thực ra tôi đã tìm ra một phần, tôi đã chỉnh sửa bài đăng gốc. – Daniel

+0

Tôi đã thử phương thức setSelectionBackGround ngay bây giờ và nó hoạt động. Khi tôi chọn một hoặc nhiều hàng, màu của chúng sẽ thay đổi. Nhưng có lẽ tôi hiểu sai những gì bạn đang tìm kiếm. – mbaydar

12

quá trực tiếp chỉ thêm dòng

tablename.setSelectionBackground(Color.red); 

trong trường hợp của tôi

jtbillItems.setSelectionBackground(Color.red); 
+1

Chỉ khi bạn không có TableCellRenderer đặt màu nền. Trong trường hợp đó, bạn phải thêm một 'if (! IsSelected) {setBackground (color1);}'. – FaithReaper

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