JDK10中的Java Swing图形分辨率和尺寸失真

问题描述 投票:0回答:1

我已经将基本的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进行编译,但是需要GUI重新体现JDK8的输出,最好在无需调整menuPanel Preferred Size或testImage尺寸的情况下即可实现。

任何人都知道这是什么原因吗?

java swing java-8 java-10
1个回答
0
投票

我在Java 8之前的版本中已经做过很长时间的图形处理,并且分辨率没有任何差异。您是否使用相同的PC和显示器类型?这也可能是一个问题。

这里是一个简单的程序,可以读取图像并显示图像。当您在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);

   }

}

© www.soinside.com 2019 - 2024. All rights reserved.