l***y 发帖数: 4671 | 1 【 以下文字转载自 Java 讨论区 】
发信人: lummy (河马·云何), 信区: Java
标 题: 请教一个 JList + JScrollPane 的问题
发信站: BBS 未名空间站 (Wed Oct 24 22:40:56 2012, 美东)
Jlist 的 model 是运行中动态生成的。
当内容比较多时,scroll bar 并没变窄,而且拖到底并没有完全显示所有的 items。
把窗口向下拉长可以看到更多的 items。而且当窗口长过一定长度时 scroll bar 消失
。。。
貌似是 scroll bar 认为的 model 的长度比实际的要短得多。不知道该咋办。。。
多谢多谢! |
r****y 发帖数: 26819 | 2 贴code吧
有没有revalidate和repaint?
话说你怎么写上这个了。。。
【在 l***y 的大作中提到】 : 【 以下文字转载自 Java 讨论区 】 : 发信人: lummy (河马·云何), 信区: Java : 标 题: 请教一个 JList + JScrollPane 的问题 : 发信站: BBS 未名空间站 (Wed Oct 24 22:40:56 2012, 美东) : Jlist 的 model 是运行中动态生成的。 : 当内容比较多时,scroll bar 并没变窄,而且拖到底并没有完全显示所有的 items。 : 把窗口向下拉长可以看到更多的 items。而且当窗口长过一定长度时 scroll bar 消失 : 。。。 : 貌似是 scroll bar 认为的 model 的长度比实际的要短得多。不知道该咋办。。。 : 多谢多谢!
|
l***y 发帖数: 4671 | 3 实验了一下,没 work:
private void populateDrugList(){
DefaultListModel tmpModel = new DefaultListModel();
if (SharedData.drugIDs.size() == SharedData.drugDescs.size()){
for (int i = 0; i < SharedData.drugIDs.size(); i++) {
tmpModel.addElement(SharedData.drugIDs.get(i)+" "+
SharedData.drugDescs.get(i));
}
}
drugList.setModel(tmpModel);
drugList.revalidate();
drugList.repaint();
drugScrollPane.revalidate();
drugScrollPane.repaint();
}
【在 r****y 的大作中提到】 : 贴code吧 : 有没有revalidate和repaint? : 话说你怎么写上这个了。。。
|
r****y 发帖数: 26819 | 4 用setModel就不用revalidate和repaint了。
我这里测试没问题。
就拿着ListDemo现成的例子:
http://docs.oracle.com/javase/tutorial/uiswing/examples/compone
class里声明个变量:
private ArrayList personList = new ArrayList();
把actionPerformed改成:
public void actionPerformed(ActionEvent e) {
populateDrugList();
}
populateDrugList跟你定义的几乎一样:
private void populateDrugList(){
DefaultListModel model = new DefaultListModel();
personList.add("new person1");
personList.add("new person2");
personList.add("new person3");
for(String p : personList){
model.addElement(p);
}
list.setModel(model);
}
运行时先随便输入点啥,然后重复点Hire就可以。
【在 l***y 的大作中提到】 : 实验了一下,没 work: : private void populateDrugList(){ : DefaultListModel tmpModel = new DefaultListModel(); : if (SharedData.drugIDs.size() == SharedData.drugDescs.size()){ : for (int i = 0; i < SharedData.drugIDs.size(); i++) { : tmpModel.addElement(SharedData.drugIDs.get(i)+" "+ : SharedData.drugDescs.get(i)); : } : } : drugList.setModel(tmpModel);
|
l***y 发帖数: 4671 | 5 我开始用小数据集来实验,17 行的,貌似没问题。后来上三千多行的,就悲剧了。。。
【在 r****y 的大作中提到】 : 用setModel就不用revalidate和repaint了。 : 我这里测试没问题。 : 就拿着ListDemo现成的例子: : http://docs.oracle.com/javase/tutorial/uiswing/examples/compone : class里声明个变量: : private ArrayList personList = new ArrayList(); : 把actionPerformed改成: : public void actionPerformed(ActionEvent e) { : populateDrugList(); : }
|
r****y 发帖数: 26819 | 6 那我改成这样运行也没问题:
private void populateDrugList(){
DefaultListModel model = new DefaultListModel();
for(int i = 0; i < 5000; i ++) {
personList.add("new person" + i);
}
for(String p : personList){
model.addElement(p);
}
list.setModel(model);
}
scrollbar不会变更窄,但是scrollPosition会不断上升。
。。
【在 l***y 的大作中提到】 : 我开始用小数据集来实验,17 行的,貌似没问题。后来上三千多行的,就悲剧了。。。
|
r****y 发帖数: 26819 | 7 啊,我知道了,如果一直setSelectedIndex为0,就看不到任何变化,尽管list变长了。
你把selectedIndex改成最后一个,再加ensureIndexIsVisible,就会很有成就感了。
。。
【在 l***y 的大作中提到】 : 我开始用小数据集来实验,17 行的,貌似没问题。后来上三千多行的,就悲剧了。。。
|
l***y 发帖数: 4671 | 8 赞!刚刚也加到 3000,sample 的确没问题。在实验你说的。。。
了。
【在 r****y 的大作中提到】 : 啊,我知道了,如果一直setSelectedIndex为0,就看不到任何变化,尽管list变长了。 : 你把selectedIndex改成最后一个,再加ensureIndexIsVisible,就会很有成就感了。 : : 。。
|