Cách tạo một JTable không thể chỉnh sửa


Câu trả lời:


22

Bạn có thể sử dụng a TableModel.

Xác định một lớp như thế này:

public class MyModel extends AbstractTableModel{
    //not necessary
}

thực sự isCellEditable()falsetheo mặc định, vì vậy bạn có thể bỏ qua nó. (xem: http://docs.oracle.com/javase/6/docs/api/javax/swing/table/AbstractTableModel.html )

Sau đó, sử dụng setModel()phương pháp của bạn JTable.

JTable myTable = new JTable();
myTable.setModel(new MyModel());

1
Bạn không thể có một public voidphương thức trả về một boolean.
Geo

1
Ngoài ra phương pháp này làisCellEditable
Matt

Mặc dù cách tiếp cận bạn chỉ định hoạt động, nhưng không có phương pháp nào như isEditable trong AbstractTableModel. Điều tồn tại là phương thức isCellEditable (int, int) lấy rowIndex và coulmnIndex làm tham số. Người dùng có thể bật / tắt tính năng chỉnh sửa có chọn lọc cho một hàng / cột cụ thể bằng cách ghi đè phương thức "isCellEditable" hoặc có thể sử dụng triển khai mặc định để tắt chỉnh sửa cho tất cả các ô.
sateesh

150

Bạn có thể ghi đè phương thức isCellEditable và triển khai như bạn muốn, ví dụ:

//instance table model
DefaultTableModel tableModel = new DefaultTableModel() {

    @Override
    public boolean isCellEditable(int row, int column) {
       //all cells false
       return false;
    }
};

table.setModel(tableModel);

hoặc là

//instance table model
DefaultTableModel tableModel = new DefaultTableModel() {

   @Override
   public boolean isCellEditable(int row, int column) {
       //Only the third column
       return column == 3;
   }
};

table.setModel(tableModel);

Lưu ý nếu JTable của bạn biến mất

Nếu của bạn JTablebiến mất khi bạn sử dụng điều này, rất có thể vì bạn cần sử dụng hàm DefaultTableModel(Object[][] data, Object[] columnNames)tạo thay thế.

//instance table model
DefaultTableModel tableModel = new DefaultTableModel(data, columnNames) {

    @Override
    public boolean isCellEditable(int row, int column) {
       //all cells false
       return false;
    }
};

table.setModel(tableModel);

3
Đây cũng là giải pháp giúp cho các sự kiện nhấp đúp hoạt động chính xác với JTable. Một nhấp đúp thường được một ô sử dụng khi nó chuyển sang chế độ chỉnh sửa, và điều này sẽ ngăn một ô thực hiện điều đó và thay vào đó, gửi nhấp đúp vào chính JTable. Cảm ơn vì giải pháp, Nelson!
anchorrite vào

2
@Jop sau đó một cái gì đó là ở đâu đó sai trong mã của bạn - một bảng không bao giờ biến mất chỉ vì mô hình của bảng là không thể chỉnh sửa ...
Kleopatra

1
@DougHauf có vẻ như bạn không biết Java hoặc thực sự là bất kỳ ngôn ngữ nào vì hầu hết các ngôn ngữ sử dụng cú pháp giống nhau cho các phép toán boolean ... điều đó trả về boolean ... Tôi khuyên bạn nên tìm một Java rất cơ bản hướng dẫn và bắt đầu từ đầu. Cố gắng nhảy vào đu như thế này sẽ khiến bạn học sai mọi thứ.
searchhengine27

1
@DougHauf, dấu == là một bí danh của hàm Equals so sánh các đối tượng (ở bên trái và bên phải) và trả về một boolean. Tôi cho rằng bạn đã sử dụng câu lệnh if đánh giá boolean và thường được sử dụng với loại biểu thức này, ví dụ if (a == b) làm gì đó. Cố gắng in a == b hoặc chỉ gán giá trị này cho một biến và hiểu kết quả.
nelson domainsoro

1
Bản sửa lỗi ở trên cũng không hiệu quả với tôi. Nó làm cho cột và các phần tử dữ liệu của bảng biến mất. Bảng của tôi được tạo bằng table = new JTable (tempTable, columnNames) ;, trong đó tempTable là Chuỗi [] [] và Tên Cột là Chuỗi []. Tôi tin rằng sự cố là do DefaultTableModel () mới không chỉ định dữ liệu và tên cột cho mô hình bảng. Làm cách nào để chỉ định những điều đó trong mô hình dữ liệu. Tôi đã thử table.setModel (tableModel (tempTable, columnNames)) ;, nhưng điều đó gây ra lỗi "không thể tìm thấy biểu tượng".
dùng1164199

49
table.setDefaultEditor(Object.class, null);

2
Đây là câu trả lời tốt nhất và dễ nhất. Tất nhiên, bạn phải đặt trình chỉnh sửa thành null vì vậy bạn sẽ không thể chỉnh sửa nó.
LEMUEL ADANE

Điều này hoạt động tốt với lựa chọn duy nhất. Wich là yêu cầu của tôi.
Wesos de Queso

Đây phải là câu TRẢ LỜI!
KrishPrabakar

36

chỉ cần thêm

table.setEnabled(false);

Việc này ổn với tôi.


1
Điều này thật tuyệt nếu bạn không sử dụng mẫu bảng tùy chỉnh!
Kingsolmn

26
Nhưng bạn sẽ không thể chọn một ô hoặc hàng.
tianz,

3
Điều này sẽ trông "xám xịt" trong một số L & F.
stommestack

2
Điều đó hoạt động. Cảm ơn. Tuy nhiên, tôi vẫn muốn biết tại sao phương pháp mô hình dữ liệu của nelson lại khiến cột và các phần tử dữ liệu của bảng bị tách ra.
dùng1164199

1
Hoạt động tốt cho tôi!
Colby Cox

10

Nếu bạn đang tạo TableModel tự động từ một tập hợp các giá trị (với "JTable (Vector, Vector) mới"), có lẽ việc xóa trình chỉnh sửa khỏi các cột sẽ dễ dàng hơn:

JTable table = new JTable(my_rows, my_header);

for (int c = 0; c < table.getColumnCount(); c++)
{
    Class<?> col_class = table.getColumnClass(c);
    table.setDefaultEditor(col_class, null);        // remove editor
}

Nếu không có người chỉnh sửa, dữ liệu sẽ không thể chỉnh sửa được.


4
-1 hack ngẫu nhiên tại các địa điểm inappropriated là không bao giờ là một lựa chọn
Kleopatra

Xin vui lòng, bạn có thể giải thích tại sao nó là một "hack ngẫu nhiên tại các vị trí không phù hợp"? Theo doc setDefaultEditor () : "Nếu trình soạn thảo là null, hãy xóa trình soạn thảo mặc định cho lớp cột này."
freesoft

vâng, và trở lại mặc định cho Object ;-) Vì vậy, bạn không thực sự vô hiệu hóa việc chỉnh sửa (chỉ vô tình nếu một trong các cột thuộc loại Object), bạn cũng đang thiếu bất kỳ cột nào có thể có trình chỉnh sửa tùy chỉnh. Có một api có nghĩa là được triển khai để kiểm soát khả năng chỉnh sửa của ô và đó là của mô hình. Mọi thứ khác đều là hack và như vậy là không phù hợp.
kleopatra

