Trädvy Permalänk
Medlem
Registrerad
Apr 2016

java ImageIcon enkel fråga

Hej!
Jag har en exempel från bok som implementerar ImageIcon och sätter bilder på JLabel."Bilder med variabel storlek"
Kod ses ut så här:

import javax.swing.*; import java.awt.*; import java.net.*; public class DynamicImageIcon extends ImageIcon{ private JComponent p; public DynamicImageIcon(String filename){ super(filename); } public DynamicImageIcon(URL location){ super(location); } public DynamicImageIcon(Image image){ super(image); } public void setParent(JComponent parent){ p = parent; } public Dimension getIconSize(){ // räkna ut bildens ursprungsstorlek int iw = getImage().getWidth(component), ih = getImage().getHeight(component); if(p==null) return new Dimension(iw, ih); else{ int pw, ph; pw = p.getWidth() -p.getInsets().left-p.getInsets().right; ph = p.getHeight()-p.getInsets().top - p.getInsets().bottom; if(pw/(double)ph <iw/(double)ih) return new Dimension(pw, pw*ih/iw); else return new Dimension(ph*iw/ih, ph); } } public int getIconWidth(){ return getIconSize().width; } public int getIconHeight(){ return getIconSize().height; } public void paintIcon(Component c, Graphics g, int x, int y){ g.drawImage(getImage(), x, y, getIconWidth(), getIconHeight(), component); } } class ImagePlayer extends JFrame{ ImagePlayer(){ DynamicImageIcon d1 = new DynamicImageIcon("hund.gif"); DynamicImageIcon d2 = new DynamicImageIcon("exit.gif"); DynamicImageIcon d3 = new DynamicImageIcon("hammer.gif"); JLabel l1 = new JLabel(d1, JLabel.CENTER); JLabel l2 = new JLabel(d2, JLabel.CENTER); JLabel l3 = new JLabel(d3, JLabel.CENTER); d1.setParent(l1); d2.setParent(l2); d3.setParent(l3); setLayout(new GridLayout(1,3)); add(l1); add(l2); add(l3); setVisible(true); pack(); setDefaultCloseOperation(EXIT_ON_CLOSE); } public static void main (String[]args){ new ImagePlayer(); } }

Koden fungerar jättebra men där finns en sak som jag måste att lära sig. Där sker ingen error, men min Netbeans IDE kryssar alla "component"(totallt tre componenterna) och visar

Deprecated since 1.8 "Do not use this shared component, which is used to track image loading. It is left for backward compatibility only." Min lärobok är ganska gammal och förklarar inte detta. Jag vill att lära sig programmera rätt och säkert. Vad kan man skriva eller göra istället "component"?

Trädvy Permalänk
Medlem
Registrerad
Nov 2016

Kort svar: jag skulle inte bry mig om det.

Långt svar: titta på ImageObserver interfacet, implementera det i klassen DynamicImageIcon (det är en metod som ska implementeras metoden imageUpdate(..)

I metoden imageUpdate får du anropa repaint på parent (p.repaint()), alltså den som håller bilden.

Sedan får du istället för component ändra till this eftersom du nu ska ha samma instans där.

Den enda gången detta kommer ha någon betydelse är om det är animerade gif bilder som måste uppdateras, annars kan man sätta null istället.

Sättet man klurar ut sådant på här är att titta i dokumentationen, den finns på oracles sajt, både dokumentation och tutorials, då får man kolla om det står något mer på sidan om vad som ska användas istället eller så tittar man på vad parametrarna har för typer.

I detta fall såg jag att Image.getWidth(ImageObserver) ville ha en ImageObserver, så jag slog upp vad det var för något, såg att det var ett interface, kollade vilken metod som skulle implementeras och löste det på det sättet.

Så lär dig söka och förstå dokumentation, allt kommer inte stå i böckerna.

Trädvy Permalänk
Medlem
Registrerad
Apr 2016

@kyuw: Tack för snäll snäll snäll svar!