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:
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);
}
}