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(' ');
}
}
}
'getWidth'는'preferredWidth'와 같을 필요가 없습니다.'preferredWidth'는 레이아웃에 대한 최종 결정을 담당하는 API 부분에서 사용자가 원하는 것을 제안하고 오버라이드 할 수 있습니다. – MadProgrammer
일반적으로 AUTO_RESIZE_OFF를 사용하면 테이블의 초기 표시시 너비가 기본 너비와 같아야합니다. 레이아웃 관리자는 너비에 영향을주지 않아야합니다. 즉, 가로 스크롤 막대가 보일 것입니다. 그렇지 않으면 마지막 열의 오른쪽에 빈 공간이 표시됩니다. 이것은 물론 테이블이 scrollPane에 추가되었다고 가정합니다. 그러나 사용자가 수동으로 열 너비를 변경하면 일치하지 않을 수 있습니다. – camickr