2009-07-13 57 views
14

Tôi muốn xóa một số hàng khỏi JTable. Tôi làm nó như thế nào?Làm thế nào để loại bỏ một hàng khỏi JTable?

+6

Mẹo: nếu bạn giải thích những gì bạn đã cố gắng, và những gì trên mạng hướng dẫn bạn đã đọc, mọi người sẽ nghiêng nhiều hơn để giúp bạn. Hoặc cho một số mã mẫu và cho chúng tôi biết bit nào không hoạt động. Đọc này nếu bạn chưa: http://java.sun.com/docs/books/tutorial/uiswing/components/table.html –

Trả lời

3

Một JTable thường tạo thành phần Xem của triển khai MVC. Bạn sẽ muốn xóa các hàng khỏi mô hình của mình. JTable nên lắng nghe những thay đổi này, sẽ cập nhật để phản ánh việc xóa này. Do đó bạn sẽ không tìm thấy removeRow() hoặc tương tự như một phương thức trên JTable.

+0

thanx để được trợ giúp, nhưng tôi muốn biết cách xóa hàng khỏi mô hình bảng, im không nhận được bất kỳ phương thức nào. –

+1

Đọc qua những thứ như: http://java.sun.com/docs/books/tutorial/uiswing/components/table.html – dave

+0

Tóm lại, bạn tạo một TableModel tùy chỉnh. JTable không lưu trữ các hàng, nó ủy nhiệm cho một TableModel. Bạn có thể phân lớp từ AbstractTableModel nếu bạn muốn. Gọi fireTableRowsDeleted() mỗi khi bạn xóa các hàng. – dave

3

Nhìn vào DefaultTableModel cho một mô hình đơn giản mà bạn có thể sử dụng:

http://java.sun.com/javase/6/docs/api/javax/swing/table/DefaultTableModel.html

này kéo dài AbstractTableModel, nhưng nên là đủ cho mục đích cơ bản. Bạn luôn có thể mở rộng AbstractTableModel và tạo của riêng bạn. Hãy chắc chắn rằng bạn đặt nó trên JTable là tốt.

http://java.sun.com/javase/6/docs/api/javax/swing/table/AbstractTableModel.html

Nhìn vào hướng dẫn cơ bản Sun cho biết thêm thông tin về cách sử dụng JTable với mô hình bảng:

http://java.sun.com/docs/books/tutorial/uiswing/components/table.html#data

33

Để loại bỏ một hàng từ một JTable, bạn cần phải loại bỏ hàng mục tiêu từ phần cơ bản TableModel. Nếu, ví dụ, TableModel của bạn là một thể hiện của DefaultTableModel, bạn có thể loại bỏ một hàng bằng cách làm như sau:

((DefaultTableModel)myJTable.getModel()).removeRow(rowToRemove); 
+0

thanx để được trợ giúp, nhưng tôi đã sử dụng phương pháp này và nó không hoạt động. thực tế JTable của tôi đang sử dụng mô hình LocationTable (tạo riêng) extendind mô hình bảng trừu tượng vì vậy khi tôi đang sử dụng phương thức removeRow (i), nó sẽ đưa ra lỗi là "không thể giải quyết removeRow()" ..tôi sẽ sử dụng phương án nào khác .. –

+4

tạo TableModel tùy chỉnh của riêng bạn, sau đó bạn chịu trách nhiệm tạo phương thức "removeRow" của riêng mình. Nhìn vào mã nguồn của DefaultTableModel để xem cách thực hiện điều này. Giải pháp dễ dàng là sử dụng DefaultTableModel. Tại sao bạn nghĩ rằng bạn cần tạo một TableModel tùy chỉnh? Cho đến khi bạn hiểu những điều cơ bản của việc sử dụng các mô hình, hãy sử dụng các giá trị mặc định được cung cấp. – camickr

4

Các cách chính xác để áp dụng một bộ lọc để một JTable là thông qua giao diện bổ sung vào một TableRowSorter RowFilter. Sử dụng giao diện này, quan điểm của một mô hình có thể được thay đổi mà không thay đổi mô hình cơ bản. Chiến lược này bảo tồn mô hình Model-View-Controller, trong khi loại bỏ các hàng bạn muốn ẩn khỏi chính mô hình sẽ phá vỡ mô hình bằng cách gây nhầm lẫn cho việc phân tách mối quan tâm của bạn.

8

Nếu bạn cần một giải pháp làm việc đơn giản, hãy thử sử dụng DefaultTableModel.

Nếu bạn đã tạo mô hình bảng của riêng mình, mở rộng AbstractTableModel, thì bạn cũng nên triển khai phương thức removeRow(). Việc triển khai chính xác phụ thuộc vào cấu trúc cơ bản, mà bạn đã sử dụng để lưu trữ dữ liệu.

Ví dụ, nếu bạn đã sử dụng Vector, sau đó nó có thể là một cái gì đó như thế này:

public class SimpleTableModel extends AbstractTableModel { 
    private Vector<String> columnNames = new Vector<String>(); 
    // Each value in the vector is a row; String[] - row data; 
    private Vector<String[]> data = new Vector<String[]>(); 

    ... 

    public String getValueAt(int row, int col) { 
     return data.get(row)[col]; 
    } 

    ... 

    public void removeRow(int row) { 
     data.removeElementAt(row); 
    } 
} 

Nếu bạn đã sử dụng List, sau đó nó sẽ rất giống nhau:

// Each item in the list is a row; String[] - row data; 
List<String[]> arr = new ArrayList<String[]>(); 

public void removeRow(int row) { 
    data.remove(row); 
} 

HashMap :

//Integer - row number; String[] - row data; 
HashMap<Integer, String[]> data = new HashMap<Integer, String[]>(); 

public void removeRow(Integer row) { 
    data.remove(row); 
} 

Và nếu bạn đang sử dụng mảng như thế này

String[][] data = { { "a", "b" }, { "c", "d" } }; 

sau đó bạn không may mắn vì không có cách nào để tự động xóa các phần tử khỏi mảng. Bạn có thể cố gắng sử dụng các mảng bằng cách lưu trữ riêng một số cờ thông báo các hàng nào bị xóa và không phải là, hoặc bằng một số cách khác, nhưng tôi khuyên bạn nên chống lại nó ... Điều đó sẽ giới thiệu sự phức tạp không cần thiết và thực tế chỉ là giải quyết vấn đề bằng cách tạo một số khác. Đó là cách chắc chắn để kết thúc here. Hãy thử một trong các cách trên để lưu trữ dữ liệu bảng của bạn thay thế.

Đối hiểu rõ hơn về cách làm việc này, và phải làm gì để làm cho công việc mô hình riêng của bạn đúng, tôi mạnh khuyên bạn nên tham khảo Java Tutorial, DefaultTableModel API và nó source code.

3

mmm là chàng trai rất đơn giản

for(int i = model.getRowCount() - 1; i >= 0; i--) 
{ 
    model.removeRow(i); 
} 
+1

Không có gì như triệu thông báo vào buổi sáng ;-) – greenoldman

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