Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Масштабирование объектов в swing  [new]
JDS
Member

Откуда:
Сообщений: 618
Всем привет!
Вопрос возможно, простой, но ответ не нашел пока.
Вывел комп на телек, разрешение 4096*2160.
Сама операционка показывает нормально, сама IDE (JDeveloper) работает нормально.
Swing-формы и компоненты в дизайне IDE тоже отображаются нормально.
Запускаю проект со swing-формами, все формы микроскопические, кнопки микроскопические и надписи на них соответственно тоже. Пробовал менять разрешение в операционке - бесполезно (в телеке оно похоже не меняется или не нашел), но суть, что все остальное отображается нормально.
Этот же проект запускаешь на обычном мониторе (на котором изначально делался проектик и на аналогичных мониторах), все отображается корректно.
2 фев 19, 11:02    [21800340]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование объектов в swing  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 36512
JDS,

Скрины где?
2 фев 19, 11:33    [21800350]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование объектов в swing  [new]
mayton
Member

Откуда: loopback
Сообщений: 38770
Swing обычно имеет несколько Look and Feel-s. Поробуй попереключать их.

Как тут.
https://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html

Да и скрины-бы не помешали. Предположительно swing в том Look&Feel использует растровую графику для иконок
для очень высокого разрешения нет подходящей картинки в ресурсах.
2 фев 19, 13:06    [21800378]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование объектов в swing  [new]
alex55555
Member

Откуда:
Сообщений: 1490
JDS
Вывел комп на телек, разрешение 4096*2160.

Swing рисует "как есть", то есть не масштабирует. Он изначально требует размер, который программист задаёт где-то в программе, либо по дефолту имеется в JVM, как например коэффициент масштабирования для шрифтов. Поэтому на мониторе высотой 1024 точки формочка, например, будет пол-экрана высотой, а на мониторе 2048 та же формочка будет те же 512 точек, то есть четверть экрана высотой.

Гуглите на тему масштабирования хотя бы шрифтов, так хотя бы читабельнее будет. Где-то в JVM есть коэффициент, на который домножается логический размер шрифта, выбранный программистом, вот этот коэффициент наверняка можно поправить, но я сам не изучал эти глубины.
2 фев 19, 16:14    [21800441]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование объектов в swing  [new]
irbis_al
Member

Откуда: Симферополь
Сообщений: 1472
Petro123
JDS,

Скрины где?


Ну вообще-то не скрины а код более нужен...
Например в swing очень важны правило компоновки layout.
И о них надо почитать.
И "с дуру" навскидку наваять не получится.
По идее у автора должен быть BorderLayout ,он задает Типа Цент Север Юг ,Восток Запад.
В центр BorderLayout например кладем другой laypout FlowLayout...(Это горизонтальная комплновка)
И если на этот flowlayout накидать кнопок,- у вас оно будет масштабироваться.
2 фев 19, 17:04    [21800478]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование объектов в swing  [new]
mayton
Member

Откуда: loopback
Сообщений: 38770
Автор же пишет. Кнопки - микроскопические.

Что тебе даст layout в этом случае?
2 фев 19, 17:11    [21800480]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование объектов в swing  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 36512
irbis_al,
Вместо анализа автора, ты анализируешь зачем мне скрины. Непродуктивно... Контрпродуктивно.
2 фев 19, 19:49    [21800526]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование объектов в swing  [new]
JDS
Member

Откуда:
Сообщений: 618
Скрин и код простого примера:
+
package client;

/**
 *
 * @author User
 */
public class NewJFrame extends javax.swing.JFrame {

