Изображение не ограничивается прямой областью - PullRequest
0 голосов
/ 22 марта 2020

Изображение не ограничивается прямой областью в этом коде java ниже. Я хочу, чтобы изображение java отображалось полностью в формате 400 при высоте 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;
    }


}

Ответы [ 2 ]

0 голосов
/ 22 марта 2020

Я немного переделал твой код песочницы Swing. Вот то, что я придумал.

Image Display

Изображение искажено, потому что я сделал его подходящим для панели рисования 400 x 400. Вы должны уменьшить изображение и сохранить соотношение сторон.

Вот изменения, которые я сделал.

  1. Я добавил вызов метода invingLater SwingUtilities, чтобы поместить компоненты Swing в потоке рассылки событий.

  2. Я сделал чертежную панель классом, чтобы установить желаемый размер. Вы устанавливаете размер панели рисования, а не 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);
        }

    }

}
0 голосов
/ 22 марта 2020

Вы меняете размер кадра. Вы должны использовать что-то вроде этого: g.drawImage(image, 0, 0, 400, 400, null);

Если это поможет вам, пожалуйста, проголосуйте за меня. Я здесь новичок и хочу иметь базовую c репутацию. Спасибо! ?

...