Maison >Java >javaDidacticiel >Comment redimensionner efficacement les images dans un JLabel pour les adapter ou remplir ses dimensions ?
Mise à l'échelle automatique de l'image pour JLabel
Lors de l'affichage d'images dans un JFrame à l'aide d'un JLabel, vous pouvez rencontrer des situations où la taille de l'image est incohérente. Pour redimensionner et ajuster uniformément les images dans JLabel, vous pouvez tirer parti de l'approche suivante.
Évitez d'utiliser getScaledInstance
Bien que Image.getScaledInstance soit un choix courant, ce n'est pas le cas. l’option la plus efficace ou de la plus haute qualité. Au lieu de cela, un composant personnalisé peut être créé pour améliorer à la fois la vitesse et la clarté de l'image.
Déterminez la méthode de mise à l'échelle
Vous avez la possibilité de choisir la méthode de mise à l'échelle, que vous souhaitez conserver les proportions avec "toFit" ou remplir complètement l'espace disponible avec "toFill".
Composant personnalisé pour évolutif Images
Le composant personnalisé suivant, ScalablePane, vous permet de définir le mode de mise à l'échelle et d'ajuster automatiquement la taille de l'image en fonction des dimensions de l'étiquette.
public class ScalablePane extends JPanel { // Scaled image private Image scaled; // Scaling mode: fit or fill private boolean toFit; // Constructor with image and scaling mode public ScalablePane(Image master, boolean toFit) { this.toFit = toFit; generateScaledInstance(); // Initial scaling } // Override getPreferredSize to return master image size @Override public Dimension getPreferredSize() { return master == null ? super.getPreferredSize() : new Dimension(master.getWidth(this), master.getHeight(this)); } // Override paintComponent to draw the scaled image @Override protected void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(scaled, 0, 0, this); } // Generate the scaled image based on the scaling mode protected void generateScaledInstance() { if (isToFit()) { scaled = getScaledInstanceToFit(master, getSize()); } else { scaled = getScaledInstanceToFill(master, getSize()); } } // Generate toFit image protected Image getScaledInstanceToFit(Image master, Dimension size) { Dimension masterSize = new Dimension(master.getWidth(this), master.getHeight(this)); return getScaledInstance(master, getScaleFactorToFit(masterSize, size)); } // Generate toFill instance protected Image getScaledInstanceToFill(Image master, Dimension size) { Dimension masterSize = new Dimension(master.getWidth(this), master.getHeight(this)); return getScaledInstance(master, getScaleFactorToFill(masterSize, size)); } // Actual scaling logic protected Image getScaledInstance(Image master, double scaleFactor) { BufferedImage img = toBufferedImage(master); return getScaledInstance(img, scaleFactor, RenderingHints.VALUE_INTERPOLATION_BILINEAR, true); } // ... additional helper methods and utility functions omitted for brevity }
Comment Utiliser
Pour utiliser cette approche, créez une instance ScalablePane avec l'image et le mode de mise à l'échelle souhaités, ajoutez-la à votre étiquette, puis définissez la taille préférée de l’étiquette. Le composant personnalisé mettra automatiquement à l'échelle et affichera l'image si nécessaire.
ImageIcon img = new ImageIcon("res.png"); JLabel label = new JLabel(img); label.setPreferredSize(new Dimension(200, 100)); label.add(new ScalablePane(img, true));
En tirant parti de ce composant personnalisé, vous pouvez obtenir une mise à l'échelle automatique et efficace de l'image pour correspondre aux dimensions de votre JLabel, garantissant une représentation cohérente de l'image quel que soit le sa taille originale.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!