2011-10-16 14 views
7

Tôi có một JTable với một số cột. Tôi muốn một cột cụ thể để thay đổi kích thước. Những gì tôi đã hy vọng là bằng cách sử dụng setPreferredWidth, cột sẽ đổi kích thước thành kích thước đó hoặc kích thước của các nội dung như vậy không cắt ngắn xảy ra và để phần còn lại của các cột mất không gian còn lại, nhưng thay vào đó, tất cả các cột, bao gồm cả tôi đã thay đổi kích thước, chia đều tất cả không gian của bảng; như thể setPreferredWidth đã làm không có gì ở tất cả. Trong thực tế, tôi muốn có thể thiết lập chiều rộng của một cột và có nó thu nhỏ đến kích thước đó mà không cắt bớt nội dung (tôi đã nhấn mạnh quá nhiều chưa?) Theo cách mà tất cả các cột chưa được thay đổi kích cỡ không gian còn lại. Sử dụng setMaxWidth cắt bớt nội dung (tôi đã đề cập đến tôi không thích điều đó?) Làm cách nào để thay đổi kích thước/thu nhỏ một cột mà không bị cắt xén và không làm việc hoàn toàn không có gì? Dưới đây là mã vi phạm:TableColumn setPreferredWidth không hoạt động

for (int i = 0, x = 0; i < table.getColumnModel().getColumnCount(); i++) 
    if ((x = model.getColumnWidth(i)) > -1) 
     table.getColumnModel().getColumn(i).setPreferredWidth(x); 

Bảng này là trong một JPanel (MyListPanel - BorderLayout) mà là ở một JPanel (GridBagLayout) thêm với:

new GridBagConstraints(0, 3, 1, 1, 1.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(2, 0, 0, 2), 0, 0)) 

EDIT: Đây là các nhà xây dựng cho tôi lớp con của JPanel:

public MyListPanel(boolean showHeader, String title, ColData...columns) { 
    super(new BorderLayout()); 
    model = new MyListTableModel(columns); 
    table = new JTable(model); 

    table.addFocusListener(this); 

    add(table); 
    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 

    setTitle(title); 

    if (showHeader) 
     add(table.getTableHeader(), BorderLayout.NORTH); 

    for (int i = 0, x = 0; i < table.getColumnModel().getColumnCount(); i++) 
     if ((x = model.getColumnWidth(i)) > -1) 
      table.getColumnModel().getColumn(i).setPreferredWidth(x); 

    setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED)); 
} 

Và MyListTableModel.ColData:

public static class ColData { 
    private int index; 
    private String title; 
    private int width; 
    public ColData(int _index, String _title, int _width) { index = _index; title = _title; width = _width; } 
} 

Trả lời

8

Bao gồm:

table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
+0

Không thực hiện mẹo: ( –

2

Tôi biết điều này là hơi muộn như vậy là chủ yếu cho độc giả trong tương lai, nhưng tôi đã có cùng một vấn đề và giải quyết nó bằng cách thiết lập cả ưa thích rộngchiều rộng tối đa của cột để cùng một giá trị.

3

Tôi gặp sự cố tương tự mặc dù đã thử hai câu trả lời khác tại đây. Trong trường hợp của tôi, một số lần chiều rộng sẽ được đặt chính xác trong khi thời gian khác, nó sẽ không. Tôi thấy vấn đề đã được gây ra bởi vì tôi đã cố gắng để thiết lập chiều rộng cột ngay lập tức sau khi thay đổi mô hình bảng của tôi. Tôi tìm thấy thiết lập chiều rộng cột bên trong của SwingUtilities.invokeLater() đã làm các trick. I E.

SwingUtilities.invokeLater(new Runnable(){ 

    @Override 
    public void run() { 
     int width = 100; 
     for (int column = 1; column < table.getColumnCount(); column++) { 
      columnModel.getColumn(column).setPreferredWidth(width); 
     } 
    } 
} 
+0

Tôi sẽ upvote bạn vì điều này có vẻ như nó có thể đã khắc phục được sự cố của tôi, nhưng tôi đã bỏ công việc đó. –

1

Tôi gặp vấn đề tương tự và đọc @Jay Askren answer, điều ngược lại đã hiệu quả đối với tôi. Tôi đã phải thiết lập chiều rộng trong phương thức mà bảng đã được tạo ra.

public class Example{ 
    //..stuff 
    private JTable myTable; 

    public Example{ 
    //..stuff 
    myTable = AnotherClass.getTable(); 
    myTable .getColumnModel().getColumn(0).setPreferredWidth(100);//not here 
    } 

} 

public class AnotherClass{ 
    public static JTable getTable(){ 
    JTable table= new JTable(); 
    table.setModel(anyModel); 
    table.getColumnModel().getColumn(0).setPreferredWidth(100);//Here! 
    return table 
    } 
}