La imagen no se limita a un área directa

Tim Tebow:

La imagen no se limita a un área directa en el código java a continuación. Quiero que la imagen de Java que se mostrará en su totalidad en un ancho de 400 altura 400 por imagen. Traté de hacer que al frame.setSize(400, 400);y no está funcionando. Mi código incluye drawImage que es lo que me dijeron que tenía que poner en el código para que esto funcione. Ni qué hacer a continuación.

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;
    }


}
Gilbert Le Blanc:

Me reelaborado su swing caja de arena código un poco. Esto es lo que ocurrió.

La imagen en pantalla

La imagen está distorsionada porque lo hice encaja un panel de dibujo 400 x 400. Usted debe reducir la imagen y mantener la relación de aspecto.

Estos son los cambios que hice.

  1. He añadido la llamada a los SwingUtilities invokeLater método para colocar los componentes Swing en el hilo de eventos de Despacho.

  2. Hice el panel dibujo una clase, por lo que podría establecer el tamaño preferido. Se establece el tamaño del panel de dibujo, no el JFrame. A quién le importa lo grande o pequeño que sea el JFrame es?

  3. Pongo las llamadas a métodos JFrame en el orden correcto.

Y aquí está el código.

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);
        }

    }

}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=345289&siteId=1
Recomendado
Clasificación