Sup*_*tar 4 java performance swing jtable jcomponent
我不是要问如何在JTable中显示一个Component,因为在线有几个教程和示例.但是,我想知道最好的解决方法是什么.
举例来说,我碰到最教程有创建单独的类(主类,一个扩展的例子JTable,在延伸TableModel,一个扩展TableCellRenderer,等等).但是,我发现你不仅可以在一个类中完成它,而且可以通过简单地使用以下方法来实现:
主要
public class Main
{
public static void main(String[] args)
{
javax.swing.JFrame jf = new javax.swing.JFrame("A table with components");
jf.setLayout(new java.awt.BorderLayout());
jf.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
jf.add(new TableWithCompsPanel(), java.awt.BorderLayout.CENTER);
jf.setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud)
TableWithComps
public class TableWithCompsPanel extends java.awt.Container
{
private Class<?> tableColumnClassArray[];
private javax.swing.JTable jTableWithComps;
private Object tableContentsArray[][];
public TableWithCompsPanel()
{
tableContentsArray = new Object[][]
{
{"This is plain text", new javax.swing.JButton("This is a button") },
{new javax.swing.JLabel("This is an improperly rendered label!"), new javax.swing.JCheckBox("This is a checkbox")}
};
tableColumnClassArray = new Class<?>[]{String.class, java.awt.Component.class};
initGUI();
}
private void initGUI()
{
setLayout(new java.awt.BorderLayout());
jTableWithComps = new javax.swing.JTable(new javax.swing.table.AbstractTableModel()
{
@Override public int getRowCount()
{
return tableContentsArray.length;
}
@Override public int getColumnCount()
{
return tableContentsArray[0].length;
}
@Override public Object getValueAt(int rowIndex, int columnIndex)
{
return tableContentsArray[rowIndex][columnIndex];
}
@Override public Class<?> getColumnClass(int columnIndex)
{
return tableColumnClassArray[columnIndex];
}
});
jTableWithComps.setDefaultRenderer(java.awt.Component.class, new javax.swing.table.TableCellRenderer()
{
@Override public java.awt.Component getTableCellRendererComponent(javax.swing.JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
return value instanceof java.awt.Component ? (java.awt.Component)value : new javax.swing.table.DefaultTableCellRenderer();
}
});
add(jTableWithComps, java.awt.BorderLayout.CENTER);
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道的是,如果能够在如此短的代码中完成,为什么示例会将它们分成三个,有时甚至更多的类?我的代码在运行时是否效率较低?我可以理解分离主类和具有示例GUI的类,但不是为什么要将示例GUI分成几个类.
编辑:我看到很多人给出了很好的理由,为什么这段代码是不切实际的.如果您提供替代方案,我将非常感谢您的回答!
该TableModel模型的数据要跟踪可能的最简单的方法,对于内存的效率着想.的TableCellRenderer定义如何显示在一个表格单元格的数据.
在iTunes复选框示例中,从复选框中建模信息的最简单方法是布尔值(true/false).存储10,000个boolean对象的集合比10,000个JCheckBox对象的内存效率高得多.
然后TableCellRenderer可以存储单个JCheckBox对象,当要求用于绘制单元格的组件时,它可以根据值检查/取消选中复选框,并且每次都返回相同的组件.这样,当用户滚动表格时,您不会反复创建数千个UI组件.
| 归档时间: |
|
| 查看次数: |
4505 次 |
| 最近记录: |