根据javafx中listview中的选定项调用类

Sho*_*291 5 java javafx-8

我有一个ListView,每次更改选择时,我想调用具有该名称的类.例如,如果该项称为"文本字符串",则应调用类TextString.我现在的代码给了我一个错误说The method insert(ArrayList<Element>) is undefined for the type Object... Eclipse给了我一个建议将对象强制转换为Element,但这没有做任何事情.Element类是一个超类,TextString将实现该类.

这是我到目前为止的代码:

   elementList.itemsProperty().bind(listProperty);
        listProperty.set(FXCollections.observableArrayList(elementListItems));
        elementList.setOnMouseClicked(new EventHandler<MouseEvent>() {

            public String selectedElement = "Text String";
            @Override
            public void handle(MouseEvent event) {
                selectedElement  = (String)elementList.getSelectionModel().getSelectedItem();
                selectedElement = selectedElement.replace(" ", "");
                Class<?> clazz;
                try {
                    clazz = Class.forName("elements."+selectedElement);
                    Constructor<?> ctor = clazz.getConstructor();
                    Object object = ctor.newInstance();
                    Method meth = clazz.getClass().getMethod("insert", new Class<?>[] { Canvas.class, ArrayList.class, GraphicsContext.class });
                    meth.invoke(object, canvas, objects, gc);
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                } catch (NoSuchMethodException e) {
                    e.printStackTrace();
                } catch (SecurityException e) {
                    e.printStackTrace();
                } catch (InstantiationException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }
            }
        });
Run Code Online (Sandbox Code Playgroud)

Element.java

   public abstract class Element {
    public String name;
    public String description;
    public Canvas canvas;
    public ArrayList<Element> objects;
    public GraphicsContext gc;

    void remove(){

    }
    void toggle(){

    }
    void setBounds(int x, int y, int w, int h){

    }
    public abstract void insert(Canvas canvas, ArrayList<Element> objects, GraphicsContext gc);
}
Run Code Online (Sandbox Code Playgroud)

TextString.java

   public class TextString extends Element {
    private GraphicsContext gc;

    TextString() {
        super();
        this.name = "Text String";
        this.description = "A literal readable string of text.";
    }
    @Override
    public void insert(Canvas canvas, ArrayList<Element> objects, GraphicsContext gc) {
        this.gc = gc;
        this.canvas = canvas;
        this.objects = objects;
        System.out.println("Text string created.");
    }

}
Run Code Online (Sandbox Code Playgroud)

如何将对象转换为listview选择的任何对象?

Tar*_*kyy 4

  1. 您应该使用显式强制转换。
  2. 使用clazz.getMethod(...)而不是clazz.getClass().getMethod(...)
  3. 注意objectsArrayList实例,而不是List

您的代码应该如下所示:

 try {
                    clazz = Class.forName("elements."+selectedElement);
                    Constructor<?> ctor = clazz.getConstructor();
                    Element object = (Element) ctor.newInstance();
                    Method meth = clazz.getMethod("insert", new Class<?>[] { Canvas.class, ArrayList.class, GraphicsContext.class });
                    meth.invoke(object, canvas, objects, gc);
} catch (ClassNotFoundException e) {
Run Code Online (Sandbox Code Playgroud)

提示。我建议将 insert 方法中的 ArrayList 参数类型更改为 List。并且只捕获一个通用异常,而不是一堆特定异常。

如果您还有任何其他问题,请告诉我。