我不是要问如何在JTable中显示一个Component,因为在线有几个教程和示例.但是,我想知道最好的解决方法是什么.
例如,我遇到的大多数教程都有创建单独类的示例(Main类,一个扩展JTable,扩展TableModel,扩展TableCellRenderer,等等).但是,我发现你不仅可以在一个类中完成它,而且可以通过简单地使用以下方法来实现:
示例代码(SSCCE)
主要
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);
}
}
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);
}
}
题
我想知道的是,如果可以用如此短的代码完成,那么为什么示例会将它们分成三个,有时甚至更多的类?我的代码在运行时是否效率较低?我可以理解分离主类和具有示例GUI的类,但不是为什么要将示例GUI分成几个类.
编辑:我看到很多人给出了很好的理由,为什么这段代码是不切实际的.如果您提供替代方案,我将非常感谢您的回答!