Swing: cambio de tamaño de un JFrame como marcos en Linux, por ejemplo

Me gustaría saber si existe la posibilidad de implementar el cambio de tamaño de un JFrame de esa manera, que se ha redimensionado como, por ejemplo, las ventanas estándar en Linux. Para ser más precisos: si el usuario comienza a arrastrar, solo se visualizará el tamaño futuro de la ventana, mientras que el contenido original no se redimensionará. Tan pronto como el usuario suelta el mouse, el Marco cambia de tamaño a ese tamaño. En imagenes

(1) estado antes de cambiar el tamaño

(2) el usuario comienza a dragarse (en el círculo rojo)

(3) el usuario suelta el mouse, el marco cambia de tamaño

¿Es posible darse cuenta de que en Java Swing?

EDITAR:

Como este programa debería ejecutarse algún día también en Java RE más bajo como el 7, intenté combinar las sugerencias de mKorbel con la sugerencia del comentario con el marco translúcido. El resultado está cerca de la meta, excepto que

El contenido de contentPane cambia de tamaño después de que dejo de mover el mouse, no cuando se suelta el mouseEl título del marco cambia de tamaño de inmediato, no solo cuando detengo el arrastre del borde del marco.Solo funciona si se cambia el tamaño desde la derecha o la parte inferior, de lo contrario, el contenido se mueve con el arrastre.

Creo que el primer punto se puede resolver con una combinación del código y un MouseListener, algo así como si mouseReleased (), luego redimensionar. Aquí está el código, no dude en probarlo. Para más sugerencias, todavía estoy contento con cualquier sugerencia.

El código es una ligera modificación de laGradientTranslucentWindowDemo.java de los Tutoriales de Java. Espero que esté permitido publicarlo aquí, de lo contrario, indíqueme cualquier violación contra las causas de derechos de autor. Se supone que el JPanel negro es el contenido de la aplicación, mientras que contentPane permanece invisible.

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.beans.PropertyChangeListener;

import javax.swing.*;
import static java.awt.GraphicsDevice.WindowTranslucency.*;

public class GroundFrame extends JFrame {

    Timer timer;
    JPanel panel2;

    public GroundFrame() {
        super("GradientTranslucentWindow");

        setBackground(new Color(0,0,0,0));
        setSize(new Dimension(300,200));
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel() {
        panel.setBackground(new Color(0,0,0,0));
        setContentPane(panel);

        setLayout(null);
        panel2 = new JPanel();
        panel2.setBackground(Color.black);
        panel2.setBounds(0,0,getContentPane().getWidth(), getContentPane().getHeight());
        getContentPane().add(panel2);

        addComponentListener(new ComponentListener() {

            @Override
            public void componentShown(ComponentEvent e) {}

            @Override
            public void componentResized(ComponentEvent e) {
                timer = new Timer(50, new Action() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        if(timer.isRunning()){

                        }else{
                            resizePanel(getContentPane().getSize());
                        }
                    }

                    @Override
                    public void setEnabled(boolean b) {}

                    @Override
                    public void removePropertyChangeListener(PropertyChangeListener listener) {}

                    @Override
                    public void putValue(String key, Object value) {}

                    @Override
                    public boolean isEnabled() {return false;}

                    @Override
                    public Object getValue(String key) {return null;}

                    @Override
                    public void addPropertyChangeListener(PropertyChangeListener listener) {}
                });
                timer.setRepeats(false);
                timer.start();

            }

            @Override
            public void componentMoved(ComponentEvent e) {}

            @Override
            public void componentHidden(ComponentEvent e) {}
        });
    }

    public void resizePanel(Dimension dim){
        panel2.setBounds(0,0,dim.width, dim.height);
        repaint();
    }

    public static void main(String[] args) {
        GraphicsEnvironment ge =
            GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice gd = ge.getDefaultScreenDevice();
        boolean isPerPixelTranslucencySupported =
            gd.isWindowTranslucencySupported(PERPIXEL_TRANSLUCENT);

        if (!isPerPixelTranslucencySupported) {
            System.out.println(
                "Per-pixel translucency is not supported");
                System.exit(0);
        }

        JFrame.setDefaultLookAndFeelDecorated(true);

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                GroundFrame gtw = new GroundFrame();
                gtw.setVisible(true);
            }
        });
    }
}