Java GUI / SWING - problème d'image

- - Dernière réponse : frank9932
Messages postés
4
Date d'inscription
jeudi 25 avril 2019
Statut
Membre
Dernière intervention
1 mai 2019
- 1 mai 2019 à 11:50
Bonjour,

J'ai créé une application dans un JFRAME avec des icones pour accéder au différentes applications.

Cependant, sur mon écran externe la définition des icones est parfaite (48 pixels x 48 pixels) alors que quand j'utilise l'écran de mon laptop les icones deviennent floues voir pixélisées.

Est-ce donc du à eclipse/java qui garde en mémoire les paramètres de l'ancien écran ou tout simplement un soucis de résolution ?

Merci d'avance si vous avez une idée !
Afficher la suite 

Votre réponse

6 réponses

Messages postés
7
Date d'inscription
dimanche 10 mars 2019
Statut
Membre
Dernière intervention
29 avril 2019
0
Merci
Salut...il serait souhaitable que l'on puisse voir le bout de code concernant l'organisation de tes icônes..
public class Icon extends JButton {
	private String location;
	private int large;
	private int length;
	private String fileLocation = "";
	
	//Constructeur
	public Icon(String location, int large, int length) {
		this.location=location;
		this.length=length;
		this.large=large;
		
		setPreferredSize(new Dimension(large, length));
		
		setBorderPainted(false); 
		setContentAreaFilled(false); 
		setFocusPainted(false); 
		setOpaque(false);
	}
	
	public void paintComponent(Graphics g){

		try {
			Image img = ImageIO.read(new File(location));
			g.drawImage(img, 0, 0, this.getWidth(), this.getHeight(), this);
		} catch (IOException e) {
			Image img;
			try {
				img = ImageIO.read(new File(fileLocation));
				g.drawImage(img, 0, 0, this.getWidth(), this.getHeight(), this);
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		}   
	}

}
Sinon elles sont mises comme ça dans la Frame principale :
Icon iconContact = new Icon("images/icons/Contacts-48.png", 48, 48);

//dans le constructeur
background.setLayout(new FlowLayout(30,50,70));
background.add(iconContact);
Commenter la réponse de Numeric1
Messages postés
7
Date d'inscription
dimanche 10 mars 2019
Statut
Membre
Dernière intervention
29 avril 2019
0
Merci
J'ai réajuster quelques paramètres (..............)


import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JButton;

public class Icon extends JButton {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private String location;
	private int large = 10;
	private int length = 10;
	private String fileLocation = "";
	
	//Constructeur
	
	public Icon(String location, int large, int length) {
		// Vraiment heriter de la classe JButton
		super();
		
		this.location=location;
		this.length=length;
		this.large=large;
		
		setPreferredSize(new Dimension(large, length));
		
		setBorderPainted(false); 
		setContentAreaFilled(false); 
		setFocusPainted(false); 
		setOpaque(false);
		
		// Assigner une tâche de rafraîchissement
		// NB: cette tâche est séverement ajoutée dans ce cas
		//La changer si non nécessaire
		this.addChangeListener((fx)->{
			refresh();
		});
		
		
		     
		
	}
	// Bien que la methode soit appellée d'elle même, il
	// faut prévoir une issue de secours : rafraichîr l'affichage.
	// Car cetains composants la gèrent mal.
	public void refresh() {
		this.repaint();
	}
	
	
	public void paintComponent(Graphics g){
		// Invoquer Graphics 2D afin de jouir de toutes
		//les performances de la class graphic
		Graphics2D g2 = (Graphics2D)g;

		try {
			Image img = ImageIO.read(new File(location));
			g2.drawImage(img, 0, 0, this.getWidth(), this.getHeight(), this);
		} catch (IOException e) {
			Image img;
			try {
				img = ImageIO.read(new File(fileLocation));
				g2.drawImage(img, 0, 0, this.getWidth(), this.getHeight(), this);
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		}   
	}

}
Commenter la réponse de Numeric1
Messages postés
7
Date d'inscription
dimanche 10 mars 2019
Statut
Membre
Dernière intervention
29 avril 2019
0
Merci
Essaie ça!
Mais tu pourrais par exemple créer une classe dérivée de celle d'Icon avec toutes ses propriétés. Tu lui imposeras des contraintes selon tes objectifs. Ainsi tous tes autres types de composants pourront en bénéficier.
Commenter la réponse de Numeric1
0
Merci
Salut !

Merci beaucoup pour ta réponse.
Même après avoir tenté d'implémenter ton code les icônes restent floues.

Malgré tout j'ai finalement identifié le problème qui vient non pas du code mais de la résolution d'écran utilisée.

En effet je suis sur du 1920 x 1080 et la mise à l'échelle de Windows était à 125%. Si je la règle sur 100% les icônes et autres images sont parfaites.

Après comment faire pour que l'affichage soit correct même en 125% ?
Commenter la réponse de Rapidos
Messages postés
7
Date d'inscription
dimanche 10 mars 2019
Statut
Membre
Dernière intervention
29 avril 2019
0
Merci
Salut...ce problème dépasse donc notre JButton qui est fortement dépendant de ses layouts...Alors il se situe donc au niveau de notre fenêtre principale: notre JFrame.
Une fois que nous l'aurons traité à ce niveau, la JFrame se chargera du reste: Réorganiser convenablement ses petits objets.
Voici un exemple de code qui pourrait peut-être servir de point de départ. Puisque maintes sont les possibilités dans ce cas précis.

import java.awt.Dimension;
import java.awt.Toolkit;

public class RedimApp {
	
