问题描述
在我的应用程序中,我使用带有 JScrollpane 的 JList 来显示操作日志。 为此,我这样做:
logModel = new DefaultListModel();
logModel.ensureCapacity(300);
logList = new JList(logModel);
logList.setPreferredSize(new Dimension(300,150));
logList.setVisibleRowCount(6);
JScrollPane sp = new JScrollPane(logList);
sp.setHorizontalScrollBar(null);
GridBagConstraints gbc_logList = new GridBagConstraints();
gbc_logList.anchor = GridBagConstraints.WEST;
gbc_logList.gridx = 0;
gbc_logList.gridy = 6;
gbc_logList.weightx = 1.0;
gbc_logList.weighty = 0.5;
gbc_logList.gridwidth = 3;
pane.add(sp,gbc_logList);
但是如果我开始添加项目,列表只显示最大。列表中的 9 项。但模型报告的尺寸大小合适(如样本 11) 我添加了一个像
这样的序列 private void createFolderSequence() {
logModel.add(logModel.getSize(),"Create Folder: JNIFolder in root");
int res = createFolder("JNIFolder","/");
logModel.add(logModel.getSize(),"Created: " + Integer.toString(res));
logModel.add(logModel.getSize(),"Create Folder: JNIFolder2 in /JNIFolder/");
res = createFolder("JNIFolder2","/JNIFolder/");
logModel.add(logModel.getSize(),"Rename Folder: JNIFolder2 to NIFolder3");
res = renameFolder("/JNIFolder/JNIFolder2","JNIFolder3");
logModel.add(logModel.getSize(),"Renamed: " + Integer.toString(res));
logModel.add(logModel.getSize(),"Remove Folder: JNIFolder2");
res = removeFolder("/JNIFolder/JNIFolder2");
logModel.add(logModel.getSize(),"Removed: " + Integer.toString(res));
System.out.println(logModel.getSize());
logModel.add(logModel.getSize(),"Remove Folder: JNIFolder3");
logModel.add(logModel.getSize(),"Remove Folder: JNIFolder3");
res = removeFolder("/JNIFolder/JNIFolder3");
logModel.add(logModel.getSize(),"Removed: " + Integer.toString(res));
System.out.println(logModel.getSize()); //Print 11
}
控制台显示最后 11 个,但列表中只有 9 个项目,如果我向下滚动也是如此。 知道我做错了什么或错过了什么吗?
解决方法
logList.setPreferredSize(new Dimension(300,150));
不要对首选大小进行硬编码。 (删除该语句)。
您希望 JList 在从 ListModel 添加/删除项目时动态计算其首选大小。
滚动条将根据需要出现。