2011-11-19 14 views
8

Tôi có một JList với các tên mục rất dài làm cho thanh cuộn ngang xuất hiện trong thanh cuộn.Từ bọc trong các mục của JList

Có cách nào để từ có thể bọc để toàn bộ tên mục xuất hiện trong 2 hàng nhưng có thể được chọn trong một lần nhấp không? I.E vẫn phải hành xử làm một mục nhưng được hiển thị ở hai hàng.


Đây là những gì tôi đã làm sau khi xem ví dụ dưới đây

Tôi đã thêm một lớp mới để MyCellRenderer dự án của tôi và sau đó tôi đã đi thêm MyList.setCellRenderer(new MyCellRenderer(80)); trong bài tạo mã của Danh sách của tôi. Tôi có cần làm gì khác không?

+4

Sử dụng trình kết xuất ô tùy chỉnh. –

+0

Tôi dường như nhớ lại một ai đó (đã là Andrew) bằng cách sử dụng một JLabel, HTML và các bảng định kiểu đơn giản để giải quyết một cái gì đó như thế này. –

+0

Có, tất nhiên, đó là Andrew: [là-có-một-từ-bọc-tài sản-của-jlabel-tồn tại] (http://stackoverflow.com/questions/7861724/is-there-some-word- wrap-property-of-jlabel-exist/7861833 # 7861833). Tôi tin rằng khái niệm này cũng có thể được sử dụng trong trình kết xuất ô tùy chỉnh của bạn. –

Trả lời

19

Yep, sử dụng mã Andrew, tôi đã đưa ra một cái gì đó như thế này:

import java.awt.Component; 
import javax.swing.*; 

public class JListLimitWidth { 
    public static void main(String[] args) { 
     String[] names = { "John Smith", "engelbert humperdinck", 
      "john jacob jingleheimer schmidt" }; 
     MyCellRenderer cellRenderer = new MyCellRenderer(80); 
     JList list = new JList(names); 
     list.setCellRenderer(cellRenderer); 
     JScrollPane sPane = new JScrollPane(list); 
     JPanel panel = new JPanel(); 
     panel.add(sPane); 
     JOptionPane.showMessageDialog(null, panel); 

    } 
} 

class MyCellRenderer extends DefaultListCellRenderer { 
    public static final String HTML_1 = "<html><body style='width: "; 
    public static final String HTML_2 = "px'>"; 
    public static final String HTML_3 = "</html>"; 
    private int width; 

    public MyCellRenderer(int width) { 
     this.width = width; 
    } 

    @Override 
    public Component getListCellRendererComponent(JList list, Object value, 
     int index, boolean isSelected, boolean cellHasFocus) { 
     String text = HTML_1 + String.valueOf(width) + HTML_2 + value.toString() 
      + HTML_3; 
     return super.getListCellRendererComponent(list, text, index, isSelected, 
      cellHasFocus); 
    } 

} 
+1

+1 hmmmm cách dễ dàng – mKorbel

+2

Đó không phải là những thông minh của tôi mà đã làm điều này nhưng điều này ở đây: [Bài đăng của Andrew] (http://stackoverflow.com/questions/7861724/is-there-some-word-wrap-property- của-jlabel-exist/7861833 # 7861833). Tôi không thể upvote câu trả lời của mình nhiều hơn một lần, nhưng tôi khuyến khích bất cứ ai nghĩ rằng câu trả lời của tôi là hữu ích để upvote liên kết. –

+0

Tuyệt vời! Tôi đề nghị chúng tôi upvote cả! –

-1

Bạn cũng có thể tính toán tự động chiều rộng (thay vì một giá trị cố định):

String text = HTML_1 + String.valueOf(**list.getWidth()**) + HTML_2 + value.toString() + HTML_3; 

Vì vậy, nếu bảng điều khiển thay đổi kích thước danh sách, gói vẫn chính xác.

Cập nhật

Và kết quả sẽ như thế này: enter image description here

+0

Điều này không hoạt động. Nếu JList được thay đổi kích thước chiều cao của hàng sẽ không được điều chỉnh và những điều trực quan vui nhộn xảy ra. Xem hình ảnh đính kèm của tôi ... Tôi đã thêm màu xanh lục và đỏ để giúp minh họa. – Jason

0

Nó có thể được thực hiện dễ dàng hơn. Bạn có thể tạo JList bằng consatructor với ListModel. Trong CustomListModel mở rộng AbstractListModel, phương thức getElementAt() có thể trả về String với cùng một văn bản định dạng html. Vì vậy, cách này làm tương tự mà không cần sửa đổi trình kết xuất ô.

+2

Gói là giao diện người dùng chứ không phải mô hình liên quan. Thay đổi mô hình để phù hợp với giao diện người dùng là xấu. – SurfMan