Я не спрашиваю, КАК отображать Компонент в JTable, так как в Интернете есть несколько уроков и примеров.Тем не менее, я хочу знать, как ЛУЧШИЙ способ это сделать.
Например, в большинстве учебников, с которыми я сталкиваюсь, есть примеры, которые создают отдельные классы (Главный класс, который расширяет JTable
, на этомрасширяет TableModel
, расширяет TableCellRenderer
и так далее).Однако я обнаружил, что вы можете сделать это не только в одном классе, но и в одном методе, просто используя следующее:
Пример кода (SSCCE)
Main
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);
}
}
Вопрос
Мне интересно, что , если это может бытьВ столь коротком объеме кода, почему изо всех сил стараются разделить его на три, а иногда даже больше, классов?Является ли мой код как-то менее эффективным во время выполнения? Я понимаю, как разделить основной класс и класс, в котором есть пример графического интерфейса пользователя, но не то, почему вы должны разделить пример графического интерфейса пользователя на несколько классов.
Edit: Я вижу множество людей, дающих веские причины, почему этот код нецелесообразен.Буду признателен за ваши ответы больше, если вы предоставили альтернативу!