2010-07-11 33 views
5

Tôi đã tạo ra một cột với các tế bào có chứa một JTextArea + A JButton bên trong nó, như bạn có thể nhìn thấy trong hình dưới đây trong Cột 3:Tôi có thể tạo cột JTable không có đường viền không?

alt text

Nhưng tôi đã phải đối mặt với rất nhiều vấn đề với CellRenderer của tôi và CellEditor khi cập nhật các giá trị ô trong cột đó, vì mã của tôi hơi phức tạp một chút. Vì vậy, thay vào đó tôi muốn thay thế cột đó bằng 2 cột. Một cột phải là các ô chuỗi bình thường và ô còn lại là Các ô JButton nhưng 2 cột này sẽ có cùng giao diện như cột 3 xuất hiện trong hình trên. Vì vậy, câu hỏi của tôi là:

1. Làm cách nào để hợp nhất các tiêu đề của 2 cột lại với nhau?

2. Làm cách nào để xóa đường viền trái của cột JButton?

Nếu chúng được cố định, theo cách đó, 2 cột sẽ có giao diện giống như hình ảnh trên + việc cập nhật giá trị ô sẽ dễ dàng hơn nhiều.

-------------------------------- Chỉnh sửa: My vấn đề mẫu mã:

Ok các bạn ... Bạn đã yêu cầu. Mã của tôi rất lớn nhưng nếu bạn có thể giúp tôi sửa nó, điều đó sẽ hoàn hảo. Tôi đã tạo một mẫu jar đang chạy cho vấn đề của mình & cũng bao gồm mã nguồn của tôi. Bạn có thể tải về từ đây:

Jar sample

Vấn đề là tôi sử dụng một nút để cho phép phân loại hàng bảng (Di chuyển họ lên/xuống), nhưng khi tôi làm điều này một số các tế bào di chuyển giá trị không đã cập nhật!

Bạn có thể xem ảnh chụp màn hình sau: alt text Sự cố trong trình chỉnh sửa ô đang sử dụng ... Nhưng tôi không thể khắc phục được.

+0

Hiện chúng tôi đang xây dựng giao diện người dùng của bạn để chúng tôi có thể giúp bạn nhiều hơn chính xác. – msw

+0

Tôi bỏ cuộc, mã này không hoạt động, xin lỗi. –

+0

Không hoạt động? ... Chỉ cần nhấp đúp vào bình để chạy nó. – Brad

Trả lời

0

Bạn có thể tạo JButton không biên giới (đường viền trống) để triển khai TableCellRenderer?

+1

Tôi cần xóa đường viền ô (Đường viền trái) ... Không phải đường viền của nút! – Brad

2

CẬP NHẬT khi bạn tạo mô hình bảng trống, tạo hai phiên bản của ButtonCellRenderer (thay vì 4) và đặt một trường hợp làm trình chỉnh sửa và trình kết xuất cho cột 2 và cột thứ hai cho cột 3. hiển thị các giá trị sai khi di chuyển các hàng, nhưng đôi khi rút ra ô trống khi di chuột.

Và về mã không hoạt động, khởi động lại chỉnh sửa ô bất cứ khi nào chuột di chuyển có thể gây ra sự cố vì bạn chuyển đổi giữa trình chỉnh sửa ô và trình kết xuất ở mọi lần di chuyển chuột. Tôi không thể chỉnh sửa bất kỳ giá trị mặc dù bạn sử dụng JTextArea (mà nên được JTextField). Tạo mô hình bảng mỗi khi bạn thay đổi thứ tự các hàng là ok, nhưng tốt hơn là tạo một lớp chứa các giá trị cho tất cả các cột và sử dụng Vector của các lớp này làm mô hình bảng. Bằng cách này bạn có thể sắp xếp lại các giá trị trong mô hình vector và bảng sẽ được cập nhật.

Nếu bạn muốn hợp nhất hai tiêu đề, ghi đè getHeaderRect(int col) của JTableHeader, để trả lại liên kết super.getHeaderRect() cho hai cột. Bạn cũng có thể cần phải ghi đè lên phương thức paint() của BasicTableHeaderUI để vẽ tiêu đề rộng hơn hai phần trước.

Đây là phương pháp tôi đã sử dụng để hợp nhất các ô bảng, nhưng nó cũng sẽ hoạt động đối với các tiêu đề.

Xin lỗi, tôi không thể cung cấp cho bạn mã chính xác. Cá nhân, tôi sẽ làm với việc viết trình kết xuất ô tùy chỉnh, tức là cách tiếp cận đầu tiên của bạn.

EDIT Nếu bạn muốn sử dụng kim loại LAF, mã này kinda hiện các trick không vẽ tiêu đề của cột thứ hai:

final TableCellRenderer defaultRenderer = getTableHeader().getDefaultRenderer(); 
    getTableHeader().setDefaultRenderer(new DefaultTableCellRenderer() { 
     @Override 
     public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
      JLabel c = (JLabel) defaultRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
      if (column == 1) 
       c.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 0, Color.gray)); 
      else if (column == 2) { 
       c.setBorder(BorderFactory.createMatteBorder(1, 0, 1, 1, Color.gray)); 
       c.setText(null); 
      } else 
       c.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, Color.gray)); 
      return c; 
     } 
    }); 
+0

Cảm ơn những nỗ lực của tulskiy ... Tôi đã chỉnh sửa câu hỏi của mình để đặt một mẫu mã về các vấn đề của tôi. – Brad

+0

Cảm ơn tulskiy đã giúp bạn ... Bạn có thể cho tôi một ví dụ về cách ghi đè getHeaderRect (...) để trả lại 2 cột không? – Brad

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