/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package grader.UI.gradebook; import grader.logic.category.Category; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.util.ArrayList; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.DefaultComboBoxModel; import javax.swing.GroupLayout; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JInternalFrame; import javax.swing.JPanel; import javax.swing.JScrollBar; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.JToolBar; import javax.swing.LayoutStyle; import javax.swing.SwingConstants; import javax.swing.WindowConstants; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; /** * * @author kellen */ public class Gradebook extends javax.swing.JInternalFrame { static int openFrameCount = 0; static final int xOffset = 30, yOffset = 30; public Gradebook(){ this("", true, true, true, true); } /** Creates new form gradebook */ public Gradebook(String course, Boolean resizeable, Boolean closable, Boolean maximizable, Boolean iconifiable) { super(course + " Gradebook " + (++openFrameCount), resizeable, closable, maximizable, iconifiable); initComponents(); //...Then set the window size or call pack... setSize(1000,600); //Set the window's location. setLocation(xOffset*openFrameCount, yOffset*openFrameCount); } private void initComponents() { frame = new JInternalFrame(); cont = getContentPane(); boxHorGrade = Box.createHorizontalBox(); boxVerInfo = Box.createVerticalBox(); boxVerItems = Box.createVerticalBox(); boxVerTotal = Box.createVerticalBox(); jToolBar1 = new JToolBar(); jPanCatHeader = new JPanel(); jPanTools = new JPanel(); jPanGrades = new JPanel(); jPanStats = new JPanel(); jScrlCatHeader = new JScrollPane(); jScrlInfo = new JScrollPane(); jScrlItems = new JScrollPane(); jScrlTotal = new JScrollPane(); jScrlStatItems = new JScrollPane(); jScrlStatTotal = new JScrollPane(); jScrlStatLbl = new JScrollPane(); jCmbClass = new JComboBox(); jTblGrades = new JTable(); jTblStuInfo = new JTable(); jTblStuItems = new JTable(); jTblStuTotal = new JTable(); jTblStatLbl = new JTable(); jTblStatItems = new JTable(); jTblStatTotal = new JTable(); jTextField1 = new JTextField(); jTextField2 = new JTextField(); jTextField3 = new JTextField(); vbar = new JScrollBar(JScrollBar.VERTICAL); hbar = new JScrollBar(JScrollBar.HORIZONTAL); setName("Gradebook"); cont.setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS)); // init table data, sync scrollbars setupTables(); /* * Setup all the panes */ // setup Tools Pane jPanTools.setAlignmentX(Component.RIGHT_ALIGNMENT); jCmbClass.setModel(new DefaultComboBoxModel(new String[] { "CSC 308", "CPE 101", "CPE 144", "CSC 365" })); // setup Grades Pane jPanGrades.setAlignmentX(Component.CENTER_ALIGNMENT); // build all the header infomation buildCategoryHeaders(jTblStuItems); addCaregoryHeaders(jPanCatHeader); jScrlCatHeader.setViewportView(jPanCatHeader); jScrlCatHeader.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); jScrlCatHeader.setBorder(BorderFactory.createEmptyBorder()); // limit the category pane to the perfered size of the table, so when window is fully expanded category headers stay the correct size jScrlCatHeader.setMaximumSize(new Dimension(jTblStuItems.getPreferredSize().width, jScrlCatHeader.getPreferredSize().height)); vbar.setModel(jScrlTotal.getVerticalScrollBar().getModel()); hbar.setModel(jScrlItems.getHorizontalScrollBar().getModel()); jScrlCatHeader.getHorizontalScrollBar().setModel(jScrlItems.getHorizontalScrollBar().getModel()); hbar.setMaximumSize(new Dimension(jTblStuItems.getPreferredSize().width, hbar.getPreferredSize().height)); // setup Stats Pane jPanStats.setAlignmentX(Component.CENTER_ALIGNMENT); /* * Add everything to the main panes */ // add stuff to Tools Pane GroupLayout jPanelToolLayout = new GroupLayout(jPanTools); jPanTools.setLayout(jPanelToolLayout); jPanelToolLayout.setAutoCreateGaps(true); jPanelToolLayout.setAutoCreateContainerGaps(true); jPanelToolLayout.setHorizontalGroup( jPanelToolLayout.createSequentialGroup() .addComponent(jCmbClass, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) ); jPanelToolLayout.setVerticalGroup( jPanelToolLayout.createSequentialGroup() .addComponent(jCmbClass, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) ); // add stuff to Grades Pane GroupLayout jPanelGradeLayout = new GroupLayout(jPanGrades); jPanGrades.setLayout(jPanelGradeLayout); jPanelGradeLayout.setAutoCreateGaps(true); jPanelGradeLayout.setAutoCreateContainerGaps(true); jPanelGradeLayout.setHorizontalGroup( jPanelGradeLayout.createSequentialGroup() .addGroup(jPanelGradeLayout.createParallelGroup(GroupLayout.Alignment.TRAILING) .addComponent(jScrlInfo) .addComponent(jScrlStatLbl)) .addGroup(jPanelGradeLayout.createParallelGroup(GroupLayout.Alignment.CENTER) .addComponent(jScrlCatHeader) .addComponent(jScrlItems) .addComponent(hbar, 0, GroupLayout.DEFAULT_SIZE, jScrlItems.getMaximumSize().width) .addComponent(jScrlStatItems)) .addGroup(jPanelGradeLayout.createParallelGroup(GroupLayout.Alignment.LEADING) .addComponent(jScrlTotal) .addComponent(jScrlStatTotal)) .addComponent(vbar) ); jPanelGradeLayout.setVerticalGroup( jPanelGradeLayout.createSequentialGroup() .addComponent(jScrlCatHeader) .addGroup(jPanelGradeLayout.createParallelGroup(GroupLayout.Alignment.CENTER) .addComponent(jScrlInfo) .addComponent(jScrlItems) .addComponent(jScrlTotal) .addComponent(vbar, 0, GroupLayout.DEFAULT_SIZE, jScrlItems.getMaximumSize().height)) .addComponent(hbar) .addGroup(jPanelGradeLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(jScrlStatLbl) .addComponent(jScrlStatItems) .addComponent(jScrlStatTotal)) ); // jPanelGradeLayout.linkSize(SwingConstants.HORIZONTAL, jScrlCatHeader, jScrlItems); // jPanTools.setBackground(Color.blue); // jPanGrades.setBackground(Color.green); // jPanStats.setBackground(Color.yellow); Box boxGrades = new Box(BoxLayout.X_AXIS); boxGrades.add(Box.createRigidArea(new Dimension(10,0))); boxGrades.add(Box.createHorizontalGlue()); boxGrades.add(jPanGrades); boxGrades.add(Box.createHorizontalGlue()); boxGrades.add(Box.createRigidArea(new Dimension(10,0))); Box boxTools = new Box(BoxLayout.X_AXIS); boxTools.add(Box.createRigidArea(new Dimension(10,0))); // boxTools.add(Box.createHorizontalGlue()); boxTools.add(jPanTools); boxTools.add(Box.createHorizontalGlue()); boxTools.add(Box.createRigidArea(new Dimension(10,0))); cont.add(boxTools); cont.add(Box.createRigidArea(new Dimension(0,10))); cont.add(boxGrades); cont.add(Box.createVerticalGlue()); } private void setupTables(){ initGradeTables(); initStatTables(); // Disable auto resizing jTblStuInfo.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); jTblStuItems.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); jTblStuTotal.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); jTblStatLbl.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); jTblStatItems.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); jTblStatTotal.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); // Set visible column width jTblStuInfo.getColumnModel().getColumn(0).setPreferredWidth(70); jTblStuInfo.getColumnModel().getColumn(1).setPreferredWidth(150); jTblStuInfo.getColumnModel().getColumn(2).setPreferredWidth(70); jTblStuInfo.getColumnModel().getColumn(3).setPreferredWidth(70); jTblStuTotal.getColumnModel().getColumn(0).setPreferredWidth(70); jTblStuTotal.getColumnModel().getColumn(1).setPreferredWidth(70); jTblStatLbl.getColumnModel().getColumn(0).setPreferredWidth(70); jTblStatTotal.getColumnModel().getColumn(0).setPreferredWidth(70); jTblStatTotal.getColumnModel().getColumn(0).setPreferredWidth(70); for(int i = 0; i < jTblStuItems.getColumnCount(); i++){ jTblStuItems.getColumnModel().getColumn(i).setMinWidth(100); jTblStatItems.getColumnModel().getColumn(i).setMinWidth(100); } // sync table verticle scrolling panes jScrlInfo.getVerticalScrollBar().setModel(jScrlTotal.getVerticalScrollBar().getModel()); jScrlItems.getVerticalScrollBar().setModel(jScrlTotal.getVerticalScrollBar().getModel()); // sync table horizontal scrolling panes jScrlItems.getHorizontalScrollBar().setModel(jScrlStatItems.getHorizontalScrollBar().getModel()); // only show scrollbar for rightmost pane jScrlInfo.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); jScrlItems.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); jScrlTotal.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); jScrlInfo.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); jScrlItems.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); jScrlTotal.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); jScrlStatLbl.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); jScrlStatItems.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); jScrlStatTotal.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); jScrlStatLbl.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); jScrlStatItems.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); jScrlStatTotal.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); // set viewports jScrlInfo.setViewportView(jTblStuInfo); jScrlItems.setViewportView(jTblStuItems); jScrlTotal.setViewportView(jTblStuTotal); jScrlStatLbl.setViewportView(jTblStatLbl); jScrlStatItems.setViewportView(jTblStatItems); jScrlStatTotal.setViewportView(jTblStatTotal); // set alignments jTblStuInfo.setAlignmentX(Component.RIGHT_ALIGNMENT); jScrlItems.setAlignmentX(Component.CENTER_ALIGNMENT); jScrlTotal.setAlignmentX(Component.LEFT_ALIGNMENT); jScrlStatLbl.setAlignmentX(Component.RIGHT_ALIGNMENT); jScrlStatItems.setAlignmentX(Component.CENTER_ALIGNMENT); jScrlStatTotal.setAlignmentX(Component.LEFT_ALIGNMENT); // set max sizes jScrlInfo.setMaximumSize(jTblStuInfo.getPreferredSize()); jScrlItems.setMaximumSize(new Dimension(jTblStuItems.getPreferredSize().width, jTblStuItems.getPreferredSize().height)); jScrlTotal.setMaximumSize(jTblStuTotal.getPreferredSize()); jScrlStatLbl.setMaximumSize(jTblStatLbl.getPreferredSize()); jScrlStatItems.setMaximumSize(new Dimension(jTblStatItems.getPreferredSize().width, jTblStatItems.getPreferredSize().height)); jScrlStatTotal.setMaximumSize(jTblStatTotal.getPreferredSize()); // set min sizes jScrlInfo.setMinimumSize(new Dimension(jTblStuInfo.getPreferredSize().width, 0)); // jScrlItems.setMaximumSize(jTblStuItems.getPreferredSize()); jScrlTotal.setMinimumSize(new Dimension(jTblStuTotal.getPreferredSize().width, 0)); jScrlStatLbl.setMinimumSize(new Dimension(jTblStatLbl.getPreferredSize().width, 0)); // jScrlStatItems.setMaximumSize(jTblStatItems.getPreferredSize()); jScrlStatTotal.setMinimumSize(new Dimension(jTblStatTotal.getPreferredSize().width, 0)); } private void initGradeTables(){ jTblStuItems.setModel(new javax.swing.table.DefaultTableModel( new Object [][] { {null, null, null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null, null, null} }, new String [] { "Empl ID", "Name", "Username", "Major", "HW 1", "HW 2", "HW 3", "Participation 1", "Participation 2", "Attendance 1", "Attendance 2", "Midterm", "Test", "Total", "Grade" } ) { Class[] types = new Class [] { java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.Boolean.class, java.lang.Boolean.class, java.lang.Boolean.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Float.class, java.lang.Float.class, java.lang.String.class, java.lang.String.class }; public Class getColumnClass(int columnIndex) { return types [columnIndex]; } }); // create category and graded items ArrayList categories = new ArrayList(); categories.add(new Category("studentInfo"));categories.add(new Category("studentInfo"));categories.add(new Category("studentInfo"));categories.add(new Category("studentInfo"));categories.add(new Category("HW"));categories.add(new Category("HW"));categories.add(new Category("HW"));categories.add(new Category("Participation"));categories.add(new Category("Participation"));categories.add(new Category("Attendance"));categories.add(new Category("Attendance"));categories.add(new Category("Tests"));categories.add(new Category("Tests"));categories.add(new Category("Total"));categories.add(new Category("Total")); Category cat = new Category("Class Participation"); categories.get(7).setParent(cat); categories.get(8).setParent(cat); categories.get(9).setParent(cat); categories.get(10).setParent(cat); // set category information for each column int i = 0; for(Category category : categories){ jTblStuItems.getColumnModel().getColumn(i++).setIdentifier(category); } // use main table model jTblStuInfo.setAutoCreateColumnsFromModel( false ); jTblStuInfo.setModel( jTblStuItems.getModel() ); jTblStuInfo.setSelectionModel( jTblStuItems.getSelectionModel() ); jTblStuInfo.setFocusable( false ); jTblStuTotal.setAutoCreateColumnsFromModel( false ); jTblStuTotal.setModel( jTblStuItems.getModel() ); jTblStuTotal.setSelectionModel( jTblStuItems.getSelectionModel() ); jTblStuTotal.setFocusable( false ); // move student info and total columns TableColumnModel columnModel = jTblStuItems.getColumnModel(); TableColumn column = columnModel.getColumn( 0 ); columnModel.removeColumn(column); jTblStuInfo.getColumnModel().addColumn(column); column = columnModel.getColumn( 0 ); columnModel.removeColumn(column); jTblStuInfo.getColumnModel().addColumn(column); column = columnModel.getColumn( 0 ); columnModel.removeColumn(column); jTblStuInfo.getColumnModel().addColumn(column); column = columnModel.getColumn( 0 ); columnModel.removeColumn(column); jTblStuInfo.getColumnModel().addColumn(column); column = columnModel.getColumn( columnModel.getColumnCount() - 1 ); columnModel.removeColumn(column); jTblStuTotal.getColumnModel().addColumn(column); column = columnModel.getColumn( columnModel.getColumnCount() - 1 ); columnModel.removeColumn(column); jTblStuTotal.getColumnModel().addColumn(column); // adding sorting for columns jTblStuInfo.setAutoCreateRowSorter(true); jTblStuItems.setRowSorter(jTblStuInfo.getRowSorter()); jTblStuTotal.setRowSorter(jTblStuInfo.getRowSorter()); // disable reordering of columns jTblStuTotal.getTableHeader().setReorderingAllowed(false); // jTblStuInfo.setModel(new javax.swing.table.DefaultTableModel( // new Object [][] { // {null, null, null, null}, // {null, null, null, null}, // {null, null, null, null}, // {null, null, null, null}, // {null, null, null, null}, // {null, null, null, null}, // {null, null, null, null}, // {null, null, null, null}, // {null, null, null, null}, // {null, null, null, null}, // {null, null, null, null}, // {null, null, null, null}, // {null, null, null, null}, // {null, null, null, null}, // {null, null, null, null}, // {null, null, null, null}, // {null, null, null, null}, // {null, null, null, null}, // {null, null, null, null}, // {null, null, null, null} // }, // new String [] { // "Empl ID", "Name", "Username", "Major" // } // ) { // Class[] types = new Class [] { // java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class // }; // // public Class getColumnClass(int columnIndex) { // return types [columnIndex]; // } // }); // // jTblStuItems.setModel(new javax.swing.table.DefaultTableModel( // new Object [][] { // {null, null, null, null, null, null, null, null, null}, // {null, null, null, null, null, null, null, null, null}, // {null, null, null, null, null, null, null, null, null}, // {null, null, null, null, null, null, null, null, null}, // {null, null, null, null, null, null, null, null, null}, // {null, null, null, null, null, null, null, null, null}, // {null, null, null, null, null, null, null, null, null}, // {null, null, null, null, null, null, null, null, null}, // {null, null, null, null, null, null, null, null, null}, // {null, null, null, null, null, null, null, null, null}, // {null, null, null, null, null, null, null, null, null}, // {null, null, null, null, null, null, null, null, null}, // {null, null, null, null, null, null, null, null, null}, // {null, null, null, null, null, null, null, null, null}, // {null, null, null, null, null, null, null, null, null}, // {null, null, null, null, null, null, null, null, null}, // {null, null, null, null, null, null, null, null, null}, // {null, null, null, null, null, null, null, null, null}, // {null, null, null, null, null, null, null, null, null}, // {null, null, null, null, null, null, null, null, null} // }, // new String [] { // "HW 1", "HW 2", "HW 3", "Participation 1", "Participation 2", "Attendance 1", "Attendance 2", "Midterm", "Test" // } // ) { // Class[] types = new Class [] { // java.lang.Boolean.class, java.lang.Boolean.class, java.lang.Boolean.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Float.class, java.lang.String.class // }; // // public Class getColumnClass(int columnIndex) { // return types [columnIndex]; // } // }); // // jTblStuTotal.setModel(new javax.swing.table.DefaultTableModel( // new Object [][] { // {null, null}, // {null, null}, // {null, null}, // {null, null}, // {null, null}, // {null, null}, // {null, null}, // {null, null}, // {null, null}, // {null, null}, // {null, null}, // {null, null}, // {null, null}, // {null, null}, // {null, null}, // {null, null}, // {null, null}, // {null, null}, // {null, null}, // {null, null} // }, // new String [] { // "Total", "Grade" // } // ) { // Class[] types = new Class [] { // java.lang.String.class, java.lang.String.class // }; // // public Class getColumnClass(int columnIndex) { // return types [columnIndex]; // } // }); } private void initStatTables(){ jTblStatLbl.setModel(new javax.swing.table.DefaultTableModel( new Object [][] { {"non-blank"}, {"mean"}, {"std dev"}, {"median"}, {"range"} }, new String [] { "" } )); jTblStatItems.setModel(new javax.swing.table.DefaultTableModel( new Object [][] { {null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null} }, new String [] { "", "", "", "", "", "", "", "", "" } ) { Class[] types = new Class [] { java.lang.Boolean.class, java.lang.Boolean.class, java.lang.Boolean.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Integer.class, java.lang.Float.class, java.lang.String.class }; public Class getColumnClass(int columnIndex) { return types [columnIndex]; } }); jTblStatTotal.setModel(new javax.swing.table.DefaultTableModel( new Object [][] { {null, null}, {null, null}, {null, null}, {null, null}, {null, null} }, new String [] { "", "" } ) { Class[] types = new Class [] { java.lang.String.class, java.lang.String.class }; public Class getColumnClass(int columnIndex) { return types [columnIndex]; } }); } private void buildCategoryHeaders(JTable table){ categoryHeaderList = new ArrayList(); categoryHeaderList2 = new ArrayList(); CategoryHeader categoryHeader = null; CategoryHeader chParent = null; TableColumn col = new TableColumn(); Category thisCategory = null; // build category headers from stored identifiers for(int i = 0; i < table.getColumnCount(); i++){ col = table.getColumnModel().getColumn(i); thisCategory = (Category)col.getIdentifier(); // make sure we are only adding cateogry and item columns if(thisCategory.getName().equalsIgnoreCase("studentInfo") || thisCategory.getName().equalsIgnoreCase("Total")){ continue; } // same category as previous if(categoryHeader != null && thisCategory.getName().equals(categoryHeader.getCategory().getName())){ categoryHeader.addCol(col); } // new category else{ categoryHeader = new CategoryHeader(col); categoryHeaderList.add(categoryHeader); } // create parent CategoryHeader if Category has a parent if(thisCategory.getParent() != null){ // same parent category as previous if(categoryHeader != null && chParent != null && thisCategory.getParent().getName().equals(chParent.getCategory().getName())){ chParent.addChild(categoryHeader); } // new parent category else{ chParent = new CategoryHeader(col, thisCategory.getParent()); categoryHeaderList2.add(chParent); chParent.addChild(categoryHeader); } } // Category doesn't have a parent just add a place holder else{ chParent = new CategoryHeader(col, thisCategory, true); categoryHeaderList2.add(chParent); } } } private void addCaregoryHeaders(JPanel panel){ Box box2 = null; Box box = null; panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); box = new Box(BoxLayout.X_AXIS); for(CategoryHeader ch : categoryHeaderList){ if(ch.isPlaceHolder()){ box.add(Box.createRigidArea(new Dimension(ch.getTextField().getSize().width + ch.getBtnExpand().getSize().width, ch.getTextField().getSize().height))); } else{ box.add(ch.getTextField()); box.add(ch.getBtnExpand()); } } box2 = new Box(BoxLayout.X_AXIS); for(CategoryHeader ch : categoryHeaderList2){ if(ch.isPlaceHolder()){ box2.add(Box.createRigidArea(new Dimension(ch.getTextField().getSize().width + ch.getBtnExpand().getSize().width, ch.getTextField().getSize().height))); } else{ box2.add(ch.getTextField()); box2.add(ch.getBtnExpand()); } } panel.add(box2); panel.add(box); } /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { Gradebook mygb = new Gradebook(); mygb.setSize(new Dimension(1000,600)); // mygb.fixSizing(); mygb.setVisible(true); } }); } // Variables declaration - do not modify private ArrayList categoryHeaderList; // first level categories - child of categoryHeaderList2 private ArrayList categoryHeaderList2; //second level categories private JInternalFrame frame; private Container cont; private Box boxHorGrade; private Box boxVerInfo; private Box boxVerItems; private Box boxVerTotal; private JComboBox jCmbClass; private JPanel jPanCatHeader; private JPanel jPanTools; private JPanel jPanGrades; private JPanel jPanStats; private JScrollPane jScrlCatHeader; private JScrollPane jScrlStatTotal; private JScrollPane jScrlStatItems; private JScrollPane jScrlStatLbl; private JScrollPane jScrlInfo; private JScrollPane jScrlItems; private JScrollPane jScrlTotal; private JScrollBar vbar; private JScrollBar hbar; private JTable jTblGrades; private JTable jTblStuInfo; private JTable jTblStuItems; private JTable jTblStuTotal; private JTable jTblStatLbl; private JTable jTblStatItems; private JTable jTblStatTotal; private JTextField jTextField1; private JTextField jTextField2; private JTextField jTextField3; private JToolBar jToolBar1; // End of variables declaration }