Java 在一个JPanel中优化数千个JPanel

Java 在一个JPanel中优化数千个JPanel,java,swing,jpanel,Java,Swing,Jpanel,我对在现有面板上添加大约4000个新创建的JPanel组件的优化有问题 问题是,令人惊讶的是,它相当慢。几乎需要10秒才能完成添加,这对我来说相当慢 public static void main(String[] args) { JMenuItem mntmGenerateRandom = new JMenuItem("Generate random int"); mntmGenerateRandom.addActionListener(new ActionListen

我对在现有面板上添加大约4000个新创建的
JPanel
组件的优化有问题

问题是,令人惊讶的是,它相当慢。几乎需要10秒才能完成添加,这对我来说相当慢

public static void main(String[] args) {
    JMenuItem mntmGenerateRandom = new JMenuItem("Generate random int");
        mntmGenerateRandom.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                Random rand = new Random();
                for(int i = 0; i < 4000; i++){
                    intPositions.add(rand.nextInt(4000));
                    System.out.println(i);
                }
                quicksort(0, intPositions.size()-1, intPositions);
                long start = System.currentTimeMillis();
                repaintPanels();
                long stop = System.currentTimeMillis();
                System.out.println("Done in " + (stop-start) + "ms");
            }
        });
}

private void repaintPanels(){
    panelArray.clear();
    ExecutorService service = Executors.newWorkStealingPool();
    service.submit(new Runnable() {
        public void run() {
            for(int i = 0; i < intPositions.size(); i++){
                panelArray.add(i, new JPanel());
                panelArray.get(i).setBounds(intPositions.get(i), 1, 1, panelParent.getHeight()-2);
                panelParent.add(panelArray.get(i), 1);
            }
        }
    });
    panelParent.repaint();
    panelParent.revalidate();
}
publicstaticvoidmain(字符串[]args){
JMenuItem mntmGenerateRandom=新的JMenuItem(“生成随机整数”);
mntmgenerateradom.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件arg0){
Random rand=新的Random();
对于(int i=0;i<4000;i++){
添加(兰特nextInt(4000));
系统输出打印LN(i);
}
快速排序(0,intPositions.size()-1,intPositions);
长启动=System.currentTimeMillis();
重新绘制面板();
长时间停止=System.currentTimeMillis();
System.out.println(“完成于”+(停止-启动)+“毫秒”);
}
});
}
私有void重新绘制面板(){
panelArray.clear();
ExecutorService=Executors.newWorkStealingPool();
提交(新的Runnable(){
公开募捐{
对于(inti=0;i
这是简化的代码,删除了所有不必要的内容。最慢的部分是调用
panelParent.add(panelArray.get(I),1)时


有谁能帮我加快速度吗(如果可能的话)?

使用JTable。它可以使用一个JComponent子级(如JPanel)来绘制所有单元格,使用CellRenderer和CellEditor


这是一个轻量级模式,您也可以自己实现:在一个JPanel中绘制所有“面板”。

使用JTable。它可以使用一个JComponent子级(如JPanel)来绘制所有单元格,使用CellRenderer和CellEditor


这是一个轻量级模式,您也可以自己实现:在一个JPanel中绘制所有“面板”。

如果Joop要猜测解决方案,那么我也会


正如我在评论中所指出的,JPanel通常被用作容器,作为一个包含其他组件的组件,您似乎并没有将其用于此目的,而是(在我看来——但在您为我们澄清问题之前,我不能100%确定)绘制一幅图像。如果是这样,如果您试图绘制的是块或链接的不断变化的图像,该图像会随着排序算法(或您试图在模型中执行的任何操作)的变化而变化,那么为什么不使用一个图形JPanel,它的paintComponent已被覆盖,以及其绘制组件在模型更改时绘制模型的状态。这也比你想要达到的目标要轻得多。

如果Joop要猜出一个解决方案,那么我也要猜


正如我在评论中所指出的,JPanel通常被用作容器,作为一个包含其他组件的组件,您似乎并没有将其用于此目的,而是(在我看来——但在您为我们澄清问题之前,我不能100%确定)绘制一幅图像。如果是这样,如果您试图绘制的是块或链接的不断变化的图像,该图像会随着排序算法(或您试图在模型中执行的任何操作)的变化而变化,那么为什么不使用一个图形JPanel,它的paintComponent已被覆盖,以及其绘制组件在模型更改时绘制模型的状态。这也比你想要实现的要轻得多。

“…4000个新创建的JPanel”
——我会重新考虑这个设置。为什么你会需要4000个容器,而这正是JPanel的用途?我想知道你真正想要的是一个JPanel,一个可以绘制4000像素左右的容器吗?总之,你的问题是一个经典的问题,当最好的解决方案往往是使用完全不同的方法时,你会问如何解决特定的代码问题。你最好告诉我们你正在试图解决的总体问题,而不是你目前如何解决它。
“…4000个新创建的JPanel”
——我会重新考虑这个设置。为什么你会需要4000个容器,而这正是JPanel的用途?我想知道你真正想要的是一个JPanel,一个可以绘制4000像素左右的容器吗?总之,你的问题是一个经典的问题,当最好的解决方案往往是使用完全不同的方法时,你会问如何解决特定的代码问题。你最好告诉我们你试图解决的总体问题,而不是你目前试图解决的问题。我没有尝试使用覆盖了paintComponent的JPanel真是太愚蠢了。我想我会这么做的,这比我想的要容易得多。谢谢。@Jeerdus:不客气,但是——你到底想用你的程序创建什么?它的目的是什么,你在展示什么?还有,是否涉及到某些类型的动画--更改或演化图像?我希望有一个JPanel,其中有许多“线”,您可以编辑其属性,即位置、它们所持有的值等。我没有尝试使用覆盖了paintComponent的JPanel真是愚蠢。我想我会这么做的,这比我想的要容易得多。谢谢。@Jeerdus:不客气,但是——你到底想用你的程序创建什么?它的目的是什么,你在展示什么?另外,是否有一些类型的动画涉及-改变或演变的图像?我想有一个JPanel,其中有