enriq
enriq

Reputation: 83

JavaFX error: incompatible types - Object cannot be converted to Node

I have defined 3 labels in a FXML file within a grid pane. I am trying to read the following XML file and display the labels present in the file in a grid pane. The numerical values in the XML file denotes the row & column position.

<data>
<lbl1>0,0</lbl1>
<lbl2>0,1</lbl2>
<lbl3>0,2</lbl3>
</data>

I have added all the elements to the HashMap and then retrieve it to be displayed. Firstly, I added all the three labels one by one as follows:

hm.put("lbl1", eElement.getElementsByTagName("lbl1").item(0).getTextContent());
hm.put("lbl2", eElement.getElementsByTagName("lbl2").item(0).getTextContent());
hm.put("lbl3", eElement.getElementsByTagName("lbl3").item(0).getTextContent());

Then I display them as follows:

grid.add(lbl1, Integer.parseInt(hm.get("lbl1").toString().split(",")[0]),Integer.parseInt(hm.get("lbl1").toString().split(",")[1]));
grid.add(lbl2, Integer.parseInt(hm.get("lbl2").toString().split(",")[0]),Integer.parseInt(hm.get("lbl2").toString().split(",")[1]));
grid.add(lbl3, Integer.parseInt(hm.get("lbl3").toString().split(",")[0]),Integer.parseInt(hm.get("lbl3").toString().split(",")[1]));

The above code works well without any issues and I can see the labels on the grid.

Now, instead of adding the labels one by one, I added all of them in a single statement through a 'for' loop as shown below:

if (!eElement.getTagName().toString().equals("data"))
            hm.put(eElement.getTagName(), eElement.getTextContent());

If I try to display the label, for example:

grid.add(hm.get("lbl1"),0,0);

I get an error:incompatible types - Object cannot be converted to Node.

If I try to typecast:

grid.add((javafx.scene.Node) hm.get("lbl1"),0,0);

I get an error:java.lang.ClassCastException: java.lang.String cannot be cast to javafx.scene.Node

If I print the hashmap entries, the following output is shown:

lbl1=0,0, lbl2=0,1, lbl3=0,2

How to fix this error? Is there any other way in which I can add all the elements in a single statement and then display them?

Upvotes: 2

Views: 13110

Answers (2)

Bamz
Bamz

Reputation: 136

in your imports add:-

import javafx.scene.control.Label;

I suspect that the current import is from awt.

Upvotes: 7

calbo
calbo

Reputation: 21

From your sample code, I guess that hm is an instance of Map<String, String>

So, when you call hm.get("lbl1") , you get a String.

You're trying to add this String to a GridPane, but the add() method is expecting a javafx.scene.Node. That's why you get a an error "incompatible types".

Instead, you should add your instances of javafx.scene.control.Label (lbl1, lbl2, lbl3)

Upvotes: 1

Related Questions