Как остановить изменение размера JFrame при переключении setResizable()

#java #swing #jframe #resize #resizable

#java #swing #jframe #изменение размера #изменяемый размер

Вопрос:

Так что я сталкивался с этой проблемой довольно много раз, и мне еще предстоит выяснить или найти решение. У меня есть JFrame приложение, которое имеет возможность переключать изменение размера. Однако для того, что я хочу, я хочу, чтобы размеры оставались точно такими же, но когда я setResizable(false); JFrame изменяю размер. Почему он это делает и как мне остановить это?

Вот пример:

 import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class ResizeSample extends JFrame{
    public ResizeSample() {
        super("Resize Sample");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setPreferredSize(new Dimension(300, 300));
        setLocation(1930, 10);

        JButton toggle = new JButton("Toggle Resize");
        toggle.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                setResizable(!isResizable());
            }
        });

        add(toggle, BorderLayout.NORTH);

        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        new ResizeSample();
    }
}
 

Редактировать

Я также забыл упомянуть, что когда я меняю ActionListener код на:

     toggle.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            System.out.println("Before: "   getSize());
            setResizable(!isResizable());
            System.out.println("After: "   getSize());
            System.out.println();
        }
    });
 

чтобы проверить изменение размера, оно не идентифицирует изменение, но оно четко видно при запуске программы.

Комментарии:

1. Какой у него размер после вызова setResizable(false) ? Я могу себе представить, что размер будет установлен на значение, возвращаемое getPreferredSize() , но это всего лишь предположение.

2. @Axel, звонивший setPreferredSize() до и после звонка setResizable(false) , говорит, что размер тот же, но визуально видно, что что-то изменилось.

3. Что вы получаете , звоня getSize() до и после звонка setResizable(false) ? Что произойдет, если вы выполните a setPreferredSize(null) перед вызовом setResizable(false) ?

4. Какой L amp; F? Нет изменения размера в Mac OS X, что также перемещает Window изображение в верхний правый угол моего (меньшего размера и смещенного по вертикали) экрана. Смотрите также Начальные потоки .

5. Я использую Windows 10 getSystemLookAndFeelClassName() . Когда я тестировал его на одном из компьютеров моей школы, который работает под управлением Mac OS X, и я тоже не помню, чтобы видел проблему. Означает ли это, что это относится только к Windows? И если да, то есть ли какой-нибудь способ это исправить?