情景: -
jlist
,包含某些值。Object test_jL = jlist.getSelectedValue();
传递给JPanel.add(test_jL)
字面上不可能,因为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知识,所以期望你的建议和想法构建解决问题的方案。谢谢你的时间!!!
答案 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);
}
}
如果您从列表中选择值,则可以看到按钮和文本字段交换位置