	//La resolution d'écran de la machine hôte
	// ayant servit à coder et tester le code.
	private final double eWidth = 1366.0;
	private final double eHeight = 768.0;
	
	// La future nouvelle dimension
	private Dimension newDim;
	
	/*
	 * Methode servant à calculer la nouvelle dimension
	 * de la GUI. en fonction d'une dimension fonctionnelle
	 * connue de l'écran; et de la dimension de la GUI voulue
	 * par le progammeur et même par l'utilisateur (onResize....fait l'affaire)
	 */
	public Dimension dimCalculating(Dimension myAppDim) {
		// On récupère la dim de l"ecran: machine hôte
	   Dimension screenDim = Toolkit.getDefaultToolkit().getScreenSize();
	   
	   // On calcule la dimension appropriée
	   double newWidth = Math.abs((eWidth-screenDim.getWidth())+ myAppDim.getWidth());
	   double newHeight = Math.abs((eHeight-screenDim.getHeight())+ myAppDim.getHeight());
	   
	   // On rétourne cette nvlle dimension
	   //(ex: utilisée dans la JFrame comme suit:
	   //this.setSize(newDim))
	   
	   newDim.setSize(newWidth, newHeight);
	   return newDim;
	}

}
Commenter la réponse de Numeric1
Messages postés
4
Date d'inscription
jeudi 25 avril 2019
Statut
Membre
Dernière intervention
1 mai 2019
0
Merci
The source below works. Changes include:

Returning a sensible preferred size. Removing all calls to setSize(..).
Factoring out the panel to which the image was added, and instead adding it directly to the Panel instance.
But Panel was renamed ImagePanel so that is not the same name as an existing AWT class!
Removing the calls to setVisible(..). The only thing that applies to is top level containers like JFrame or JDialog. For the rest, add them to a container that is itself made visible.

import java.awt.*;
import javax.swing.*;
import java.net.URL;
import javax.imageio.ImageIO;

class Gui {
//Importiert Auflösung des Bildschirms
Toolkit tk = Toolkit.getDefaultToolkit();
Dimension screenSize = tk.getScreenSize();

//Setzt Variablen für die Auflösung
public int aufloesungBreite = screenSize.width;
public int aufloesungHoehe = screenSize.height;

//Setzt die Berechnung des JFrame hauptfenster Location
private int breite = aufloesungBreite/2 - 640;
private int hoehe = aufloesungHoehe/2 - 400;


public Gui() {
JFrame hauptfenster = new JFrame("Verwaltungssoftware fuer die Jobsuche");
hauptfenster.setDefaultCloseOperation(hauptfenster.EXIT_ON_CLOSE);
hauptfenster.setResizable(false);
hauptfenster.setLocation(breite, hoehe);
hauptfenster.setSize(1280,800);
hauptfenster.setLayout(new BorderLayout(5,5));

//Addet hauptpanel zum JFrame
ImagePanel hauptpanel = new ImagePanel();
hauptfenster.add(hauptpanel);
hauptpanel.setVisible(true);
hauptfenster.setVisible(true);
}

public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
new Gui();
}
};
SwingUtilities.invokeLater(r);
}
}

class ImagePanel extends JPanel {
//Variablen
Image icon1;

//Konstruktor
public ImagePanel() {
try {
URL url = new URL("http://i.stack.imgur.com/7bI1Y.jpg");
icon1 = ImageIO.read(url);
} catch (Exception e) {
e.printStackTrace();
}

setLayout(new BorderLayout (5,5));
JLabel myLabel=new JLabel(new ImageIcon(icon1));
add(myLabel);
}

// very important!
@Override
public Dimension getPreferredSize() {
return new Dimension(icon1.getWidth(this), icon1.getHeight(this));
}
}
frank9932
Messages postés
4
Date d'inscription
jeudi 25 avril 2019
Statut
Membre
Dernière intervention
1 mai 2019
-
Commenter la réponse de frank9932

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.