private void draw() {
            // This provides the trailing effect. It's just making a
            // slightly translucent version of the last draw.
            float[] scales = {1f, 1f, 1f, 0.8f};
            float[] offsets = new float[4];
            RescaleOp rop = new RescaleOp(scales, offsets, null);
            BufferedImage bi = rop.filter(screen, null);

            // Initialize graphics.
            Graphics2D g = screen.createGraphics();
            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);

            // Paints the radient background.
            g.setPaint(new GradientPaint(0, 0, new Color(0, 0, 75),
                    0, screen.getHeight(), Color.BLACK));
            g.fillRect(0, 0, screen.getWidth(), screen.getHeight());

            // Draws the slightly translucent version of the last draw.
            g.drawImage(bi, 0, 0, this);

            // Combines the well and current tetromino into a copy.
            char[][] wellCopy = new char[wellRows][wellCols];
            copyInto(well, wellCopy, 0, 0);
            copyInto(current, wellCopy, row, col);

            // Draws each block in the well.
            for (int r = 0; r < wellRows; r++) {
                for (int c = 0; c < wellCols; c++) {
                    if (Character.isLetter(wellCopy[r][c])) {
                        int x = c * blockW;
                        int y = r * blockH;

                        Color c1 = new Color(100, 100, 255);
                        Color c2 = new Color(20, 20, 180);

                        g.setPaint(new GradientPaint(x, y, c1,
                                x, y + (blockH / 2), c2, true));

                        g.fillRect(x, y, blockW, blockH);
                        g.setColor(c2);
                        g.drawRect(x, y, blockW, blockH);
                    }
                }
            }

            // Adds a slight blur and bloom effect.
            if (row == 0) {
                // Release old resources because we have to recreate the
                // graphics afterward.
                g.dispose();

                float[] blur = {
                    0.15f, 0.2f, 0.15f,
                    0.1f, 0.1f, 0.1f,
                    0.1f, 0.1f, 0.1f
                };

                ConvolveOp cop = new ConvolveOp(new Kernel(3, 3, blur),
                        ConvolveOp.EDGE_NO_OP, null);
                screen = cop.filter(screen, null);

                g = screen.createGraphics();
                g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                        RenderingHints.VALUE_ANTIALIAS_ON);
            }

            // Draws the number of lines the player has made.
            g.setFont(new Font(Font.DIALOG, Font.PLAIN, 20));
            int strh = g.getFontMetrics().getHeight();
            drawString(g, "Lines: " + lines, 5, strh);

            // Displays help options.
            if (displayHelp) {
                g.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 14));
                strh = g.getFontMetrics().getHeight();
                int y = strh;
                for (int i = 1; i < help.length; i++) {
                    int strw = g.getFontMetrics().stringWidth(help[i]);
                    drawString(g, help[i], screen.getWidth() - strw, y);
                    y += strh;
                }
            } else {
                int strw = g.getFontMetrics().stringWidth(help[0]);
                drawString(g, help[0], screen.getWidth() - strw, strh);
            }

            // Displays the game state, whether it's paused or over.
            String s = (paused ? "Paused" : (gameOver ? "Game Over" : null));
            if (s != null) {
                g.setFont(new Font(Font.DIALOG, Font.PLAIN, 32));
                int strw = g.getFontMetrics().stringWidth(s);
                strh = g.getFontMetrics().getHeight();
                drawString(g, s, (screen.getWidth() / 2) - (strw / 2),
                        (screen.getHeight() / 2) - (strh / 2));
            }

            // Release the graphics resources.
            g.dispose();
        }