gpt4 book ai didi

java - 调用 setPreferredWidth 时,JTable 列不会调整大小

转载 作者:行者123 更新时间:2023-11-30 04:19:28 24 4
gpt4 key购买 nike

编辑:根据 camickr 的建议,我将 JTable 添加到滚动 Pane 中。看来他/她认为布局管理器正在改变列的大小是正确的。

我有一个包含 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 使用的表模型的代码。

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(' ');
}
}
}

最佳答案

在表格上调用 doLayout() 方法之前,不会确定宽度。当您 pack() 框架并且所有组件都以其首选尺寸布局时,就会完成此操作。

一旦框架可见,列就会以其首选宽度显示。如果您仍然遇到问题,请发布使用 DefaultTableModel 和标准布局管理器的 SSCCE。

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

如果列未按您希望的方式显示,可能是因为您没有将表格添加到滚动 Pane ,并且 MigLayout 正在影响表格列的大小。

关于java - 调用 setPreferredWidth 时,JTable 列不会调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17460367/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com