【发布时间】:2012-02-16 14:28:23
【问题描述】:
我不是问如何在 JTable 中显示组件,因为网上有很多教程和示例。但是,我想知道解决此问题的最佳方法是什么。
例如,我遇到的大多数教程都有创建单独类的示例(主类,一个扩展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 分成几个类。
编辑:我看到很多人给出了这段代码不切实际的充分理由。如果您提供替代方案,我将更加感谢您的回答!
【问题讨论】:
-
永远不要在 TableModel 中存储组件
-
如果我想要 iTunes 之类的东西,其中有一个对象(歌曲)表,并且您希望用户使用复选框选择多个项目,该怎么办?最好的解决方案不是简单地将第一列单元格设为复选框吗?
-
另外,它们没有存储在 TableModel 中,只是显示在那里。
-
从技术上讲,您仍在使用该代码创建多个类,因为您有一个 anonymous inner class。你的
new TableCellRenderer(){}最终会被编译为Main$1.class或类似的东西。 -
不,第一列将是由复选框呈现和编辑的布尔值。不知道 you 的“刚刚显示”与“存储”是什么意思 - 对于 me,检查 'if (value instanceof Component)' 没有任何意义对于前者 :-) 请务必阅读并理解 @mKorbel 在第 3 条中链接到的教程章节
标签: java swing jtable jcomponent performance