Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hey Leute also ich habe einen eine Icon Variable erstellt und dieses Icon wird in einem Array gespeichert.
So:
icon1 = new ImageIcon(getClass().getResource("NotenBilder/viertelKlein.png"));
bild[zaehler] = new JLabel(icon1);
Meine Frage ist nun wie kann ich mit einer if Abfrage Bilder miteinander vergleichen ?
Bsp: if ( bild[zaehler2] == viertelKlein.png)
{
ich weis es nicht, deshalb frage ich. Ich habe es mit einem equals versucht, aber das ging auch nicht.
Ich möchte einfach wissen ob ein Bild in einem Array genau das selbe ist, nachdem ich suche.
Anwendungsfall ? du meinst was das Programm können soll ?
Es geht darum MusikNoten aufzuschreiben und diese abzuspielen.
Die Noten werden vom Benutzer eingetragen und erscheinen im Programm (das funktioniert bereits). Nun sollen diese Noten die aufgelistet wurden abgespielt werden.
Deswegen muss ich abfragen welche Note sich an der z.B 1sten Stelle befindet um den dafür passenden Ton abzuspielen.
zb habe ich im Array an der Stelle 1 das Bild ganzeNote eingefügt, so soll ein ganzer Ton abgespielt werden.
Eventuell würde es mit einer Map gehen. Du weist somit einem NotenBild eine Note zu. Dann kannst du diese bei deiner Auswertung mit Hilfe der gewählten Notenbilder wieder holen und abspielen.
Java:
//Vorbereitung
Map<JLabel, String> notenBildZuNote = new HashMap<JLabel, String>();
JLabel[] alleNoten = new JLabel[10];
for(int zaehler = 0; zaehler < alleNoten.length; zaehler++)
{
JLabel notenBild = new JLabel(new ImageIcon(Start.class.getResource("/note"+zaehler+".png")));
alleNoten[zaehler] = notenBild;
notenBildZuNote.put(notenBild, "Note "+zaehler);
}
//Vom Benutzer gewählte Noten simulieren
Random r = new Random();
JLabel[] gewaehlteNoten = new JLabel[20];
for(int i = 0; i < gewaehlteNoten.length; i++)
{
//Zufällige Auswahl aus allen Noten
gewaehlteNoten[i] = alleNoten[r.nextInt(alleNoten.length)];
}
//Auswertung
for(int zaehler2 = 0; zaehler2 < gewaehlteNoten.length; zaehler2++)
{
String note = notenBildZuNote.get(gewaehlteNoten[zaehler2]);
System.out.println("Spiele: " + note);
}
Ich weiss natürlich nicht genau, ob das so in deine Verarbeitung passt...
Also, zunächst mal legst du in dem Array ja nicht "das Bild" ab, sondern JLabel-Objekte.
Aber um die Frage zu beantworten:
Ich würde von ImageIcon die .setDescription-Methode "zweckentfremden" und dort z.B. den Dateinamen hinterlegen. Dann kann man später
Da muss ich mich doch glatt fragen warum du nicht einfach eine Klasse "Note" anlegst, und eben dieser eine View zuordnest, welche dann das jeweilige image enthält / ihm zugeordnet wird, dann kannst du einfach die verschiedenen Noten miteinander vergleichen anstatt irgendwelche Bilder oder Beschreibungen zu vergleichen
Eine Abstrakte Basisklasse und eine Subklasse für jede wäre ebenso denkbar.
War auch mein erster Gedanke, aber der TO möchte ja nur zum ImageIcon eine Zusatzinformation abspeichern und vergleichen können, und warum dann nicht einfach dessen 'description' verwenden.
Der Dateiname ist ja schließlich eine "Basis-Beschreibung" des Bilds...
ist schon richtig , allerdings ist der Ansatz des TO halt nicht sonderlich OO, das mit der Wahl der Discription stelle ich nicht in frage
Mal rein von der Idee her , was spricht gegen sowas @ TO
hier unfassbar rudimentär gehalten !
Java:
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Note{
// define some constants for Note types
BufferedImage image;
public Note(int type){
// richtiges image simulieren
loadImage("H://note.jpg");
}
private void loadImage(String path){
try {
image = ImageIO.read(new FileInputStream((new File(path))));
}
catch (IOException e) {
e.printStackTrace();
}
}
public void draw(Graphics g){
g.drawImage(image, 0,0, null);
}
@SuppressWarnings("serial")
class NoteView extends JLabel{
Note note;
public NoteView(Note n){
note = n;
}
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
note.draw(g);
}
}
public static void main(String[] args){
Note one = new Note(0);
JFrame f = new JFrame();
f.setDefaultCloseOperation(2);
f.setContentPane(one.new NoteView(one));
f.setSize(200, 200);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
Die Fallunterscheidung welches Image wann geladen werden muss könnte man dann anhand des Notentyps festmachen und direkt schon den jeweiligen Pfad hinterlegen aus welchem das Image dann geladen werden würde.
Du übergibst quasi einfach eine Note an einen view , der View macht nichts anderes als eben das image der jeweiligen note zu zeichnen.
man könnte auch hergehen und nicht von JLabel ableiten sondern von ImageIcon, hatte ich jetzt nur auf die schnelle gemacht damit man es nachvollziehen kann.
so könntest du einfach, insofern du Swing nutzt dinge wie das hier schreiben :
Java:
.add(new NoteView(new Note(Note.GANZ)));
Was deinen Vergleich angeht :
könntest du einfach eine equals(Object o) methode implementieren ( in der Klasse Note ) in der du festlegen kannst wann zwei noten als gleich angesehen werden.