gpt4 book ai didi

java - Swing 中使用 AbstractListModel 的大型虚拟列表——限制为 119,000,000 个项目?

转载 作者:行者123 更新时间:2023-11-29 07:23:14 29 4
gpt4 key购买 nike

我的“虚拟列表”在 swing 中运行良好,但当我超过某些特定数量的项目时它似乎失败了。 “失败”是指当项目数 > Nmax 时滚动条神奇地消失,当项目数 <= Nmax 时滚动条又回来;在我的系统上,Nmax 似乎在 119,304,000 左右。

我遇到了什么?!?!

(这是一个测试程序:在我的电脑上,如果我输入 119,304 它工作正常,但是我点击向上箭头,滚动条消失了)

package com.example.test;

import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.AbstractListModel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

// based on:
// http://www.java2s.com/Tutorial/Java/0240__Swing/extendsAbstractListModel.htm
// http://www.java2s.com/Tutorial/Java/0240__Swing/SpinnerNumberModel.htm
// http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/SpinnerNumberModel.html
// http://www.java2s.com/Tutorial/Java/0240__Swing/ListeningforJSpinnerEventswithaChangeListener.htm
// http://java.sun.com/products/jfc/tsc/tech_topics/jlist_1/jlist.html

public class BigVirtualList extends JFrame {

public static void main(String[] args) {
new BigVirtualList();
}

static final int initialLength = 1;
final private JList list1 = new JList();
final private BVLData bvldata = new BVLData(initialLength*1000);

public BigVirtualList() {
this.setTitle("Big virtual list");
this.getContentPane().setLayout(new BorderLayout());
this.setSize(new Dimension(400, 300));
list1.setModel(bvldata);

list1.setPrototypeCellValue(list1.getModel().getElementAt(0));


SpinnerModel model1 = new SpinnerNumberModel(initialLength,1,1000000,1);
final JSpinner spinner1 = new JSpinner(model1);

this.getContentPane().add(new JScrollPane(list1), BorderLayout.CENTER);
JLabel label1 = new JLabel("Length (1000s of items):");
JPanel panel1 = new JPanel(new BorderLayout());
panel1.add(label1, BorderLayout.WEST);
panel1.add(spinner1, BorderLayout.CENTER);
this.getContentPane().add(panel1, BorderLayout.SOUTH);

ChangeListener listener = new ChangeListener() {
public void stateChanged(ChangeEvent e) {
Integer newLength = (Integer)spinner1.getValue();
bvldata.setLength(newLength*1000);
}
};

spinner1.addChangeListener(listener);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
}

class BVLData extends AbstractListModel {
public BVLData(int length) { this.length = length; }

private int length;

public int getLength() { return length; }
public void setLength(int length) {
int oldLength = getLength();
this.length = length;
int newLength = getLength();

if (newLength > oldLength)
fireIntervalAdded(this, oldLength+1, newLength);
else if (newLength < oldLength)
fireIntervalRemoved(this, newLength+1, oldLength);
}

@Override
public Object getElementAt(int index) {
return "Item "+index+" mod 107 = "+(index%107);
}

@Override
public int getSize() { return getLength(); }

}

最佳答案

好吧,我看不出目的,但无论如何......

我猜你打破了滚动 Pane 中某处的整数最大值:

System.out.println("CellHeight:"+list1.getFixedCellHeight());
System.out.println("CellHeight*119304000:"+NumberFormat.getNumberInstance().format(list1.getFixedCellHeight()*119304000.0));
System.out.println("MAXINT:"+Integer.MAX_VALUE);

给你数字:

CellHeight:18CellHeight*119304000:2.147.472.000MAXINT:2.147.483.647

如您所见,再增加 18000 像素的高度将超出 MAXINT ......这会给您带来麻烦。

关于java - Swing 中使用 AbstractListModel 的大型虚拟列表——限制为 119,000,000 个项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/644612/

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