    /** Creates new form NewJFrame */
    public NewJFrame() {
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    private void initComponents() {//GEN-BEGIN:initComponents

        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setMinimumSize(new java.awt.Dimension(700, 700));

        jButton1.setText("jButton1");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(256, 256, 256)
                .addComponent(jButton1)
                .addContainerGap(89, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(89, 89, 89)
                .addComponent(jButton1)
                .addContainerGap(44, Short.MAX_VALUE))
        );

        jButton1.getAccessibleContext().setAccessibleDescription("");

        pack();
    }//GEN-END:initComponents

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing
                                                                   .UIManager
                                                                   .getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing
                         .UIManager
                         .setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util
                .logging
                .Logger
                .getLogger(NewJFrame.class.getName())
                .log(java.util
                         .logging
                         .Level
                         .SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util
                .logging
                .Logger
                .getLogger(NewJFrame.class.getName())
                .log(java.util
                         .logging
                         .Level
                         .SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util
                .logging
                .Logger
                .getLogger(NewJFrame.class.getName())
                .log(java.util
                         .logging
                         .Level
                         .SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util
                .logging
                .Logger
                .getLogger(NewJFrame.class.getName())
                .log(java.util
                         .logging
                         .Level
                         .SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt
            .EventQueue
            .invokeLater(new Runnable() {
                public void run() {
                    new NewJFrame().setVisible(true);
                }
            });
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton jButton1;
    // End of variables declaration//GEN-END:variables

}

На скрине под единичкой - как видно в дизайне IDE, под двойкой - как выглядит запущенная формочка с кнопкой.
При этом если в IDE по правой кнопке на основной форме Preview Design (как бы предпросмотр), то кнопка масштабируется нормально.

Менять Layout пробовал, не помогло или что не так делал.

Look and Feel посмотрел.
Пробовал и вообще убрать кусок с L&F, который по дефолту вставляется, в main,
Пробовал вместо этого куска getSystemLookAndFeelClassName и getCrossPlatformLookAndFeelClassName
плюс какие-то темы/скины (metal и тд), эффекта не дало.

К сообщению приложен файл. Размер - 123Kb
3 фев 19, 01:03    [21800633]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование объектов в swing  [new]
JDS
Member

Откуда:
Сообщений: 618
В тестовом примере убрал выход из цикла и кнопка в примере отобразилась уже нормально при запуске:
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing
                                                                   .UIManager
                                                                   .getInstalledLookAndFeels()) {
              //  if ("Nimbus".equals(info.getName())) {
                    javax.swing
                         .UIManager
                         .setLookAndFeel(info.getClassName());
            //        break;
              //  }
            }
        }

Но в рабочем приложении это снова помогло только частично: кнопки, текстовые поля и шрифт в них по-прежнему мелкие, отмасштабировались только скроллбары в JList (при этом шрифт в них же остался мелкий)
3 фев 19, 01:13    [21800635]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование объектов в swing  [new]
JDS
Member

Откуда:
Сообщений: 618
Дальше. Заходим в свойства например JList.
Идем в шрифт. Там выбираем галку "Derive the font from the default font" и выставляем галку "Relative" и регулируя параметр рядом (с плюсиком) т.о. вроде бы шрифт можно довести до нужного вида.

Но. Например квадратик чекбокса при этом будет все равно микроскопический, а рядом с ним будет надпись большими буквами.
Или например кнопка все равно мелкая, а т.к. шрифт в ней большой, надпись не видно.

То есть пока нормального решения нет.
Не понятно, почему в тестовом примере кнопка все-таки отмасштабировалась, а в рабочем с этим же куском L&F - нет.
3 фев 19, 01:35    [21800644]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование объектов в swing  [new]
mayton
Member

Откуда: loopback
Сообщений: 38770
Посмотри как тут https://superuser.com/questions/988379/how-do-i-run-java-apps-upscaled-on-a-high-dpi-display

Может поможет. Еще имеет смысл наверное исследовать JavaFx. Фреймворк более современный. И возможно
дефекты hi-res там уже обсуждались и фиксились.
3 фев 19, 01:46    [21800646]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование объектов в swing  [new]
irbis_al
Member

Откуда: Симферополь
Сообщений: 1472
JDS,
Вам надо разобраться с layout
У Вас GroupLayout Его алгоритм компоновки совсем не тот.
https://docs.oracle.com/javase/tutorial/uiswing/layout/group.html
И для кроссплатформенной разработки используется нечасто именно из-за сложности анализа экрана.(ведь это может быть в линуксе и на маке в любом разрешении)

Или же константы компоновки GroupLayout должны быть не хардкондные а в зависимости от разрешения экрана.
Умножаемые на коэффициент начального вашего экрана где всё нормально на результат деления разрешения текущего экрана.

Я сам наступил на эти грабли Jdeveloper,он вроде делает визуализирование,и кажется что всё нормально...а на самом деле нет...Надо изучать фундаментально алгоритм компоновки layout...
И делать всё с пониманием.
В том примере что я вам рассказал выше ,-контролы ,что на лайоте(BorderLayout+FlowLayout+JButton) будут масштабироваться в соответствии с экраном.(лайот становится шире и контрол на нем шире)
3 фев 19, 11:05    [21800700]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование объектов в swing  [new]
JDS
Member

Откуда:
Сообщений: 618
irbis_al, возможно, но пока не уверен, что в layout дело. Нужен бы рабочий простой пример. Если выставляю BorderLayout, то "контрол" всю площадь парента похоже. Но тогда надо под каждую кнопку класть свой парент (который тоже надо масштабировать)? Не что-то не то.

myton, спасибо, почитал, попробовал поменять свойство на экзешниках явы - не помогло. Попробовал как там пишут поставить яву постарше, взял 11.2. Тут уже другие грабли. А именно. Не выходит нормально задеплоить в jar этот проектик (при запуске jar-а говорит, что не может инициализировать основной класс, хотя указывал его при создании профиля для деплоя).
Еще вариант попробовать девелоперу указать, чтобы он компилил через новую яву, как это можно было делать в нетбинзе например, но в jdeveloper не нашел как. Т.е. с явой посвежее пока не вышло.
3 фев 19, 12:26    [21800723]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование объектов в swing  [new]
irbis_al
Member

Откуда: Симферополь
Сообщений: 1472
JDS
irbis_al, возможно, но пока не уверен, что в layout дело. Нужен бы рабочий простой пример. Если выставляю BorderLayout, то "контрол" всю площадь парента похоже. Но тогда надо под каждую кнопку класть свой парент (который тоже надо масштабировать)? Не что-то не то.

myton, спасибо, почитал, попробовал поменять свойство на экзешниках явы - не помогло. Попробовал как там пишут поставить яву постарше, взял 11.2. Тут уже другие грабли. А именно. Не выходит нормально задеплоить в jar этот проектик (при запуске jar-а говорит, что не может инициализировать основной класс, хотя указывал его при создании профиля для деплоя).
Еще вариант попробовать девелоперу указать, чтобы он компилил через новую яву, как это можно было делать в нетбинзе например, но в jdeveloper не нашел как. Т.е. с явой посвежее пока не вышло.


Вы можете посмотреть примеры в OpenSource ИС...Надо только импортировать образ VirtualBox(Надо иметь 40g для разворачивания)
и сразу прямо в Jdeveloper можно смотреть.
http://www.cis-pos.com/apex/f?p=116:43
3 фев 19, 12:40    [21800728]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование объектов в swing  [new]
mayton
Member

Откуда: loopback
Сообщений: 38770
JDS
Попробовал как там пишут поставить яву постарше, взял 11.2. Тут уже другие грабли. А именно. Не выходит нормально задеплоить в jar этот проектик (при запуске jar-а говорит, что не может инициализировать основной класс, хотя указывал его при создании профиля для деплоя).
Еще вариант попробовать девелоперу указать, чтобы он компилил через новую яву, как это можно было делать в нетбинзе например, но в jdeveloper не нашел как. Т.е. с явой посвежее пока не вышло.

Не надо ставить новую джаву. 99% это путь в никуда т.к. библиотека Swing - морально устарела.
И ее практически не развивают.
3 фев 19, 13:07    [21800739]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить