Cast eines Objektes in eine Hashmap

N

Nice Slider

Gast
Hoi!

Möchte gerade ein Objekt "Card" während eines ActionListenerEvents in eine Hashmap casten, was bei mir zu folgender Fehlermeldung führt:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.JButton cannot be cast to mtg.Card

Projektname: mtg
Klassenname: Card

Die hashmap ist ein Private-Member:
Java:
private HashMap<String,Card> MainDeck;

Warum funktioniert dieser Cast nicht? Seltsamerweise funktioniert er sehr wohl wenn ich statt der Hashmap einen Vektor verwende....

Hier mal der relevante Code:

Java:
private class HandlerClass implements ActionListener {    
        @Override
        public void actionPerformed(ActionEvent event) {
            int answer = JOptionPane.showConfirmDialog(null, String.format("Do you want to add the Card \"%s\" to your Main Deck?", event.getActionCommand()));

            if (answer == 0) // Yes
            {
               JOptionPane.showMessageDialog(null, String.format("You pressed \"Yes\"! \n \"%s\" will be added to your Deck!", event.getActionCommand()));
               toMainObj.setMainDeck(event.getActionCommand(),(Card) event.getSource());   // add Card by cast Card in()
            }            
            if (answer == 1) // No
            {
                JOptionPane.showMessageDialog(null, String.format("You pressed \"No!\" \n \"%s\" will not be added to your Deck!", event.getActionCommand()));
            }
        }
    }
 
N

Nice Slider

Gast
Man sollte eventuell noch hinzufügen dass "toMainObj" dazu dient auf das Objekt zugreifen zu können, welches die Hashmap enthält...dieses objekt enthält dann die setMainDeck-Funktion!

Java:
    public void setMainDeck(String str, Card c){
        MainDeck.put(str, c);
    }
 

Michael...

Top Contributor
Möchte gerade ein Objekt "Card" während eines ActionListenerEvents in eine Hashmap casten, was bei mir zu folgender Fehlermeldung führt:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.JButton cannot be cast to mtg.Card
Kann sein, dass Du das möchtest ;-) aber Du versucht gerade ein JButton in ein Card Objekt zu casten.
Die Quelle eines ActionEvents ist i.d.R. ein JButton, JComboBox... ausser Du hast ein eigenes Objekt definiert welches ebenfalls ActionEvents feuern kann.
 

tfa

Top Contributor
Die Quelle deines Events (getSource()) ist ein JButton, und ein Card-Objekt ist offensichtlich kein JButton. Deswegen kannst du das nicht casten. Du musst das Card-Objektauf eine andere weise identifizieren.
 
S

SlaterB

Gast
> Seltsamerweise funktioniert er sehr wohl wenn ich statt der Hashmap einen Vektor verwende....

fragwürdig erscheindende Behauptungen sieht man ziemlich häufig ohne Code, wobei ein vollständiges Programm noch überzeugender wäre,

die Zeile 3 des zweiten Postings kann auch auskomentiert werden, es ist völlig egal was diese Methode macht,
soweit kommt es gar nicht, der Fehler findet schon in der actionPerformed() statt, eben beim Cast

HashMap im Titel ist weit überbewertet, ist bedeutungslos
 
N

Nice Slider

Gast
hmm die Buttons sind aber doch solche "Cards"... hätt ich eventuell auch erwähnen müssen? bekomme ich dann denn über die getSource-Methode nicht die Card??


Java:
// Code für EINE Karte
Icon ico = new ImageIcon(ConvertToImage(BI));
Card OneCard = new Card("Card", null, ico);
OneCard.addActionListener(new HandlerClass());
 

Michael...

Top Contributor
Java:
 if (answer == 0) // Yes
...
if (answer == 1) // No
Besser:
Java:
if(answer==JOptionPane.YES_OPTION)
Java:
if(answer==JOptionPane.NO_OPTION)
wobei man hier beim zweiten auch noch ein
Code:
else if
nutzen könnte, da ja nur eine der Bedingungen erfüllt sein kann.
 
N

Nice Slider

Gast
> Seltsamerweise funktioniert er sehr wohl wenn ich statt der Hashmap einen Vektor verwende....

fragwürdig erscheindende Behauptungen sieht man ziemlich häufig ohne Code, wobei ein vollständiges Programm noch überzeugender wäre,

die Zeile 3 des zweiten Postings kann auch auskomentiert werden, es ist völlig egal was diese Methode macht,
soweit kommt es gar nicht, der Fehler findet schon in der actionPerformed() statt, eben beim Cast

HashMap im Titel ist weit überbewertet, ist bedeutungslos

Wenn du ernsthaft vor hast es zu lesen post ich dir gerne das ganze Programm ist nur leider schon sehr lang inzwischen ;)
 
N

Nice Slider

Gast
nein ist abgeleitet von JPanel...ist das ein Problem? wie erhält man denn im Actionlistener über das event das Panel?

Hier mal der ganze Coder einer Card:

Java:
package mtg;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import javax.swing.Icon;

//-----------------------------------------
// CardClass
//-----------------------------------------
public class Card extends javax.swing.JPanel implements MouseListener {
    private static final long serialVersionUID = 3670910111612350552L;

    //  private Icon cardPicture;
    private String name;
    private Icon rollOver;
    private Icon normalPic;
    private ArrayList<ActionListener> listener = null;

    /**
     * Creates new form Card
     */
    public Card() {
        initListener();
        normalPic = new DefaultIcon();
        rollOver = new DefaultIcon();
        initComponents();
        setPicture();
    }

    public Card(String name, Icon rollOver, Icon normalPic) {
        initListener();
        this.normalPic = normalPic;
        this.rollOver = rollOver;
        this.name = name;
        initComponents();
        cardName.setText(name);
        setPicture();
        this.rollOverButton.setActionCommand(name);
    }

    private void setPicture() {
        rollOverButton.setRolloverEnabled(true);
        rollOverButton.setIcon(normalPic);
        rollOverButton.setRolloverIcon(rollOver);

    }
    private void initListener(){
        listener = new ArrayList<ActionListener>();
	addMouseListener(this);
    }

    public String getCardName() {
        return cardName.getText();
    }

    public Icon getNormalPic() {
        return normalPic;
    }

    public Icon getRollOver() {
        return rollOver;
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        cardName = new javax.swing.JLabel();
        rollOverButton = new javax.swing.JButton();

        rollOverButton.setMaximumSize(new java.awt.Dimension(200, 279));
        rollOverButton.setMinimumSize(new java.awt.Dimension(200, 279));
        rollOverButton.setPreferredSize(new java.awt.Dimension(200, 279));
        rollOverButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                none(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(cardName, javax.swing.GroupLayout.PREFERRED_SIZE, 185, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addComponent(rollOverButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(rollOverButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(cardName, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );
    }// </editor-fold>                        

    private void none(java.awt.event.ActionEvent evt) {                      
        // TODO add your handling code here:
    }                     

    // Variables declaration - do not modify                     
    private javax.swing.JLabel cardName;
    private javax.swing.JButton rollOverButton;
    // End of variables declaration                   

    @Override
    public void mouseClicked(MouseEvent evt) {
        fireUpdate(new ActionEvent(this, 0, name));
    }

    @Override
    public void mousePressed(MouseEvent e) {
    }

    @Override
    public void mouseReleased(MouseEvent e) {
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    }

    @Override
    public void mouseExited(MouseEvent e) {
    }

    protected void fireUpdate(ActionEvent evt) {
        for (ActionListener al : listener) {
            al.actionPerformed(evt);
        }
    }

    public void addActionListener(ActionListener al) {
        listener.add(al);
        this.rollOverButton.addActionListener(al);
    }

    public void removeActionListener(ActionListener al) {
        listener.remove(al);
    }
}
 
S

SlaterB

Gast
tja, die Lage ist offensichtlich, der Listener ist am rollOverButton,
warum sollte die Source das Panel/ die Card liefern?

eine einfache Bestimmung der Card vom rollOverButton gibt es auch nicht, da musst du irgendwas ergänzen,
von JButton doch erben zu CardButton, der seine Card kennt (Attribut), aber unschön,
eher gleich statt ActionListener eine neue erbende Klasse, die auch die Card als Attribut bekommt,

nicht groß originell anders, aber ein winziger leichgewichtiger Listener ist schneller vererbt und benutzt
als ein dickes Swing-Element mit hunderten internen Variablen


etwas direkte Arbeit wäre, irgendwo in einer eine Map von Button auf Panel zu verweisen, diese Verknüpfung also speziell abzuspeichern,
oder alle verfügbaren Panel anschauen und die dorigen Buttons mit dem aktuellen vergleichen
 

Michael...

Top Contributor
nein ist abgeleitet von JPanel...ist das ein Problem?
naja, beim Source Objekt handelt es sich ja um den JButton, selbst wenn ein Cast erfolgreich wäre hätte man ja das falsche Objekt.
wie erhält man denn im Actionlistener über das event das Panel?
Man könnte sich durch die Komponentenhierarchie "hochhangeln" - was m.M. aber eine eher unsaubere quick&dirty Lösung wäre.
Besser wäre es etwas mehr Aufwand in eine saubere Konzeption zu stecken. keine Ahnung was eine Card genau darstellen soll, aber hier könnte man mit einem eigenen Listener oder dem Oberver Pattern arbeiten.
 

kaetzacoatl

Bekanntes Mitglied
Mal ne andere Idee:
Die Card ist im Listener
und jeder Button hat einen
eigenen Listener.
Nur so ne Idee...
edit:
Der Button kann immer der
gleiche bleiben und immer den
Listener Wechseln, wenn eine
Card gelegt wird.(Ich geh davon
aus , dass du ein Kartenspiel
machst, daher legen)
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Datentypen Reflection Cast anhand eines Strings? Java Basics - Anfänger-Themen 7
Guybrush Threepwood Inhalt eines Strings für cast verwenden Java Basics - Anfänger-Themen 6
H Cast von Float nach String klappt nicht Java Basics - Anfänger-Themen 12
berserkerdq2 Habe ein Spiel entwickelt, dass immer in der 4 Runde einen cast-Fehler erhält Java Basics - Anfänger-Themen 3
TimoN11 Frage zu Java-Vererbung (Cast) Java Basics - Anfänger-Themen 5
O Cast Java Basics - Anfänger-Themen 16
R Cast java.awt.Graphics Java Basics - Anfänger-Themen 7
N Simpler cast? Java Basics - Anfänger-Themen 9
D Java Eclipse cannot be cast to java.awt.event.ItemListener Java Basics - Anfänger-Themen 3
O Kleine Frage zu cast Java Basics - Anfänger-Themen 3
A Ohne Cast auf Methode zugreifen? Java Basics - Anfänger-Themen 4
J Datentypen Cast von int zu char führ zu 'Sonderzeichen' Java Basics - Anfänger-Themen 2
K Cast bei equals Java Basics - Anfänger-Themen 2
N Vererbung Verschiedene Subclasses nach cast zur Superclass unterscheiden Java Basics - Anfänger-Themen 9
K Date cannot be cast to java.lang.Integer Java Basics - Anfänger-Themen 4
R Variablen Möglich?: Cast einer Referenzvariable auf den Typ seines Objektes Java Basics - Anfänger-Themen 19
M ListIterator + Cast Java Basics - Anfänger-Themen 12
D Wie "unchecked cast" hier vermeiden? Java Basics - Anfänger-Themen 2
M Cast nach int Java Basics - Anfänger-Themen 8
M object cast auf double Java Basics - Anfänger-Themen 2
I double (cast) rundungsproblem Java Basics - Anfänger-Themen 8
M Datentypen java.util.Arrays$ArrayList cannot be cast to [Ljava.lang.String; Java Basics - Anfänger-Themen 11
L Type/Cast Problem Java Basics - Anfänger-Themen 6
E Klassen ClassCastException bei gleichnamigem: paket.klasse cannot be cast to paket.klasse Java Basics - Anfänger-Themen 10
T Datentypen byte -Division..mal gehts mit cast mal ohne Java Basics - Anfänger-Themen 5
M Collections Cast bei ArrayList (List) Java Basics - Anfänger-Themen 2
T Datentypen default ist int, cast zu byte nötig... Java Basics - Anfänger-Themen 2
C Generics und Cast Java Basics - Anfänger-Themen 5
M Polymorphie Cast:Verständnis und Ausführung Java Basics - Anfänger-Themen 10
E Datentypen type cast problem (int, byte,) Java Basics - Anfänger-Themen 5
A Cast ohne Warnung bei Generics Java Basics - Anfänger-Themen 2
J cast zu int immer 0.. Java Basics - Anfänger-Themen 6
I java.lang.String cannot be cast to OBJEKT Java Basics - Anfänger-Themen 8
A Object -> String mit valueOf, toString oder cast ? Java Basics - Anfänger-Themen 6
M Cast vermeiden Java Basics - Anfänger-Themen 11
M Generics - "Unchecked cast"-Warnung wegbekommen Java Basics - Anfänger-Themen 4
B Exception cast to CORBA.Object Java Basics - Anfänger-Themen 2
K Cast-Operator Java Basics - Anfänger-Themen 3
A Seltsame Class Cast Exception Java Basics - Anfänger-Themen 3
V Cast-Operator Java Basics - Anfänger-Themen 2
kulturfenster Cast Probleme Java Basics - Anfänger-Themen 2
V Frage zu final und Class bzw. Class.cast Java Basics - Anfänger-Themen 5
F paket.Klasse cannot be cast to paket.Klasse Java Basics - Anfänger-Themen 6
J Cast-Problem Java Basics - Anfänger-Themen 7
D Class Cast Exception Java Basics - Anfänger-Themen 5
R variabler cast Java Basics - Anfänger-Themen 5
G cast von Char nach int Java Basics - Anfänger-Themen 3
zilti Cast Exception bei JTable Java Basics - Anfänger-Themen 15
S "Unchecked Cast" Warnung Java Basics - Anfänger-Themen 3
G cast von int To Integer? Java Basics - Anfänger-Themen 3
M Double -> Int Cast funktioniert nicht. Java Basics - Anfänger-Themen 5
vogella Cast from Collection.toArray to String[] Java Basics - Anfänger-Themen 2
B Cast explizit verbieten Java Basics - Anfänger-Themen 10
E Cast von Object zu int (Array) Java Basics - Anfänger-Themen 19
W Java Cast bei Vectoren Java Basics - Anfänger-Themen 10
A Cast Generics Java Basics - Anfänger-Themen 6
M Class Cast Exception Java Basics - Anfänger-Themen 7
J Cast zwischen zwei Unterklassen der selben Oberklasse. Java Basics - Anfänger-Themen 7
B Byte übergeben ohne cast? Java Basics - Anfänger-Themen 12
M Länge eines Arrays als Variable speichern möglich? Java Basics - Anfänger-Themen 14
P Objekt einer Methode eines anderen Objektes übergeben Java Basics - Anfänger-Themen 5
P Wie kann ich beispielsweise Speicherstände eines Spiels DAUERHAFT in meinem Programm speichern? Java Basics - Anfänger-Themen 3
laxla123 Eigenschaften eines Algorithmus (determiniert vs.. deterministisch) Java Basics - Anfänger-Themen 2
monsterherz Ablauf der Erstellung eines Java Programmes Java Basics - Anfänger-Themen 17
monsterherz Fehler Semikolon fehlt - ich weiss aber nicht wo da noch eines hin sollte... Java Basics - Anfänger-Themen 21
J Farbe des Striches eines TitledBorders ändern Java Basics - Anfänger-Themen 2
pc pc pc pc pc letztes Element eines Arrays n Java Basics - Anfänger-Themen 3
walid Öffnungszeiten eines Geschäftes Java Basics - Anfänger-Themen 3
paulen1 Best Practice "Unchecked Assignment" Warnung beim erstellen eines 2D Arrays of Arraylists Java Basics - Anfänger-Themen 2
T Probleme beim Import eines Git-Repos Java Basics - Anfänger-Themen 2
U Eigenschaft eines JTextfiels per ActionListener ändern... Java Basics - Anfänger-Themen 2
B Synchronisation eines kleinen Museums Java Basics - Anfänger-Themen 47
krgewb Breite und Höhe eines Bildes in base64 auslesen Java Basics - Anfänger-Themen 3
Sachinbhatt Was ist die Notwendigkeit eines Sammlungsframeworks in Java? Java Basics - Anfänger-Themen 2
N Textdatei aus Resourcen-Ordner eines Projekts/ jar-file lesen Java Basics - Anfänger-Themen 4
B Produkt eines double - streams Java Basics - Anfänger-Themen 3
B Attribute eines Objekts einer Klasse durch statische Methode einer 2. Klasse ändern? Java Basics - Anfänger-Themen 32
S Variablen Letzte Zeile eines Strings entfernen Java Basics - Anfänger-Themen 1
D Inhalt eines Arrays ausgeben Java Basics - Anfänger-Themen 7
A Jedes zweite Element eines Arrays entfernen Java Basics - Anfänger-Themen 30
sserio Java Fx, wie erstellt man einen EventHandler, der durch das Drücken eines Button Texte in eine Table view einfügt Java Basics - Anfänger-Themen 17
J Größe eines Strings in Pixel Java Basics - Anfänger-Themen 18
M Parse-Tree eines statements darstellen Java Basics - Anfänger-Themen 0
H Java verkettete Liste, Wert eines Index zurückgeben Java Basics - Anfänger-Themen 1
bluetrix Programmieren eines Bots für Zahlen-Brettspiel Java Basics - Anfänger-Themen 9
J Hinzufügen eines Objektes in ein Objekt-Array Java Basics - Anfänger-Themen 62
M Wie kann die Implementation einer Methode den Wert eines Attributs vermindern? Java Basics - Anfänger-Themen 3
A Rekursive Implementation eines Codes Java Basics - Anfänger-Themen 4
H String Repräsentation eines Rechtecks mit Instanz-Methode Java Basics - Anfänger-Themen 8
M Konstruktor ohne Übergabe eines Wertes Java Basics - Anfänger-Themen 7
M Wie kann ich in einem Konstruktor die Methode eines anderen Interfaces mit den jeweiligen Parametern aufrufen? Java Basics - Anfänger-Themen 8
M Wie erreiche ich das Vorwärtsgehen eines Roboters? Java Basics - Anfänger-Themen 2
M Wie erreiche ich es das Vorwärtsgehen eines Roboters? Java Basics - Anfänger-Themen 0
R While-Loop der die Einträge eines Arrays in umgekehrter Reihenfolge anzeigt Java Basics - Anfänger-Themen 3
A Optimierung eines Programms: Mergen der Dateien Java Basics - Anfänger-Themen 23
melisax Alle Möglichkeiten eines Wortes angeben Java Basics - Anfänger-Themen 3
A Java, verarbeitung eines xml-files Java Basics - Anfänger-Themen 2
C Fehler beim erstellen eines Objektes Java Basics - Anfänger-Themen 3
B Konkatenieren eines Strings und inkremtierenden Zahl zu einer INT Variablen Java Basics - Anfänger-Themen 7
F Initialisieren eines Web-Mp3 Players in Tabs durch "booleans" erst wenn Tab geöffnet wird ...? Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben