Witam.

Poprzedni wątek opisujący mój problem usunąłem. Zakładam że wrzucenie ściany kodu i proszenie o pomoc w znalezieniu błędu było zachowaniem niezmiernie głupim z mojej strony, za które bardzo przepraszam.

Bez dalszego przedłużania, mam kłopot ze zmianą wielkości okna (zwykłego JFrame) stworzonego poprzez wykorzystanie setUndecorated(true).

Okno prezentuje się tak:
user image

Zmiana wielkości okna (przesunięcie myszą w lewo lub prawo eastborder) działa bez żadnych problemów:

eastborder.addMouseMotionListener(new MouseInputAdapter() {
            public void mouseDragged(MouseEvent e){
                if(getWidth() + e.getX() >= minimumSize.width){
                    movedDistanceX = e.getX();
                }
                else{
                    movedDistanceX = (getWidth() - minimumSize.width) * -1;
                }
                setBounds(getLocation().x, getLocation().y, getWidth() + movedDistanceX, getHeight());
                titlebar.setPreferredSize(new Dimension(titlebar.getWidth() + movedDistanceX, titlebar.getHeight()));
                contentpanel.setPreferredSize(new Dimension(contentpanel.getWidth() + movedDistanceX, contentpanel.getHeight()));
                validate();
            }
});

W movedDistanceX zapisuję zmienioną wielkość którą następnie dodaję do tej początkowej.

Natomiast w westborder muszę dodatkowo wykonać przesunięcie okna o zmienioną wielkość:

westborder.addMouseMotionListener(new MouseInputAdapter() {
            public void mouseDragged(MouseEvent e){
                int x;
                if(getWidth() - e.getX() >= minimumSize.width){
                    movedDistanceX = e.getX();
                    x = getLocation().x + e.getX();
                }
                else{
                    movedDistanceX = getWidth() - minimumSize.width;
                    x = getLocation().x + movedDistanceX;
                }
                setBounds(x, getLocation().y, getWidth() - movedDistanceX, getHeight());
                titlebar.setPreferredSize(new Dimension(titlebar.getWidth() - movedDistanceX, titlebar.getHeight()));
                contentpanel.setPreferredSize(new Dimension(contentpanel.getWidth() - movedDistanceX, contentpanel.getHeight()));
                validate();
            }
});

Zatem jak poprzednio zapisuję zmianę oryginalnej wielkości do movedDistanceX oraz dodatkowo do zmiennej x zapisuję wartość która posłuży do przesunięcia okna.
I w tym miejscu pojawia się problem ponieważ zmiana wielkości okna wraz z jego przesunięciem powoduje "drżenie" całego okna i jego zawartości. Elementy rozciągają się za mało lub za bardzo by następnie wrócić do odpowiedniej wielkości.

Bardzo proszę o pomoc w rozwiązaniu tego problemu albo przynajmniej jakieś wskazówki gdzie mógłbym szukać rozwiązania/pomocy.

Pozdrawiam.

PS
Cały kod programu:

package test6;

import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.event.MouseInputAdapter;

public class Test6 extends JFrame{
    
    JLabel titlebar = new JLabel();
    JButton closebutton = new JButton();
    
    Point point = new Point();
    
    Dimension minimumSize = new Dimension(200, 200);
    Dimension maximumSize = new Dimension(800, 800);
    
    int movedDistanceX, movedDistanceY;
    
    JPanel westborder = new JPanel();
    JPanel contentpanel = new JPanel();
    JPanel eastborder = new JPanel();
    
    Boolean isMousePresed = false;
    
    public Test6(){
        setBounds(200, 200, 600, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new FlowLayout(0, 0, 0));
        setUndecorated(true);
        
        constructTitleBar();
        constructCloseButton();
        
        constructWestBorder();
        constructContentPanel();
        constructEastBorder();
        
        
        setVisible(true);
    }

    public static void main(String[] args) {
        new Test6();
    }
    
