Java 可以将对象类型强制转换为组件类型吗?

Java 可以将对象类型强制转换为组件类型吗?,java,swing,jlist,jcomponent,Java,Swing,Jlist,Jcomponent,场景:- 创建的jlist,包含某些值 需要通过对象测试_jL=jlist.getSelectedValue()至JPanel.add(测试jL) 不可能,因为add()只接受组件类型 以下是我试图做的:- Object test_jList = jXList1.getSelectedValue(); JPanel.removeAll(); JPanel.add(test_jList); // doesn't matter, as it won't accept an Object type

场景:-

  • 创建的
    jlist
    ,包含某些值
  • 需要通过
    对象测试_jL=jlist.getSelectedValue()
    JPanel.add(测试jL)
  • 不可能,因为add()只接受
    组件
    类型

    以下是我试图做的:-

    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();
    
    问题是:-能否将
    对象
    类型强制转换为
    组件
    类型

    我可能听起来像个傻瓜,但我试图扩展我在Java方面的知识,所以期待您的建议和想法来构建解决问题的场景。谢谢你的时间

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

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

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


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

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

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

    public class MyPanel extends JPanel
    {
        public MyPanel()
        {
            super(<layout>);
        }
    
        public void setParameter(Object parameter)
        {
            // ...
        }
    }
    
    公共类MyPanel扩展了JPanel
    {
    公共事务委员会()
    {
    超级();
    }
    公共void setParameter(对象参数)
    {
    // ...
    }
    }
    
    然后,从主面板实例化它,并使用其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);
        }
    }
    
    公共类MyMainPanel扩展了JPanel
    {
    私有最终MyPanel panel01=新MyPanel();
    公共MyMainPanel()
    {
    超级();
    加(01);
    }
    …侦听器代码。。。
    {
    Object value=jXList1.getSelectedValue();
    此.panel01.setParameter(值);
    }
    }
    

    (请注意,setParameter不是一个标准API:实际上,您可以给它一个特定的、更具语义的名称:setBook、setSong、setArtister…

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

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

    public class MyPanel extends JPanel
    {
        public MyPanel()
        {
            super(<layout>);
        }
    
        public void setParameter(Object parameter)
        {
            // ...
        }
    }
    
    公共类MyPanel扩展了JPanel
    {
    公共事务委员会()
    {
    超级();
    }
    公共void setParameter(对象参数)
    {
    // ...
    }
    }
    
    然后,从主面板实例化它,并使用其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);
        }
    }
    
    公共类MyMainPanel扩展了JPanel
    {
    私有最终MyPanel panel01=新MyPanel();
    公共MyMainPanel()
    {
    超级();
    加(01);
    }
    …侦听器代码。。。
    {
    Object value=jXList1.getSelectedValue();
    此.panel01.setParameter(值);
    }
    }
    

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

    这样,您可以将JPanel添加到列表中,并根据selectionchange on list动态更新视图

     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);
    
    }
    
    }
    

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

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

     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);
    
    }
    
    }
    


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

    如果它是
    组件
    的实例,则选择“是”。首先解释您想要实现的目标:将值传递给JPanel.add时,您期望发生什么?场景是基于
    jList
    值的
    JPanel
    。因此,我只想将
    jList
    中的一个参数传递给add()@小问题如果
    test\u jList instanceof Component
    为true,您只需执行
    jPanel.add((Component)test\u jList)
    。否则,您必须考虑其他问题。如果它是
    组件的一个实例,那么是的。首先解释您想要实现的目标:将值传递给JPanel.add时,您希望发生什么?场景是,存在基于
    jList
    值的
    JPanel
    。因此,我只想将
    jList
    中的一个参数传递给add()@小问题如果
    test\u jList instanceof Component
    为true,您只需执行
    jPanel.add((Component)test\u jList)
    。否则,您必须考虑其他问题。两个OJBEC都在同一个类中,那么您应该能够将其传递到
    JPanel.add()
    中,就像这样
    JPanel.add((组件)测试列表)我已经这样做了:
    对象abc=jXList1.getSelectedValue()。。。;JPanel.add((组件)abc)。。。。。;JPanel.revalidate()它通过一个异常
    java.lang.String不能转换为java.awt.Component
    ,这意味着调用的
    .getSelectedValue()
    没有返回
    组件
    ,而是返回一个
    字符串
    。两个OJBEC都在同一个类中,那么您应该能够将其传递到
    JPanel.add()
    如so
    JPanel.add((组件)测试列表)