2013-07-04 39 views
1

編輯: 正如camickr所建議的,我將JTable添加到滾動窗格。他/她似乎是正確的,佈局經理正在改變列的大小。當調用setPreferredWidth時,JTable列不調整大小

我有一個50行40列的JTable。每個單元格都不顯示任何內容或單個字符。

我想通過將行高和列寬設置爲相同的值來使每個單元格爲正方形。

public IFace() { 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(100, 100, 966, 740); 

    JMenuBar menuBar = new JMenuBar(); 
    setJMenuBar(menuBar); 

    mntmFile = new JMenuItem("File"); 
    menuBar.add(mntmFile); 
    contentPane = new JPanel(); 
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    setContentPane(contentPane); 
    contentPane.setLayout(new MigLayout("", "[457.00,grow][grow]", "[][grow][center][][grow]")); 

    JToolBar toolBar = new JToolBar(); 
    contentPane.add(toolBar, "cell 0 0"); 

    lblPalette = new JLabel("Palette"); 
    contentPane.add(lblPalette, "cell 1 0"); 

    AsciiTableModel myTableModel = new AsciiTableModel(); 
    tableASCII = new JTable(myTableModel); 
    tableASCII.getSelectionModel(); 
    tableASCII.getSelectionModel().setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); 
    tableASCII.setCellSelectionEnabled(true); 

    tableASCII.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
    System.out.println(tableASCII.getColumnModel().getColumn(0).getMaxWidth()); 
    final int cellSize = 20; 

    for(int i = 0; i < tableASCII.getColumnCount(); i++){ 
     tableASCII.getColumnModel().getColumn(i).setPreferredWidth(cellSize); 
     System.out.println(tableASCII.getColumnModel().getColumn(i).getWidth()); 
    } 

    for(int i = 0; i < tableASCII.getRowCount(); i++){ 
     tableASCII.setRowHeight(i, cellSize); 
    } 


    contentPane.add(tableASCII, "cell 0 1,span 0 5"); 

    btnFill = new JButton("Fill"); 
    contentPane.add(btnFill, "flowx,cell 1 2"); 

    textFill = new JTextField(); 
    textFill.setHorizontalAlignment(SwingConstants.CENTER); 
    contentPane.add(textFill, "cell 1 2"); 
    textFill.setColumns(10); 
} 

主叫setPreferredWidth(cellSize)後,System.out.println(tableASCII.getColumnModel().getColumn(i).getWidth());輸出爲75。它應該是20.

這是tableASCII使用的tablemodel的代碼。

public class AsciiTableModel extends AbstractTableModel { 

public final int NUM_CHARACTERS_PER_CELL = 1; 
private int numColumns = 50; 
private int numRows = 40; 
private List<ArrayList<Character>> asciiChars = new ArrayList<ArrayList<Character>>(); 

public AsciiTableModel() { 
    createListElements(); 
    System.out.println(asciiChars.get(0).size()); 
    asciiChars.get(2).set(0, 'C'); 
    asciiChars.get(1).set(0, 'a'); 
    asciiChars.get(1).set(1, 't'); 


} 

public AsciiTableModel(int rows, int columns) { 
    numColumns = columns; 
    numRows = rows; 
} 

@Override 
public int getColumnCount() { 
    // TODO Auto-generated method stub 
    return numColumns; 
} 

@Override 
public int getRowCount() { 
    // TODO Auto-generated method stub 
    return numRows; 
} 

@Override 
public Object getValueAt(int rowIndex, int columnIndex) { 
    // TODO Auto-generated method stub 
    return asciiChars.get(rowIndex).get(columnIndex); 
} 
public boolean isCellEditable(int rowIndex, int columnIndex) { 
    return true; 
} 

@Override 
public void setValueAt(Object aValue, int rowIndex, int columnIndex) { 
    if(aValue != null) { 
     //System.out.println(aValue.toString()); 
     asciiChars.get(rowIndex).set(columnIndex, aValue.toString().charAt(1)); 
     //System.out.println(asciiChars.get(rowIndex).get(columnIndex)); 
    } 
} 


void createListElements() { 
    for(int i = 0; i < numRows; i++) { 
     asciiChars.add(new ArrayList<Character>()); 
     for(int j = 0; j < numColumns; j++) { 
      asciiChars.get(i).add(' '); 
     } 
    } 
} 
+0

'getWidth'不必等於'preferredWidth','preferredWidth'是一個你想要什麼的建議,並且可能被負責作出關於佈局的最終​​決定的API的部分所覆蓋... – MadProgrammer

+0

雖然通常是正確的,但使用AUTO_RESIZE_OFF時,寬度應等於表格初始顯示時的首選寬度。佈局管理器應該對寬度沒有影響。那就是你會看到一個水平滾動條,或者你會看到最後一列右邊的空白空間。這當然假定表格被添加到一個scrollPane中。但是,如果用戶手動更改列的寬度,那麼它們可能不匹配。 – camickr

回答

2

直到doLayout()方法對錶調用的寬度沒有得到確定的。這是在您打包()框架時完成的,並且所有組件都按照它們的首選尺寸進行佈局。

一旦框架變得可見,列將以其首選寬度顯示。如果仍有問題,請發佈使用DefaultTableModel和標準佈局管理器的SSCCE。

contentPane.add(tableASCII, "cell 0 1,span 0 5"); 

如果你喜歡它,可能是因爲您不添加該表到一個滾動面板和MigLayout是影響表列大小無法顯示的列。

相關問題