Как определяется полноэкранный прямоугольник? - PullRequest
2 голосов
/ 11 июля 2020

Я пытаюсь разместить три панели JPanel таким образом, чтобы левая панель занимала около 66% ширины, а две другие панели разделяли остальные 33%. Чтобы правильно рассчитать макет, я столкнулся с этим интересным поведением, когда размер экрана правильно определяется как разрешение 4K. Однако ComponentEvent сообщает только 2575x1415, хотя JFrame открывается в полноэкранном режиме, как установлено через расширенное состояние. Свертывание / развертывание JFRame приводит к минимальному и полноэкранному размеру go, но сообщаемый размер остается прежним. Почему?

17:51:25.450 [main] INFO  net.ck.game.ui.TestFrame - screen width height 3840 2160
17:51:25.615 [AWT-EventQueue-0] ERROR net.ck.game.ui.TestFrame - java.awt.Rectangle[x=-7,y=-7,width=2575,height=1415]

Мой пример кода:

import java.awt.Dimension;
import java.awt.DisplayMode;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.JFrame;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class TestFrame extends JFrame
{
    static final long serialVersionUID = 1L;
    private static final Logger logger = (Logger) LogManager.getLogger(TestFrame.class);

    public static void main(String[] args)
    {
        JFrame frame;
        /**
         * https://stackoverflow.com/questions/11497910/java-setfullscreenwindow-keep-on-top/11499100#11499100
         */
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice[] gs = ge.getScreenDevices();

        for (int i = 0; i < gs.length; i++)
        {
            DisplayMode dm = gs[i].getDisplayMode();
            int screenWidth = dm.getWidth();
            int screenHeight = dm.getHeight();
            logger.info("screen width height {} {}", screenWidth, screenHeight);
        }

        frame = new JFrame();
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setMinimumSize(new Dimension(900, 840));
        frame.setVisible(true);
        frame.toFront();

        /**
         * thanks to stackoverflow:
         * https://stackoverflow.com/questions/2781939/setting-minimum-size-limit-for-a-window-in-java-swing
         * https://stackoverflow.com/questions/8333187/how-to-check-current-window-size-in-java-swing
         */
        frame.addComponentListener(new ComponentAdapter()
        {
            /**
             * changing the component resize event to not have the UI smaller thank the
             * minimum to show the three panels next stop, wondering how they can be
             * enlarged accordingly
             */
            public void componentResized(ComponentEvent ev)
            {
                logger.error(ev.getComponent().getBounds().toString());
                Dimension d = frame.getSize();
                Dimension minD = frame.getMinimumSize();
                if (d.width < minD.width)
                    d.width = minD.width;
                if (d.height < minD.height)
                    d.height = minD.height;
                frame.setSize(d);
            }
        });
    }
}

1 Ответ

0 голосов
/ 24 июля 2020

Итак, на самом деле ответ:

DisplayMode возвращает исходный размер экрана. ComponentEvent возвращает прямоугольник, учитывающий масштабирование ОС.

Так что, по крайней мере, установлено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...