Avatar billede frostware Nybegynder
13. december 2005 - 18:57 Der er 24 kommentarer og
1 løsning

ImageIcon skal resize's

Hej

Jeg har en label hvor der skal kunne vises forskellige billeder. Problemet er, at tager man billeder i for stor opløsning kan de ikke være der.

Jeg bruger ImageIcon...

Er det muligt at tilpasse billedet efter størrelsen på en label.
Avatar billede mikkelbm Nybegynder
13. december 2005 - 19:05 #1
Jeg lavede på et tidspunkt denne klasse:


import java.awt.*;
import java.awt.image.*;
import javax.swing.*;

public class ImageLabel extends JComponent
{
  public static final int ALIGN_VERTICAL_TOP = 1,  ALIGN_VERTICAL_CENTER = 2, ALIGN_VERTICAL_BOTTOM = 3;
  public static final int ALIGN_HORIZONTAL_LEFT = 1,  ALIGN_HORIZONTAL_CENTER = 2, ALIGN_HORIZONTAL_RIGHT = 3;

  private Image image;
  private boolean stretchAlways;
 
  public ImageLabel()
  {
      this(true);
  }

  public ImageLabel(boolean stretchAlways)
  {
    this(null, stretchAlways);
  }

  public ImageLabel(Image image, boolean stretchAlways)
  {
    this.image = image;
    this.stretchAlways = stretchAlways;
  }

  public void paintComponent(Graphics g)
  {
    super.paintComponent(g);

    if (image != null)
    {
      Graphics2D gfx = (Graphics2D) g;
      int w = this.getWidth();
      int h = this.getHeight();

      if (!stretchAlways)
      {
        /** @todo muligvis lave sådan at det er muligt at tegne image ud fra alignment settings */
        int imgW = image.getWidth(null);
        int imgH = image.getHeight(null);
        w = Math.min(w, imgW);
        h = Math.min(h, imgH);
      }

      gfx.drawImage(image, 0, 0, w, h, this);
      gfx.dispose();
    }
  }

  public Image getImage()
  {
    return image;
  }

  public void setImage(Image image)
  {
    this.image = image;
  }
}

Håber du kan bruge den.
Avatar billede mikkelbm Nybegynder
13. december 2005 - 19:08 #2
Og ovenstående klasse bruger du så i stedet for din label.
Avatar billede frostware Nybegynder
18. december 2005 - 13:21 #3
Jeg kan ikke helt overskue hvor det er jeg skal bruge det..
Avatar billede mikkelbm Nybegynder
18. december 2005 - 13:22 #4
Du skal bruge den i stedet for din JLabel.
Avatar billede frostware Nybegynder
18. december 2005 - 13:39 #5
hmmm.... Nu har jeg måske lavet noget. Jeg har lavet en ImageLabel med navnet test. Og så har jeg

test.setBounds(new Rectangle(32, 740, 34, 15));

for at sætte den et sted. Men hvordan skriver jeg stien til billedet?

test. ???
Avatar billede mikkelbm Nybegynder
18. december 2005 - 13:43 #6
Kunne gøres sådan her:

test.setImage (new ImageIcon ("c:\sti_til_dit_billede").getImage());
Avatar billede frostware Nybegynder
18. december 2005 - 13:48 #7
ja så begynder det at ligne noget. Men JBuilder brokker sig nu over linien:

test.setBounds(new Rectangle(32, 740, 34, 15));

er det ikke den rigtige måde at gøre det på?
Avatar billede mikkelbm Nybegynder
18. december 2005 - 13:51 #8
Jo. Hvad melder den af fejl?
Avatar billede frostware Nybegynder
18. december 2005 - 13:52 #9
java.lang.NullPointerException
    at main.programmet.jbInit(programmet.java:434)
    at main.programmet.<init>(programmet.java:81)
    at main.moviez.<init>(moviez.java:22)
    at main.moviez.main(moviez.java:58)


Fejlen kommer først når programmet er startet, og billedet kommer ikke frem.
Avatar billede mikkelbm Nybegynder
18. december 2005 - 13:54 #10
Så er det fordi du kalder setBounds inden du har oprettet en instans af ImageLabel.

Husker du at: test = new ImageLabel (true);

Inden du kalder metoder på test?
Avatar billede frostware Nybegynder
18. december 2005 - 13:56 #11
det har jeg gjort nu, og det virker.
Avatar billede mikkelbm Nybegynder
18. december 2005 - 13:58 #12
Super...
Avatar billede mikkelbm Nybegynder
18. december 2005 - 14:10 #13
Hvis det virker, så husk at lukke spørgsmålet :)
Avatar billede frostware Nybegynder
18. december 2005 - 15:31 #14
ja, men jeg har lige nogle flere spørgsmål.

Jeg har en knap som gemmer et objekt i en fil på harddisken. Som det er nu har den knap intet med ImageLabel at gøre, men alligevel kommer den med fejl når der trykkes på knappen.

Kan det være fordi at pc'en både skal skrive objekterne til en fil og på samme tid finde billedet til ImageLabel
Avatar billede mikkelbm Nybegynder
18. december 2005 - 15:33 #15
Hvad er det for en fejl den kommer med?

