Avatar billede isakmpx509 Nybegynder
03. april 2004 - 18:03 Der er 9 kommentarer og
1 løsning

Opdaterin af billede på en JLabel

Hej

Jeg har et problem med opdatering af et billede på en JLabel.
Sagen er den at jeg skal hente billeder fra et kamera således at disse opdateres f.eks. hvert sekund. Problemet er at ImageIcon antager at det første billede der bliver hentet fra URL'en aldrig bliver ændret.

Er der nogen der har en løsning på dette problem

Mvh

Laurits
Avatar billede _carsten Nybegynder
03. april 2004 - 19:43 #1
Egentlig burde der ikke være noget som kan gå galt i den sitution, så jeg har lavet nedenstående eksempel som formentlig kan lede dig på sporet.



public class JFrame_5 extends javax.swing.JFrame {
   
    public JFrame_5() {
        initComponents();
    }
   

    private void initComponents() {
        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();

        getContentPane().setLayout(new java.awt.GridLayout(3, 1));

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        jButton1.setText("Vis Google");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                google(evt);
            }
        });

        getContentPane().add(jButton1);

        jButton2.setText("Vis Yahoo");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                yahoo(evt);
            }
        });

        getContentPane().add(jButton2);

        jLabel1.setPreferredSize(new java.awt.Dimension(450, 100));
        getContentPane().add(jLabel1);

        pack();
    }

    private void yahoo(java.awt.event.ActionEvent evt) {
        jLabel1.setIcon(new javax.swing.JLabel() {
            public javax.swing.Icon getIcon() {
                try {
                    return new javax.swing.ImageIcon(
                        new java.net.URL("http://eur.i1.yimg.com/eur.yimg.com/i/dk/hp/c/ydk.gif")
                    );
                } catch (java.net.MalformedURLException e) {
                }
                return null;
            }
        }.getIcon());
    }

    private void google(java.awt.event.ActionEvent evt) {
        jLabel1.setIcon(new javax.swing.JLabel() {
            public javax.swing.Icon getIcon() {
                try {
                    return new javax.swing.ImageIcon(
                        new java.net.URL("http://www.google.dk/images/hp0.gif")
                    );
                } catch (java.net.MalformedURLException e) {
                }
                return null;
            }
        }.getIcon());
    }

    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }
   

    public static void main(String args[]) {
        new JFrame_5().show();
    }

    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JLabel jLabel1;   
}
Avatar billede isakmpx509 Nybegynder
03. april 2004 - 20:46 #2
Ja det har du ret i..Men prøv i stedet med følgende url og læg mærke til at billedet aldrig bliver hentet igen...

http://80.160.226.30:12000/examples/images/cam3_image.jpg
Avatar billede _carsten Nybegynder
03. april 2004 - 20:55 #3
????

Hvis jeg sætter den url ind i ovenstående kode, bliver billedet hentet hver
eneste gang jeg trykker på knapperne

Altså - må der være en anden årsagen til at det ikke sker hos dig.
Avatar billede isakmpx509 Nybegynder
03. april 2004 - 21:04 #4
Hmmm. Det forstå jeg Skisme ikke. Jeg har lavet nøjagtig det samme som i dit eksempel for at krydsteste, hvorved jeg fandt ud af at billederne tilsyneladende bliver buffered eller noget i den stil. I hvert fald så bliver billederne kun hentet en gang hos mig og derefter genbruges det hentede billede blot igen.
Jeg har prøvet med dit eksempel og det samme sker...
Avatar billede _carsten Nybegynder
03. april 2004 - 21:25 #5
Hmmm - nu er det mig som ikke er med, skal cam3_image.jpg skifte, altså
have et andet indhold ??
Avatar billede isakmpx509 Nybegynder
03. april 2004 - 21:46 #6
Billederne hentes fra et kamera som optager billeder hele tiden - ligesom den url der blot skifter hvert 15 sekund. Da programmet skal vise 'livebilleder' skal der hentes et nyt billede fra kameraet ca. hver 2 sekund. Cam3_image skal have et andet indhold - altså det indhold der er defineret af hvad kameraet har optaget på det tidspunkt hvor billedet bliver hentet. Men - og så ved jeg ikke om det er min java version eller hvad - i hvert fald får jeg kun opdateret billedet een gang nemlig når jeg første gang trykker på knappen....hvor det er meningen at url'en skal refreshes hver gang.
Avatar billede _carsten Nybegynder
03. april 2004 - 22:12 #7
Okay - jeg er med.

Og du har ret - billedet skifter ikke, det bliver buffered via MediaTracker,
ved ikke lige hvordan det bedst løses, men roder lidt videre.
Avatar billede _carsten Nybegynder
03. april 2004 - 22:23 #8
Har fundet løsningen, men skal lige have strikket det sammen - øjeblik !
Avatar billede _carsten Nybegynder
03. april 2004 - 22:32 #9
Så skulle den være der.


import javax.swing.*;
import java.net.*;

public class JFrame_5 extends javax.swing.JFrame {
    public JFrame_5() {
        initComponents();
    }
   
    private void initComponents() {
        jButton1 = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();

        getContentPane().setLayout(new java.awt.FlowLayout());

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        jButton1.setText("Reload billede");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                refresh(evt);
            }
        });

        getContentPane().add(jButton1);

        jLabel1.setPreferredSize(new java.awt.Dimension(450, 500));
        getContentPane().add(jLabel1);

        pack();
    }

    private void refresh(java.awt.event.ActionEvent evt) {
        if(imageIcon != null){
            imageIcon.getImage().flush();
        }
       
        try {
            imageIcon = new ImageIcon(new URL( url ));
        }
        catch (java.net.MalformedURLException e) {
            e.printStackTrace();
        }
        jLabel1.setIcon(imageIcon);
    }

    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }

    public static void main(String args[]) {
        new JFrame_5().show();
    }

    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.ImageIcon imageIcon = null;
    String url = "http://80.160.226.30:12000/examples/images/cam3_image.jpg";
}
Avatar billede isakmpx509 Nybegynder
03. april 2004 - 22:45 #10
Aarrgh..8-) Jeg har revet mig i håret i flere timer over det her. Jeg tænkte faktisk på flush metoden men kom fra det igen. Men du er da vist lidt af en haj inden for java efter hvad man kan se i de tidligere indlæg. Tak for hjælpen.
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