@Override
    public void display() {
        final JDialog cutFrame = new JDialog();
        cutFrame.setResizable(false);
        cutFrame.setLayout(new BorderLayout());
        final AtomicReference<Rectangle> selectedPart = new AtomicReference<Rectangle>(null);
        cutFrame.add(new JComponent() {
            private static final long serialVersionUID = 1L;
            
            @Override
            protected void paintComponent(Graphics gfx) {
                gfx.drawImage(originalImage, 0, 0, null);
                final Rectangle selected = selectedPart.get();
                gfx.setColor(new Color(0, 0, 0, 140));
                if (selected != null) {
                    final Rectangle positiveSelected = getAbsolute(selected);
                    gfx.fillRect(0, 0, getWidth(), positiveSelected.y);
                    gfx.fillRect(0, positiveSelected.y + positiveSelected.height, getWidth(), getHeight() - positiveSelected.y - positiveSelected.height);
                    gfx.fillRect(0, positiveSelected.y, positiveSelected.x, positiveSelected.height);
                    gfx.fillRect(positiveSelected.x + positiveSelected.width, positiveSelected.y, getWidth() - positiveSelected.x - positiveSelected.width, positiveSelected.height);
                    gfx.setColor(Color.BLACK);
                    gfx.drawRect(positiveSelected.x - 1, positiveSelected.y - 1, positiveSelected.width + 1, positiveSelected.height + 1);
                } else {
                    gfx.fillRect(0, 0, getWidth(), getHeight());
                }
            }
        });
        cutFrame.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
        cutFrame.setUndecorated(true);
        cutFrame.pack();
        cutFrame.addMouseListener(new MouseListener() {
            
            @Override
            public void mouseReleased(MouseEvent e) {
                cutFrame.setVisible(false);
                cutFrame.dispose();
                final Rectangle absRect = getAbsolute(selectedPart.get());
                croppedImage = new BufferedImage(absRect.width, absRect.height, BufferedImage.TYPE_3BYTE_BGR);
                final Graphics2D gfx = croppedImage.createGraphics();
                gfx.drawImage(originalImage, 0, 0, absRect.width, absRect.height, absRect.x, absRect.y, absRect.x + absRect.width, absRect.y + absRect.height, null);
                gfx.dispose();
                if (callback != null) {
                    callback.run();
                }
            }
            
            @Override
            public void mousePressed(MouseEvent e) {
                selectedPart.set(new Rectangle(e.getPoint()));
            }
            
            @Override
            public void mouseExited(MouseEvent e) {
            }
            
            @Override
            public void mouseEntered(MouseEvent e) {
            }
            
            @Override
            public void mouseClicked(MouseEvent e) {
            }
        });
        cutFrame.addMouseMotionListener(new MouseMotionListener() {
            @Override
            public void mouseMoved(MouseEvent e) {
            }
            
            @Override
            public void mouseDragged(MouseEvent e) {
                final Rectangle rect = selectedPart.get();
                if (rect != null) {
                    rect.setSize(e.getX() - rect.x, e.getY() - rect.y);
                    cutFrame.repaint();
                }
            }
        });
        ScreenUtil.getGraphicsDevice().setFullScreenWindow(cutFrame);
        cutFrame.setModal(true);
        cutFrame.setVisible(true);
    }