小编典典

抽象表模型getValueAt性能

java

我是的新手JTable,也许我听不懂。

假设我有ArrayList1000 Studentsid, name, surname, age)。我想向所有的学生展示JTable。据我了解,我必须创建StudentTableModelextends AbstractTableModel并设置StudentTableModelJTable。因此,我们可以认为StudentTableModel是我们ArrayList与表之间的“适配器”
。在互联网上,我找到了这样的示例实现getValueAt

 public Object getValueAt(int row, int col) {
      Student student = arrayList.get(row);
      switch (col) {
      case 0:
        return student.getId();
      case 1:
        return student.getName();
      case 2:
        return student.getSurname();
      case 3:
        return student.getAge();
      }
    }

问题是,如果有1000个学生(行)和4个字段(列),我们将运行此开关4000次。请说明我做错了什么,或告诉我们更好的解决方案。


阅读 225

收藏
2020-11-30

共1个答案

小编典典

有1000个学生(行)和4个字段(列),我们将运行此开关4000次。

前提是错误的,但是您应该进行概要验证。JTable使用
flyweight模式

进行单元渲染,因此仅检查
_可见_单元。这个简化的示例说明了基本机制。这个相关的示例可以]很好地扩展到数千行。

如果是Java2D的粉丝;但是为了在Swing组件和布局中最大程度地利用HTML,我建议您使用@camickr建议的组件方法。如果必要的话,可以使用轻量级渲染方法中所看到的JTable,等人,其中单个组件重复用于绘制。下面的示例是该技术的非常简化的概述,仅更改了颜色和位置。

附录:更新示例;另请参阅CellRendererPane并让您的应用程序飞起来:实施Flyweight以提高性能。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import javax.swing.CellRendererPane;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

/** @see http://stackoverflow.com/questions/7774960 */
public class PaintComponentTest extends JPanel {

    private static final int N = 8;
    private static final String s = "<html><big><u>Hello</u></html>";
    private JLabel renderer = new JLabel(s);
    private CellRendererPane crp = new CellRendererPane();
    private Dimension dim;

    public PaintComponentTest() {
        this.setBackground(Color.black);
        dim = renderer.getPreferredSize();
        this.add(crp);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        for (int i = 0; i < N; i++) {
            renderer.setForeground(Color.getHSBColor((float) i / N, 1, 1));
            crp.paintComponent(g, renderer, this,
                i * dim.width, i * dim.height, dim.width, dim.height);
        }
    }

    private void display() {
        JFrame f = new JFrame("PaintComponentTest");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setSize(dim.width * N, dim.height * (N + 1));
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new PaintComponentTest().display();
            }
        });
    }
}
2020-11-30