Я обновил версию компилятора для базового проекта Swing с JDK1.8 до JDK10. Это привело к ухудшению разрешения изображения, а размеры и размеры JPanels теперь выглядят по-разному. Смотрите скриншоты для J8 против J10:

Java 8: Java 8:

Java 10: Java 10:

Ниже приведен весь код приложения:

package com.nickjwhite.test;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.Insets;
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;


public class App {

    //UI objects
    private JFrame frame;
    private JPanel contentPane;


    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        new App();
    }

    public App() {
        try {

            //
            //
            //Initialise Parent Frame
            //
            //
            setFrame(new JFrame());
            getFrame().setSize(1200,800); // Dimensions of non-Maximised frame
            getFrame().setTitle("Test App");
            getFrame().setLocationRelativeTo(null); // Centre the frame
            getFrame().setExtendedState(JFrame.MAXIMIZED_BOTH); // Maximise the frame on launch
            getFrame().setIconImage(ImageIO.read(getClass().getClassLoader().getResourceAsStream("test.jpg")));
            getFrame().setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Kill process if window closed
            getFrame().setVisible(true);


            //
            //
            //Main content panel
            //
            //
            contentPane = new JPanel(new GridBagLayout());
            contentPane.setBackground(Color.decode("#2e3131"));
            getFrame().setContentPane(contentPane);


            //
            //
            //MenuPanel
            //
            //
            JPanel menuPanel = new JPanel();

                //Initialise Menu

                // Title Background
                //
                JPanel menuTitleBg = new JPanel();
                menuTitleBg.setLayout(new GridBagLayout());
                menuTitleBg.setBackground(Color.decode("#d5b8ff"));

                GridBagConstraints menuTitleBg_constraints = new GridBagConstraints();
                menuTitleBg_constraints.fill = GridBagConstraints.BOTH;
                menuTitleBg_constraints.gridx = 0;
                menuTitleBg_constraints.gridy = 0;
                menuTitleBg_constraints.weightx = 1;
                menuTitleBg_constraints.weighty = 0;
                menuPanel.add(menuTitleBg, menuTitleBg_constraints);

                JLabel testImage = new JLabel();

                GridBagConstraints testImage_constraints = new GridBagConstraints();
                testImage_constraints.insets = new Insets(10, 10, 10, 10);
                testImage_constraints.gridx = 0;
                testImage_constraints.gridy = 0;

                testImage.setSize(new Dimension(80,80));
                testImage.setOpaque(false);
                menuTitleBg.add(testImage,testImage_constraints);

                try {
                    BufferedImage img = ImageIO.read(App.class.getClassLoader().getResourceAsStream("test.jpg"));
                    Image dimg = img.getScaledInstance(testImage.getWidth(), testImage.getHeight(), Image.SCALE_SMOOTH);

                    testImage.setIcon(new ImageIcon(dimg));
                } catch (IOException e) {
                    e.printStackTrace();
                }





            menuPanel.setLayout(new GridBagLayout());
            menuPanel.setBackground(Color.decode("#9b59b6"));
            menuPanel.setPreferredSize(new Dimension(400, (int) (contentPane.getPreferredSize().height)));
            menuPanel.setMinimumSize(new Dimension(400,10));
            GridBagConstraints gbc_panel = new GridBagConstraints();
            gbc_panel.fill = GridBagConstraints.BOTH;
            gbc_panel.gridx = 0;
            gbc_panel.gridy = 0;
            gbc_panel.weightx = 0;
            gbc_panel.weighty = 1;

            JScrollPane menuScrollPane = new JScrollPane(menuPanel);
            menuScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
            menuScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
            menuScrollPane.setPreferredSize(new Dimension(400, (int) (contentPane.getPreferredSize().height)));

            contentPane.add(menuScrollPane , gbc_panel);


            //
            //
            //Action Window Panel
            //
            //
            JPanel actionWindow = new JPanel();
            actionWindow.setLayout(new GridBagLayout());
            actionWindow.setBackground(Color.decode("#2e3131"));
            GridBagConstraints gbc_actionWindow = new GridBagConstraints();
            gbc_actionWindow.anchor = GridBagConstraints.EAST;
            gbc_actionWindow.fill = GridBagConstraints.BOTH;
            gbc_actionWindow.gridx = 1;
            gbc_actionWindow.gridy = 0;
            gbc_actionWindow.weightx = 1;
            gbc_actionWindow.weighty = 1;

            contentPane.add(actionWindow, gbc_actionWindow);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public JFrame getFrame() {
        return frame;
    }

    public void setFrame(JFrame frame) {
        this.frame = frame;
    }

}

Мне нужно продолжить компиляцию с JDK10 для этого проекта, но мне нужен графический интерфейс, отражающий вывод JDK8, желательно получить это без необходимости настраивать предпочтительный размер menuPanel или размеры testImage.

Кто-нибудь знает, что вызвало это?

test.jpg

2
nick_j_white 27 Дек 2019 в 18:52
1
Предоставьте минимальный воспроизводимый пример, демонстрирующий проблему. И я делал graphics даже до Swing, и я не заметил никакой разницы в разрешении между версиями.
 – 
WJS
27 Дек 2019 в 19:32
1
Я только что провел свой собственный тест (у меня не было ваших изображений), используя Java 8 и Java 10. Я не заметил разницы в разрешении изображений. И заявленные параметры разрешения и DPI были такими же, как и другие особенности внутренней графической среды. Возможно, кто-то еще может предоставить дополнительную информацию.
 – 
WJS
27 Дек 2019 в 20:21
1
Если прикрепите свои изображения, я их попробую.
 – 
WJS
27 Дек 2019 в 21:30
1
Просто предложение. Вместо ImageIO попробуйте новый ImageIcon (URL)
 – 
Abra
27 Дек 2019 в 22:02
1
Я не могу добиться таких же результатов, как вы. Вы уверены, что опубликованный код отображает показанные изображения? А какой ПК / ОС вы используете?
 – 
WJS
27 Дек 2019 в 22:59

1 ответ

Я долгое время занимался графикой в версиях, предшествующих Java 8, и не видел никакой разницы в разрешениях. Вы используете тот же компьютер и тип монитора? Это также может быть проблемой.

Вот простая программа для чтения изображений и отображения изображений. Видите ли вы ту же проблему, когда вы используете одно и то же изображение под Java 8 и Java 10?

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class ShowImage extends JPanel {
   final static int    height = 800;
   final static int    width  = 800;

   JFrame              frame  = new JFrame("Image Test");
   BufferedImage buf;
   String fileName = "your jpeg here"; //   /dir1/dir2...file.jpg  
   public static void main(String[] args) {
      SwingUtilities.invokeLater(() -> new ShowImage().start());
   }

   public ShowImage() {
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.add(this);
      frame.setPreferredSize(new Dimension(width, height));
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public void start() {
      try {
      buf = ImageIO.read(new File(fileName));  
      } catch (IOException ioe) {
         ioe.printStackTrace();
      }
   }

   public void paintComponent(Graphics g) {
      super.paintComponent(g);
      if (buf == null) {
         return;
      }
      g.drawImage(buf,0,0,null);

   }

}

0
WJS 27 Дек 2019 в 19:48
Как это отвечает на вопрос? Даже если вы попросите разъяснений, комментария было более чем достаточно. Примечание. В JDK9 + есть изменения, которые действительно отражают разницу в UX.
 – 
Naman
27 Дек 2019 в 19:58