图像不局限于直接区域

Image is not being confined to a direct area

在下面的 java 代码中,图像没有被限制在直接区域。我希望 java 图像完整显示在 400 宽 x 400 高 图像中。我试图通过 frame.setSize(400, 400); 做到这一点,但它不起作用。我的代码包括 drawImage,这是我被告知必须放入代码才能使其工作的内容。我不知道接下来要做什么。

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class SwingSandbox {

    public static void main(String[] args) throws IOException {
        JFrame frame = buildFrame();

        final BufferedImage image = ImageIO.read(new File("/Users/johnzalubski/Desktop/c.jpg"));

        JPanel pane = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.drawImage(image, 0, 0, null);
            }
        };


        frame.add(pane);
    }


    private static JFrame buildFrame() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setSize(400, 400);
        frame.setVisible(true);
        return frame;
    }


}

您正在更改框架的大小。你应该使用这样的东西:g.drawImage(image, 0, 0, 400, 400, null);

如果这对你有帮助,请给我投票。我是新来的,想拥有一些基本的声誉。谢谢!

我稍微修改了您的 Swing 沙箱代码。这是我想出的。

图片变形了,因为我让它适合 400 x 400 的绘图面板。您应该缩小图像并保持纵横比。

这是我所做的更改。

  1. 我添加了对 SwingUtilities invokeLater 方法的调用,以将 Swing 组件放在事件调度线程上。

  2. 我将绘图面板设为 class,这样我就可以设置首选大小。您设置绘图面板的大小,而不是 JFrame。谁在乎 JFrame 的大小?

  3. 我按正确的顺序调用了 JFrame 方法。

这是代码。

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;
import javax.swing.WindowConstants;

public class SwingSandbox implements Runnable {

    public static void main(String[] args) throws IOException {
        SwingUtilities.invokeLater(new SwingSandbox());
    }

    private BufferedImage image;

    public SwingSandbox() {
        try {
            image = ImageIO.read(new File("C:\Users\Owner\OneDrive\Pictures\Saved Pictures\StockMarketGame.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        JFrame frame = new JFrame("Image Display");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        DrawingPanel panel = new DrawingPanel(image);

        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
    }

    public class DrawingPanel extends JPanel {

        private static final long serialVersionUID = 1L;

        private BufferedImage image;

        public DrawingPanel(BufferedImage image) {
            this.image = image;
            this.setPreferredSize(new Dimension(400, 400));
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(image, 0, 0, 400, 400, null);
        }

    }

}