Avatar billede limes_planum Praktikant
17. august 2011 - 08:33 Der er 8 kommentarer og
1 løsning

Swap image i Java

Hvordan kan man udskifte/swappe et image i Java, ved en klik-event?
Jeg har en JForm i Netbeans, hvorpå der ligger et image i en label. Hvordan udskifter jeg dette billede med et andet billede fra min resource-liste?
Avatar billede arne_v Ekspert
17. august 2011 - 21:07 #1
Et gammelt eksempel:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class IconFun extends JFrame {
    private JLabel cont;
    private JButton chg;
    public IconFun() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());
        setTitle("Icon change deno");
        cont = new JLabel();
        getContentPane().add(cont, BorderLayout.CENTER);
        chg = new JButton("Change icon");
        chg.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                update();
            }
        });
        getContentPane().add(chg, BorderLayout.SOUTH);
        update();
        pack();
    }
    private int n = 0;
    private String[] icons = { "C:\\white.jpg", "C:\\red.jpg", "C:\\green.jpg", "C:\\blue.jpg", "C:\\yellow.jpg" }; 
    private void update() {
        cont.setIcon(new ImageIcon(icons[n]));
        n = (n + 1) % icons.length;
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame f = new IconFun();
                f.setVisible(true);
            }
        });
    }
}
Avatar billede arne_v Ekspert
17. august 2011 - 21:12 #2
Nyere eksempel:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class PicSwap extends JFrame {
    public PicSwap() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Picture swap");
        getContentPane().setLayout(new BorderLayout());
        final JLabel pic = new JLabel();
        pic.setIcon(new ImageIcon("C:\\blue.jpg"));
        getContentPane().add(pic, BorderLayout.CENTER);
        JPanel btns = new JPanel();
        JButton redbtn = new JButton("Red");
        redbtn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                pic.setIcon(new ImageIcon("C:\\red.jpg"));
            }
        });
        btns.add(redbtn);
        JButton greenbtn = new JButton("Green");
        greenbtn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                pic.setIcon(new ImageIcon("C:\\green.jpg"));
            }
        });
        btns.add(greenbtn);
        JButton bluebtn = new JButton("Blue");
        bluebtn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                pic.setIcon(new ImageIcon("C:\\blue.jpg"));
            }
        });
        btns.add(bluebtn);
        getContentPane().add(btns, BorderLayout.SOUTH);
        pack();
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame f = new PicSwap();
                f.setVisible(true);
            }
        });
    }
}
Avatar billede limes_planum Praktikant
17. august 2011 - 21:42 #3
Ok - er meget ny i Java, så prøver umiddelbart at afprøve det og vil derefter disikere din kode efterhånden som overblikket forhåbentligt stiger med sproget...

Men har gjort flg.:
Oprettet en Java-applikation kaldet PicSwap - udskiftet koden med dit forslag - men så får jeg en fejlmeddelse der siger:
"
run:
Error: Could not find or load main class picswap.PicSwap
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)
"

- efter jeg har buildet... :-/
Avatar billede arne_v Ekspert
17. august 2011 - 21:46 #4
Har du:

package picswap;

i linie 1?
Avatar billede limes_planum Praktikant
17. august 2011 - 21:55 #5
Nej - det havde jeg ikke i første omgang, men efter at have rodet med en "rød lampe" øverst i koden virkede det hele lige pludselig :) (og herunder var package "picswap" under 'Source Packages' i min filoversigt i venstre side)

Er ret glad for resultatet (og vil gi point, for at jeg nu kan rode-med-koden herfra), men det jeg egentlig ville, var at få et billede jeg trykkede på til at skifte udseende (faktisk er mit slutmål at vende et kort i et brætspil)
Lige nu er det knapper der afgører swappet - og ikke et 'onclick' på selve billederne...
Avatar billede arne_v Ekspert
17. august 2011 - 22:09 #6
Jeg smider et svar.
Avatar billede arne_v Ekspert
17. august 2011 - 22:09 #7
Hvis du vil klikke paa billedet mener jeg bare at du skal bruge en JButton fremfor en JLabel til billedet.
Avatar billede arne_v Ekspert
17. august 2011 - 22:26 #8
Eksempel:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class PicSwap2 extends JFrame {
    private JButton pic;
    private int ix;
    private String[] fnm = { "C:\\red.jpg", "C:\\green.jpg", "C:\\blue.jpg"};
    private void update() {
        pic.setIcon(new ImageIcon(fnm[ix]));
        ix = (ix + 1) % fnm.length;
    }
    public PicSwap2() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Picture swap");
        getContentPane().setLayout(new BorderLayout());
        pic = new JButton();
        pic.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                update();
            }
        });
        getContentPane().add(pic, BorderLayout.CENTER);
        ix = 0;
        update();
        pack();
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame f = new PicSwap2();
                f.setVisible(true);
            }
        });
    }
}
Avatar billede limes_planum Praktikant
18. august 2011 - 09:24 #9
Det virker .. Super med den ekstra service
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