当前位置: 首页 > 面试题库 >

抽象表模型getValueAt性能

钦德佑
2023-03-14
问题内容

我是的新手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次。请说明我做错了什么,或告诉我们更好的解决方案。


问题答案:

有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();
            }
        });
    }
}


 类似资料:
  • 抽象异步模型 对回调模型抽象出异步接口Async。 只有一个方法的接口通常都可以使用闭包代替,区别在于interface引入新类型,闭包则不会。如果说thunkify依赖了参数顺序的弱约定,Async相对严肃的依赖了类型。 <?php interface Async { public function begin(callable $callback); } // AsyncTask符

  • 我有一个用户的Entity-DTO转换器,如下所示: 我有很多Entity-DTO要管理,所以我想像这样抽象转换器 我的问题是:我必须放置什么而不是???

  • 问题内容: 除了语法外,使用django抽象模型和对django模型使用纯Python继承之间有什么区别?利弊? 更新:我认为我的问题被误解了,并且我收到了关于抽象模型与从django.db.models.Model继承的类之间的区别的答复。 我实际上想知道从Django抽象类(元:abstract = True)继承的模型类与从诸如“ object”(而不是models.Model)继承的普通P

  • 我想根据我使用 AbstractTableModel 指定的列从数据库中的表中提取数据。表中有 8 列,但只想显示 8 列中的 3 列。 例如: 数据库有以下列:ID、First_Name、Last_Name、…、Phone_Number。如果我指定要在表中显示First_Name、Last_Name和Phone_Number,它将显示ID、First_ Name和Last_ Name。我认为应该

  • 我正在尝试对扩展抽象基的类进行单元测试。以下是“类似的类”,以供说明: 下面是我正在尝试的单元测试: 当我做这个测试的时候 java.lang.NullPointerException 在中 我知道自动连线的“滤水器”没有初始化。但接下来,我只想在我的单元测试中模拟抽象的“非抽象”方法。 我该如何使用EasyMock来实现这一点呢?另外,我不知道和应该做什么。

  • “动物”可以是猫或狗。不幸的是,当我这样做时,我得到了一个异常,因为没有为抽象类Animal创建表。有没有人知道我如何使用ActiveAndroid来实现这一点?