Я не спрашиваю, КАК отобразить компонент в 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);
}
}
Таблица с композициями
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);
}
}
Вопрос
Что мне интересно, так это то, если это может быть выполнено в таком небольшом количестве кода, почему примеры изо всех сил стараются разделить его на три, а иногда и больше классов? Является ли мой код менее эффективным во время выполнения? Я могу понять разделение основного класса и класса, который имеет пример графического интерфейса, но не понимаю, почему вы должны разделить пример графического интерфейса на несколько классов.
Редактировать: я вижу много людей, приводящих веские причины, почему этот код непрактичен. Я был бы признателен за ваши ответы больше, если бы вы предоставили альтернативу!
new TableCellRenderer(){}
в конечном итоге будет скомпилирован какMain$1.class
или что-то в этом роде. - person Kevin K   schedule 16.02.2012TableModel
- person Ky Leggiero   schedule 17.02.2012JTable
визуализациюComponent
s. - person Ky Leggiero   schedule 18.02.2012