2013-07-04 4 views
1

EDIT : jicker가 scrollpane에 추가 한 것과 같습니다. 레이아웃 관리자가 열의 크기를 변경하고 있다는 것이 맞았던 것 같습니다.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에서 사용하는 테이블 모델의 코드입니다. doLayout() 방법은 테이블에 호출 될 때까지

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

폭은 결정하지 않습니다. 이 작업은 프레임을 pack() 할 때 수행되며 모든 구성 요소는 원하는 크기로 배치됩니다.

일단 프레임이 표시되면 원하는 너비로 열이 표시됩니다. 여전히 문제가 발생하면 DefaultTableModel과 표준 레이아웃 관리자를 사용하는 SSCCE를 게시하십시오. 당신이 스크롤에 테이블을 추가하지 않는 및 MigLayout는 테이블 컬럼의 크기에 영향을 미치고 있기 때문에 아마 원하는대로 열이 표시되지 않는 경우

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

.

관련 문제