Og nej, hvis det er to forskellige filer, så har det intet med hinanden at gøre.
Avatar billede frostware Nybegynder
18. december 2005 - 15:40 #16
java.lang.RuntimeException: Fejl i skrivning af fil
    at client.OpenSave.gem(OpenSave.java:18)
    at main.programmet.gem(programmet.java:595)
    at main.programmet.cmdGem_actionPerformed(programmet.java:913)
    at main.programmet_cmdGem_actionAdapter.actionPerformed(programmet.java:1036)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1786)
    at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(AbstractButton.java:1839)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:245)
    at java.awt.Component.processMouseEvent(Component.java:5100)
    at java.awt.Component.processEvent(Component.java:4897)
    at java.awt.Container.processEvent(Container.java:1569)
    at java.awt.Component.dispatchEventImpl(Component.java:3615)
    at java.awt.Container.dispatchEventImpl(Container.java:1627)
    at java.awt.Component.dispatchEvent(Component.java:3477)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3483)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3198)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3128)
    at java.awt.Container.dispatchEventImpl(Container.java:1613)
    at java.awt.Window.dispatchEventImpl(Window.java:1606)
        at java.awt.Component.dispatchEvent(Component.java:3477)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)

Hvis jeg fjerner:
FilmPicture.setImage(filmPic.getImage());

Så kommer fejlen ikke...
Avatar billede mikkelbm Nybegynder
18. december 2005 - 15:42 #17
Og det er ikke fordi du tilfældigvis kommer til at læse og skrive på den samme fil?
Avatar billede frostware Nybegynder
18. december 2005 - 15:45 #18
det tror jeg ikke. Billedets sti er

.\Pictures\choose.jpg

Og den anden fil hedder list.fil
Avatar billede mikkelbm Nybegynder
18. december 2005 - 15:47 #19
Så ved jeg det ikke. Jeg tvivler nu stærkt på at det har noget med min klasse at gøre, for den får jo bare et Image objekt at arbejde med, og hverken læser eller skriver noget til harddisken.
Avatar billede frostware Nybegynder
18. december 2005 - 16:15 #20
Fejlen kommer kun hvis man angiver en sti til ImageIcon billedet. F.eks. har jeg nu skrevet

ImageIcon filmPic = new ImageIcon();

Og fejlen kommer ikke. Men så snart der står en eller anden sti i parantesen kommer fejlen igen.

Du må sige til hvis du ikke gider at hjælpe mere, for det har vel ikke så meget med det oprindelige spørgsmål at gøre...
Avatar billede mikkelbm Nybegynder
18. december 2005 - 16:17 #21
Jeg kan bare ikke forstå at det skulle ha' noget at sige, hvis ikke det er samme fil. Og nu ved jeg jo heller ikke hvad der sker, når du læser og gemmer dine filer.
Avatar billede frostware Nybegynder
18. december 2005 - 16:18 #22
jeg bruger den her (som du vidst har givet mig under et andet spørgsmål):
import java.io.*;

public class OpenSave
{
      public static void gem(Object obj, String filnavn) throws Exception
      {
            try
        {
              FileOutputStream datastrøm = new FileOutputStream(filnavn);
              ObjectOutputStream objektstrøm = new ObjectOutputStream(datastrøm);
              objektstrøm.writeObject(obj);
              objektstrøm.close();
        }
        catch (Exception e)
        {
            throw new RuntimeException("Fejl i skrivning af fil");
        }
      }

      public static Object hent(String filnavn) throws Exception
      {
              FileInputStream datastrøm = new FileInputStream(filnavn);
              ObjectInputStream objektstrøm = new ObjectInputStream(datastrøm);
              Object obj = objektstrøm.readObject();
              objektstrøm.close();
              return obj;
      }
}
Avatar billede mikkelbm Nybegynder
18. december 2005 - 16:24 #23
Hvad er det du prøver at gemme? Er alle dine objekter serializable?
Avatar billede frostware Nybegynder
18. december 2005 - 16:28 #24
Jeg kører den her:
client.OpenSave.gem(data.toArray(), "list.fil");

Og data består af noget der hedder Something, som er bestemt ud fra klassen:

class Something
      implements Serializable {
    private String lblTitle, txtAar, txtUdgiver, txtSkuespillere, txtKommentar,
        lblEgen, lblIMDB, checkBox;



    public Something(String lblTitle, String txtAar, String txtUdgiver,
                    String txtSkuespillere, String txtKommentar,
                    String lblEgen, String lblIMDB, String checkBox) {

      this.lblTitle = lblTitle;
      this.txtAar = txtAar;
      this.txtUdgiver = txtUdgiver;
      this.txtSkuespillere = txtSkuespillere;
      this.txtKommentar = txtKommentar;
      this.lblEgen = lblEgen;
      this.lblIMDB = lblIMDB;
      this.checkBox = checkBox;


    }

    public String getLblTitle() {
      return lblTitle;
    }

    public String getTxtAar() {
      return txtAar;
    }

    public String getTxtUdgiver() {
      return txtUdgiver;
    }

    public String getTxtSkuespillere() {
      return txtSkuespillere;
    }

    public String getTxtKommentar() {
      return txtKommentar;
    }

    public String getLblEgen() {
      return lblEgen;
    }

    public String getLblIMDB() {
      return lblIMDB;
    }

    public String getCheckBox(){
      return checkBox;
    }



    public String toString() {
      return lblTitle;
    }

    public boolean equals(Object o) {
      return this.getLblTitle().equalsIgnoreCase( ( (Something) o).
                                                getLblTitle());
    }
  }
Avatar billede mikkelbm Nybegynder
18. december 2005 - 16:30 #25
Hmmmmmm... Så er jeg godt nok blank. Jeg kan ikke gennemskue hvorfor at der skulle være en sammenhæng med om der er loadet et billede eller ej.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester