2011-09-20 38 views
5

Tôi đang gặp sự cố khi thêm văn bản vào JTextArea sau khi sử dụng DocumentFilter, Tôi cần nối thêm chuỗi trên JTextArea sau khi văn bản được tải lên từ tệp và cũng trả về một chuỗi từ JTextArea của một JFrame khác đến JTextAreaNối văn bản vào JTextArea sau khi sử dụng DocumentFilter

tất cả mọi thứ hoạt động hoàn hảo khi tôi không sử dụng DocumentFilter.FilterBypass cho đến khi tôi thêm nó. Nó vẫn hoạt động một chút nhưng chỉ khi dấu phẩy (,) hoặc dấu cách ("") không được thêm vào. Mà không phải là đặc điểm kỹ thuật tôi đã được đưa ra.

Tôi làm cách nào để giải quyết vấn đề này? Hoặc là có bất kỳ thuật toán hoặc thực hiện mà không cung cấp cho vấn đề này?

Đây là mã insertString để lọc theo chiều dài, và chỉ cho phép không gian và dấu phẩy

public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException { 
    // if (string == null || string.trim().equals("") || string.equals(",")) 
    // { 
    // return; 
    // } 

    if (isNumeric(string)) { 
     // if (this.length > 0 && fb.getDocument().getLength() + 
     // string.length() 
     // > this.length) { 
     // return; 
     // } 
     if (fb.getDocument().getLength() + string.length() > this.length || string.trim().equals("") || string.equals(",")) { 
      this.insertString(fb, offset, string, attr); 
     } 
     // if (string == null || string.trim().equals("") || 
     // string.equals(",")) { 
     // return; 
     // } 
     super.insertString(fb, offset, string, attr); 
    } 
    else if (string == null || string.trim().equals("") || string.equals(",")) { 
     super.insertString(fb, offset, string, attr); 
    } 

} 

@Override 
public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException { 
    if (isNumeric(text)) { 
     if (this.length > 0 && fb.getDocument().getLength() + text.length() > this.length) { 
      return; 
     } 
     super.insertString(fb, offset, text, attrs); 
    } 
} 

/** 
* This method tests whether given text can be represented as number. This 
* method can be enhanced further for specific needs. 
* 
* @param text 
*   Input text. 
* @return {@code true} if given string can be converted to number; 
*   otherwise returns {@code false}. 
*/ 
private boolean isNumeric(String text) { 
    if (text == null || text.trim().equals("") || text.equals(",")) { 
     return true; 
    } 
    for (int iCount = 0; iCount < text.length(); iCount++) { 
     if (!Character.isDigit(text.charAt(iCount))) { 
      return false; 
     } 
    } 
    return true; 
} 

Hai chức năng khác (thêm từ file & thêm từ một khung khác nhau) Tôi muốn thực hiện một cách ngây thơ bằng cách chỉ phụ thêm giá trị chuỗi của chúng cho JTextArea được lọc bằng cách sử dụng này. Nhưng bị từ chối bởi super.insertString (.....)

+0

Bạn là mã nào sử dụng tại thời điểm đó không hoạt động? Tâm trí đăng nó? – sealz

+0

Không có vấn đề, nhưng mặc dù nó dài. Phải đính kèm mã của hai khung hình – nnanna

+0

có thể chỉ là đoạn trích mà bạn đang cố thêm "," và ""? – sealz

Trả lời

1

Tôi không chắc tôi thực sự nhận được câu hỏi của bạn. Nếu bạn muốn có bộ lọc nơi bạn có thể dán số hoàn chỉnh hoặc "," và khoảng trắng (kết thúc hoặc bắt đầu hoặc đã nhập) nhưng không thể dán bất kỳ văn bản nào khác, bạn chỉ có thể thay đổi hàm isNumeric:

private boolean isNumeric(String text) { 
    text = text.trim(); 
    if(",".equals(text)) return true; 
    ParsePosition position = new ParsePosition(0); 
    java.text.NumberFormat.getNumberInstance().parse(text, position); 
    return position.getIndex() == text.length(); 
} 
+0

bạn không cần kiểm tra khác trong phương pháp insertString của bạn trong trường hợp này – Christian

+0

Cảm ơn bài đăng, tôi đã tò mò về bài đăng này trong tuần trước và hy vọng đây là câu trả lời. Vì vậy, với chỉ một giờ còn lại tôi sẽ trao cho bạn tiền thưởng. – sealz

+0

Wow, cảm ơn! Tôi hy vọng nó thực sự giải quyết vấn đề của bạn. – Christian

0

Bạn có thể cần phải lấy vị trí carat trước khi thêm văn bản. Tôi không quen thuộc với DocumentFilters và tôi giả định rằng phương pháp this.append("stringzzz") không có sẵn?

Dường như có sự cố với bù đắp của bạn. Bạn có thể cần phải thiết lập nó để có được một vị trí đầu tiên, một cái gì đó như dưới đây. InsertString() Doc (OffSet)

Để nhận được vị trí carat, bạn có thể thực hiện điều gì đó như TextPane.getCaretPosition(), và chuyển nội dung đó vào. Thay vì sử dụng FilterByPass?

Giống như (như đề xuất trong liên kết của tôi)

this.insertString(TextArea.getCaretPosition(), yourString, null); 

Dưới đây là một liên kết mà có thể giúp đỡ một số.

Inserting Text without FilterByPass

Hãy cho tôi biết nếu tôi cách tắt :)

+0

-1, Nhận xét của bạn về vị trí dấu mũ không liên quan đến sự cố. Một Document (hoặc Model) không biết gì về thành phần Swing (khung nhìn). Hãy nhớ rằng một mô hình có thể được chia sẻ bởi nhiều thành phần. Một DocumentFilter được sử dụng để chỉnh sửa văn bản trước khi nó được chèn vào Document. Nếu mã OP không hoạt động vì logic trong DocumentFilter là sai. – camickr

+0

@camickr Làm cho cảm giác anh ấy đã làm tôi bối rối khi anh ấy nói nó hoạt động nhưng chỉ khi không sử dụng các nhân vật cụ thể, và sau đó nói nó làm việc miễn là anh ấy không quay lại với nó. Vì vậy, nó khiến tôi tin rằng đó là điều gì đó khác. – sealz

+0

@camickr, Bạn có phiền không, nếu tôi dán mã cho logic của bộ lọc tài liệu để bạn có thể xem. Đọc javadoc một số chi tiết, và có vẻ như vấn đề không phải từ chính documentfilter, mà là lớp AbstractDocument. – nnanna

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