Приложение Java Swing выглядит крошечным на экране с высоким разрешением, когда его нужно масштабировать до нормального размера - PullRequest
0 голосов
/ 26 сентября 2018

Как сделать так, чтобы пользовательский интерфейс приложения Java Swing правильно масштабировался для пользователей на экранах с высоким DPI?

См. Снимок экрана ниже.Вверху вы можете увидеть, как крошечное приложение выглядит по сравнению с иконками проводника Ubuntu и gedit.В левом нижнем углу вы можете увидеть примерный размер приложения (и оно выглядит на обычных мониторах DPI).Поэтому я ищу способ правильно масштабировать графический интерфейс приложения, когда используется монитор с высоким DPI.Например, gedit выглядит одинаково на мониторах с обычным и высоким DPI.Я хочу, чтобы мое приложение работало так.

enter image description here

Вот исходный код приложения: https://github.com/baobabKoodaa/baopass

ЭтоЧрезвычайно распространенная проблема, затрагивающая многие приложения.Примерно половина приложений, которые я запускаю в Ubuntu, масштабируется должным образом без каких-либо действий со стороны пользователя, другая половина не масштабируется и выглядит действительно крошечной.Обратите внимание, что я в основном ищу решение, которое не требует действий со стороны пользователя (хотя в данный момент любая помощь приветствуется - я не нашел никаких способов ее масштабирования вообще).

Согласнодо это масштабирование уже должно работать из коробки.Это не так.Я не уверен, что это ошибка или есть какой-то дополнительный шаг, который я должен сделать помимо запуска приложения на Java 9?

Ответы [ 3 ]

0 голосов
/ 03 октября 2018

По ссылке в посте:

Разработчик может вручную масштабировать все элементы графического интерфейса в приложении при работе на дисплее HiDPI, но для этого требуется много работы по рефакторингу приложения, а компоненты Swing и AWT не написаны для хорошего взаимодействияс попытками масштабировать их извне.

Если вам повезет, и приложение хорошо реагирует (не искажается) на изменение размеров шрифта, вы можете попробовать изменить размер шрифта по умолчанию для внешнего вида.для разных размеров экрана.Вот простая демонстрация, предполагая, что базовая ширина экрана составляет 1400 (это означает, что приложение ширины выглядит хорошо):

public static void main(String[] args) {

    SwingUtilities.invokeLater(() ->{

        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException
                | UnsupportedLookAndFeelException ex) {
            ex.printStackTrace();
        }
        setDefaultSize(getScaleForScreenSize());

        //todo start GUI 
    });
}

private static double getScaleForScreenSize() {

    double screenSize = Toolkit.getDefaultToolkit().getScreenSize().getWidth();
    return screenSize / 1400; //assuming app looks good at 1400
}

//source: https://stackoverflow.com/a/26877737/3992939
private static void setDefaultSize(double scale) {

    Set<Object> keySet = UIManager.getLookAndFeelDefaults().keySet();
    Object[] keys = keySet.toArray(new Object[keySet.size()]);

    for (Object key : keys) {
        if ((key != null) && key.toString().toLowerCase().contains("font")) {
            Font font = UIManager.getDefaults().getFont(key);
            if (font != null) {
                font = font.deriveFont((float)(scale * font.getSize()));
                UIManager.put(key, font);
            }
        }
    }
}
0 голосов
/ 29 ноября 2018

Похоже, вы используете Linux.Вы можете использовать переключатель командной строки

java -Dsun.java2d.uiScale=2 -jar some_application.jar

С https://wiki.archlinux.org/index.php/HiDPI#Java_applications

0 голосов
/ 28 сентября 2018

Здравствуйте, вопрос немного двусмысленный, но вы пытаетесь это сделать:

private void makeFrameAdjust2YourSize(JFrame aFrame)
{
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    //use your own percentage for width and height like = 0.8 * screenSize.width to cover %80 of screen width
    aFrame.setSize(screenSize.width, screenSize.height);
}

Помните, что вам может потребоваться приложить дополнительные усилия, если вы используете более одного монитора для консольного приложения.

Надеюсь, что поможет

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