protected JPanel createPicrossPanel(boolean fileOpened){
        JPanel panel = new JPanel();

        // Calculate Parameters
        int leftColumnWidth = maxSize(picross.left) * pixelSize;
        int leftColumnHeight = picross.left.size() * pixelSize;
        int upColumnWidth = picross.up.size() * pixelSize;
        int upColumnHeight = maxSize(picross.up) * pixelSize;
        int bodyWidth = upColumnWidth;
        int bodyHeight = leftColumnHeight;
        int width = (leftColumnWidth + bodyWidth);
        int height = (upColumnHeight + bodyHeight);

        // Set Absolute Layout
        panel.setLayout(null);
        panel.setSize(width, height);

        if(!fileOpened){
            return panel;
        }

        // Initialize
        JPanel emptyColumn = new JPanel();
        leftColumn = new JPanel();
        upColumn = new JPanel();
        body = new JPanel();

        // Set Listeners
        if(picrossListener == null){
            picrossListener = new PicrossListener();
        }

        body.addMouseListener(picrossListener);
        body.addMouseMotionListener(picrossListener);


        // Set Bounds
        emptyColumn.setBounds(0, 0, (width - bodyWidth), (height - bodyHeight));
        leftColumn.setBounds(0, (height - bodyHeight), leftColumnWidth, leftColumnHeight);
        upColumn.setBounds((width - bodyWidth), 0, upColumnWidth, upColumnHeight);
        body.setBounds((width - bodyWidth), (height - bodyHeight), bodyWidth, bodyHeight);

        // Set Border
        emptyColumn.setBorder(null);
        leftColumn.setBorder(BorderFactory.createMatteBorder(boldLineThickness, boldLineThickness, boldLineThickness, 0, Color.black));
        upColumn.setBorder(BorderFactory.createMatteBorder(boldLineThickness, boldLineThickness, 0, boldLineThickness, Color.black));
        body.setBorder(boldLine);

        // Set Background
        emptyColumn.setBackground( null );
        leftColumn.setBackground( hsb(28, 14, 100) );
        upColumn.setBackground( hsb(28, 14, 100) );
        body.setBackground( hsb(28, 4, 100) );

        // Prepare for Next
        JPanel numRow;
        JPanel numBox;
        List<JPanel> numCell;

        // Set Number Rows on the Left Column
        leftNumberCells = new ArrayList<List<JPanel>>();
        leftColumn.setLayout(new GridLayout(leftColumnHeight/pixelSize, 1, 0, 0));
        for(int i=0; i<leftColumnHeight/pixelSize; i++) {
            numRow = new JPanel();
            numRow.setBackground(null);
            numRow.setBorder(normalLine);
            numRow.setLayout(new GridLayout(1, leftColumnWidth/pixelSize, 0, 0));

            numCell = new ArrayList<JPanel>();

            for (int j=0; j<leftColumnWidth/pixelSize; j++) {
                numBox = new JPanel();
                numBox.setLayout(new GridLayout(1,1,0,0));
                numBox.setBackground(null);
                numBox.setBorder(BorderFactory.createMatteBorder(0,normalLineThickness,0,0,Color.black));
                numBox.add(leftNumberLabel(j,i,leftColumnWidth/pixelSize));
                numRow.add(numBox);

                numCell.add(numBox);
            }

            leftColumn.add(numRow);
            leftNumberCells.add(numCell);
        }

        // Set Number Rows on the Up Column
        upNumberCells = new ArrayList<List<JPanel>>();
        upColumn.setLayout(new GridLayout(1, upColumnWidth/pixelSize, 0, 0));
        for(int i=0; i<upColumnWidth/pixelSize; i++) {
            numRow = new JPanel();
            numRow.setBackground(null);
            numRow.setBorder(new LineBorder(Color.black, normalLineThickness));
            numRow.setLayout(new GridLayout(upColumnHeight/pixelSize, 1, 0, 0));

            numCell = new ArrayList<JPanel>();

            for (int j=0; j<upColumnHeight/pixelSize; j++) {
                numBox = new JPanel();
                numBox.setLayout(new GridLayout(1,1,0,0));
                numBox.setBackground(null);
                numBox.setBorder(BorderFactory.createMatteBorder(normalLineThickness,0,0,0,Color.black));
                numBox.add(upNumberLabel(j,i,upColumnHeight/pixelSize));
                numRow.add(numBox);

                numCell.add(numBox);
            }

            upColumn.add(numRow); 
            upNumberCells.add(numCell);
        }

        // Set Cells on the Body
        cells = new ArrayList<JPanel>();
        body.setLayout(new GridLayout(bodyHeight/pixelSize, bodyWidth/pixelSize, 0, 0));
        for(int i=0; i<(bodyWidth*bodyHeight)/(pixelSize*pixelSize); i++) {
            numBox = new JPanel();
            numBox.add(new JLabel(new ImageIcon(ImageUtil.cellImage(PixelType.NOFILL))));
            numBox.setLayout(new GridLayout(1,1,0,0));
            numBox.setBackground(null);
            numBox.setBorder(normalLine);
            body.add(numBox);

            cells.add(numBox);
        }

        // Add Children
        panel.add(emptyColumn);
        panel.add(leftColumn);
        panel.add(upColumn);
        panel.add(body);

        return panel;
    }