我是的新手JTable,也许我听不懂。
JTable
假设我有ArrayList1000 Students(id, name, surname, age)。我想向所有的学生展示JTable。据我了解,我必须创建StudentTableModel它extends AbstractTableModel并设置StudentTableModel为JTable。因此,我们可以认为StudentTableModel是我们ArrayList与表之间的“适配器” 。在互联网上,我找到了这样的示例实现getValueAt:
ArrayList
Students
id, name, surname, age
StudentTableModel
extends AbstractTableModel
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(); } }); } }