Java swing + UI scale

184
05 октября 2018, 03:40

Мне нужно организовать поддержку скалирования интерфейса. В интерфейсе присутствуют кнопки с иконками и JPanel, на котором они лежат.

Проблема в том, что кнопка принимает размеры иконки и при скалировании иконка размывается. Я пробовал ставить в PaintComponent скалирование меньше, чтобы скалирование кнопки на скалирвоание системы дало 1, но в этом случае JPanel сохраняет первоначальные размеры и получается что панель выглядит заметно больше, чем требовалось бы. Пробовал поставить такое же скалирование что и в кнопке, в JPanel , но тога теряется смысл скалирования кнопки, ибо уже визуально идет уменьшение. Получается что чтобы не сделал - порочный круг, уже не знаю куда смотреть даже.

Собственно получается что-то типо этого:

Причем кнопка тыкается даже в красной зоне. Почему так происходит - понятно, JPanel не уменьшается. Но как сделать так, чтобы это все работало нормально, я уже не знаю. Код ниже, хотя там ничего интересного нету. Спасибо.

public class Test{
    public static void main(String[] args) throws Exception{
        System.setProperty("sun.java2d.uiScale", "1.5");
        JFrame j = new JFrame();
        Image img = ImageIO.read(new File("D:\\1.png"));
        j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        j.setPreferredSize(new Dimension(300, 150));
        j.setVisible(true);
        j.setLocationRelativeTo(null);
        j.setLayout(new BorderLayout());
        img = img.getScaledInstance((int) (60 * 1.5),(int) (60 * 1.5),Image.SCALE_DEFAULT);
        JToggleButton tb = new JToggleButton(){
            @Override
            protected void paintComponent(Graphics g) {
                Graphics2D g2 = (Graphics2D) g;
                g2.scale(0.67,0.67);
                super.paintComponent(g2);
            }
        };
        tb.setIcon(new ImageIcon(img));
        JToggleButton tb2 = new JToggleButton(){
            @Override
            protected void paintComponent(Graphics g) {
                Graphics2D g2 = (Graphics2D) g;
                g2.scale(0.67,0.67);
                super.paintComponent(g2);
            }
        };
        tb2.setIcon(new ImageIcon(img));

        JPanel jPanel = new JPanel(){
        };
        jPanel.setLayout(new GridLayout(1,1));
        jPanel.add(tb);
        jPanel.setBackground(Color.RED);

        JPanel content = new JPanel();
        content.setLayout(new FlowLayout());
        content.add(jPanel);
        j.setContentPane(content);
        j.pack();
    }
}
READ ALSO
Использование RichTextFX

Использование RichTextFX

У меня есть консоль, которая реализована на TextFlowВ ней меняется цвет, в зависимости от типа сообщения (ERROR - red, WARNING - yellow и тд)

234
Navigation Drawer переход к фрагментам или активити

Navigation Drawer переход к фрагментам или активити

Поискав на просторах интернета, на данный момент не смог найти ответа на свой вопрос, хотя в принципе его должны были неоднократно задавать

158
retrofit 2, экранирование двойных кавычек

retrofit 2, экранирование двойных кавычек

Имеется строка вида {"asdasd":"adsasd"}Формируется данная строка с помощью символа экранирования

161
Перерисовка маркеров google maps api

Перерисовка маркеров google maps api

Имеется класс, реализующий поиск ближайших мест на карте путем отправки запроса и получения результатов в jsonЗапросы отправляются и получаются...

188