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)
组件
类型
以下是我试图做的:-
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()
如soJPanel.add((组件)测试列表)有限公司