    void constructTitleBar(){
        titlebar.setPreferredSize(new Dimension(500, 20));
        titlebar.setText("JFrame Test 6");
        titlebar.setOpaque(true);
        titlebar.setBackground(Color.GRAY);
        titlebar.setForeground(Color.WHITE);
        
        titlebar.addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e){
                point.x = e.getX();
                point.y = e.getY();
            }
        });
        
        titlebar.addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                Point p = getLocation();
                setLocation(p.x + e.getX() - point.x, p.y + e.getY() - point.y);
            }
        });
        
        add(titlebar);
    }
    
    void constructCloseButton(){
        closebutton.setPreferredSize(new Dimension(100, 20));
        closebutton.setText("x");
        closebutton.setBackground(Color.GRAY);
        closebutton.setForeground(Color.WHITE);
        closebutton.setBorder(BorderFactory.createEmptyBorder());
        closebutton.setContentAreaFilled(true);
        closebutton.setFocusPainted(false);
        
        closebutton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
        
        add(closebutton);
    }
    
    void constructWestBorder(){
        westborder.setPreferredSize(new Dimension(4, 380));
        westborder.setBackground(Color.BLUE);
        
        westborder.addMouseListener(new MouseAdapter() {
            public void mouseEntered(MouseEvent e){
                if(!isMousePresed){
                    setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR));
                }
            }
            public void mouseExited(MouseEvent e){
                if(!isMousePresed){
                    setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
                }
            }
            public void mousePressed(MouseEvent e){
                isMousePresed = true;
                setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR));
            }
            public void mouseReleased(MouseEvent e){
                isMousePresed = false;
                setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
            }
        });
        
        westborder.addMouseMotionListener(new MouseInputAdapter() {
            public void mouseDragged(MouseEvent e){
                int x;
                if(getWidth() - e.getX() >= minimumSize.width){
                    movedDistanceX = e.getX();
                    x = getLocation().x + e.getX();
                }
                else{
                    movedDistanceX = getWidth() - minimumSize.width;
                    x = getLocation().x + movedDistanceX;
                }
                setBounds(x, getLocation().y, getWidth() - movedDistanceX, getHeight());
                titlebar.setPreferredSize(new Dimension(titlebar.getWidth() - movedDistanceX, titlebar.getHeight()));
                contentpanel.setPreferredSize(new Dimension(contentpanel.getWidth() - movedDistanceX, contentpanel.getHeight()));
                validate();
            }
        });
        
        add(westborder);
    }
    
    void constructContentPanel(){
        contentpanel.setPreferredSize(new Dimension(592, 380));
        contentpanel.setBackground(Color.DARK_GRAY);
        
        add(contentpanel);
    }
    
    void constructEastBorder(){
        eastborder.setPreferredSize(new Dimension(4, 380));
        eastborder.setBackground(Color.RED);
        
        eastborder.addMouseListener(new MouseAdapter() {
            public void mouseEntered(MouseEvent e){
                if(!isMousePresed){
                    setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR));
                }
            }
            public void mouseExited(MouseEvent e){
                if(!isMousePresed){
                    setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
                }
            }
            public void mousePressed(MouseEvent e){
                isMousePresed = true;
                setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR));
            }
            public void mouseReleased(MouseEvent e){
                isMousePresed = false;
                setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
            }
        });
        
        eastborder.addMouseMotionListener(new MouseInputAdapter() {
            public void mouseDragged(MouseEvent e){
                if(getWidth() + e.getX() >= minimumSize.width){
                    movedDistanceX = e.getX();
                }
                else{
                    movedDistanceX = (getWidth() - minimumSize.width) * -1;
                }
                setBounds(getLocation().x, getLocation().y, getWidth() + movedDistanceX, getHeight());
                titlebar.setPreferredSize(new Dimension(titlebar.getWidth() + movedDistanceX, titlebar.getHeight()));
                contentpanel.setPreferredSize(new Dimension(contentpanel.getWidth() + movedDistanceX, contentpanel.getHeight()));
                validate();
            }
        });
        
        add(eastborder);
    }
    
}