Object类型可以转换为Component类型吗?

时间:2015-06-26 21:42:10

标签: java swing jlist jcomponent

情景: -

  1. 创建了jlist,包含某些值。
  2. 需要将Object test_jL = jlist.getSelectedValue();传递给JPanel.add(test_jL)
  3. 字面上不可能,因为add()接受 Component 仅限

    以下是我要做的事情: -

    Object test_jList = jXList1.getSelectedValue();
    JPanel.removeAll();
    JPanel.add(test_jList);  // doesn't matter, as it won't accept an Object type
    JPanel.repaint();
    JPanel.revalidate();
    

    问题是: Object类型是否可以投放到Component类型?

    我可能听起来像一个菜鸟,但试图扩展我的Java知识,所以期望你的建议和想法构建解决问题的方案。谢谢你的时间!!!

3 个答案:

答案 0 :(得分:4)

在Java中,您可以尝试将任何对象强制转换为共享相同继承的任何其他对象。 Object是Java中每个Object的超类,因此如果将MyObject myObj = (MyObject) someOtherObject;声明为Object类型,则可以合法地声明someOtherObject

如果在运行时someOtherObject是MyObject类型,则此转换将起作用,并且流将继续。但是,如果它是一些不与MyObject类型共享继承的其他类型,那么您将在运行时获得ClassCastException(您可以捕获并做出反应)。

答案 1 :(得分:0)

行;如果要将参数传递给某个面板,请忘记add():该方法用于向该面板添加新的可视控件(文本字段,列表,按钮等)。

我建议您扩展JPanel以创建自己的类:

public class MyPanel extends JPanel
{
    public MyPanel()
    {
        super(<layout>);
    }

    public void setParameter(Object parameter)
    {
        // ...
    }
}

然后,从主面板实例化它并使用其setParameter方法传递参数值:

public class MyMainPanel extends JPanel
{
    private final MyPanel panel01=new MyPanel();

    public MyMainPanel()
    {
        super(<layout>);
        add(panel01);
    }

    ... listener code...
    {
        Object value = jXList1.getSelectedValue();
        this.panel01.setParameter(value);
    }
}

(请注意, setParameter 不是标准API:实际上,您可能会给它一个特定的,更具语义的名称:setBook,setSong,setArtist ...)

答案 2 :(得分:0)

通过这种方式,您可以将JPanel添加到列表中,并根据列表中的selectionchange动态更新视图

 public class NewClass {

public static void main(String[] args) {
    JFrame frame = new JFrame();
    JPanel p = new JPanel();
    JList list = new JList();
    list.addListSelectionListener(new javax.swing.event.ListSelectionListener() {

        public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
            p.removeAll();
            p.add((Component) list.getSelectedValue());//dynamically adding panel from list
        }
    }
    );
    DefaultListModel m = new DefaultListModel();
    JPanel x = new JPanel() {
        public String toString() {
            return "xPanel";
        }
    };
    x.add(new JButton("@3"));

    JPanel y = new JPanel() {
        public String toString() {
            return "yPanel";
        }
    };
    y.add(new JTextField(20));

    m.addElement(x);
    m.addElement(y);//adding panel to list
    list.setModel(m);
    list.setSelectedIndex(0);

    frame.add(list, BorderLayout.NORTH);
    frame.add(p, BorderLayout.CENTER);
    frame.setSize(600, 500);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);

}

}

如果您从列表中选择值,则可以看到按钮和文本字段交换位置