Tôi thấy điểm của bạn. Nhưng những gì tôi hiểu từ api là, nếu tôi tạo một bảng theo cách nhanh chóng (với "JTable (Vector, Vector) mới"), thì bảng sẽ có các trình chỉnh sửa mặc định cho tất cả các cột của nó. Vì vậy, nếu tôi chạy "table.setDefaultEditor (column, null)", thì tôi sẽ xóa trình chỉnh sửa mặc định khỏi cột, vì vậy cột sẽ không có bất kỳ trình chỉnh sửa nào và cột sẽ không thể chỉnh sửa được. Sẽ là như vậy?
freesoft

Tôi đã tạo bảng theo cách đó new JTable(Vector, Vector)và hiệu quả với tôi. Tôi không cần biên tập viên trong phòng giam, vì vậy bạn có phiếu bầu của tôi.
Dani Sancas

3

Tôi đã sử dụng cái này và nó hoạt động: nó rất đơn giản và hoạt động tốt.

JTable myTable = new JTable();
myTable.setEnabled(false);

2
Lựa chọn sẽ không thể thực hiện được.
h3xStream

Giải pháp đơn giản và tốt đẹp
Nuwan Harshakumara Piyarathna

Câu hỏi về có thể chỉnh sửa không được bật. Kích hoạt không giải quyết được mục đích
shaILU

2

tạo lớp DefaultCellEditor mới:

public static class Editor_name extends DefaultCellEditor {
  public Editor_name(JCheckBox checkBox) {
   super(checkBox);
  }
  @Override
  public boolean isCellEditable(EventObject anEvent) {
    return false;
  }
}

và sử dụng setCellEditor:

JTable table = new JTable();
table.getColumn("columnName").setCellEditor(new Editor_name(new JCheckBox()));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.