Swing 向jframe中添加 jpanel类的问题
我创建了
一个jframe类 mainframe
一个jpanel 类 Book
一个控制类 add 在add类中 new一个 Book加到mainframe里
add类在mainframe的菜单监听里调用add(mainframe)参数是mainframe类型的
在mainframe中建立main方法 启动 添加 jpanel类型的Book 成功显示
但当通过登陆窗口 打开 mainframe 窗口时再调用add(mainframe)有空指针异常
请问 在 mainframe本类中new 和在登陆窗口中new 出的mainframe窗口有什么不同吗
要怎么解决----------------解决方案--------------------------------------------------------
上传代码看看
----------------解决方案--------------------------------------------------------
//已经解决 但我还是想不通 代码有点长 写的不全 希望能够得到 详细的答案 谢谢!
第一个类Main:
public class Main extends JFrame {
final JLabel label;
.........................//略
static Main fm;
public Main() {
super();
........................//略
final JMenuItem menuItem_4 = new JMenuItem();
menuItem_4.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {// 加入 出借图书 面板
if (RemoveAble) {
fm.getContentPane().removeAll();
fm.getContentPane().add(label, BorderLayout.NORTH);
}
//##################当用第三个类new此类的时候 下面的语句出现空指针异常 应该是fm为空吧
new Menu_OutBook().add(fm);//通过监听调用逻辑控制类的方法加入面板
RemoveAble = true;//其中fm就是本类的一个实例
}
});
}
public static void main(String args[]) {
try {
fm = new Main();
fm.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
public void addFm(Main a){//################################此行是后加进去的
this.fm = a;
}
}
[[it] 本帖最后由 Jared_self 于 2008-8-7 23:12 编辑 [/it]]
----------------解决方案--------------------------------------------------------
第二个类Menu_OutBook :
package Ctrl;
import java.awt.BorderLayout;
import View.OutBook;
import View.Main;
/*******************************************************************************
* 加入-----出借图书面板
******************************************************************************/
public class Menu_OutBook {
public void add(Main frame) {
OutBook f = new OutBook();
f.setVisible(true);
frame.getContentPane().add(f, BorderLayout.CENTER);
frame.validate();
}
}
----------------解决方案--------------------------------------------------------
第三个类是一个登陆敞口的监听 当验证正确后
public class FirstUser {
public static Main frame;
.............//验证正确
frame = new Main();
//#####################################//这一行是后加进去的以解决问题
frame.addFm(frame);
//#################################
frame.setVisible(true);
uin.setVisible(false);// 隐藏登陆窗口
}
[[it] 本帖最后由 Jared_self 于 2008-8-7 23:01 编辑 [/it]]
----------------解决方案--------------------------------------------------------
我是想知道,为什么Main自己new自己的时候没有问题,而通过第三个类FirstUser new的时候要调用frame.addFm(frame);方法?把自己的属性再次加到自己身上那?难道两次new出的frame不是一个吗。想不大通?
----------------解决方案--------------------------------------------------------
奥,这样的。你对创建实例还不是很理解。new每次都会开一个新的实例。在虚拟机的存储也发生变化。
public class test {
public test(char flag){
System.out.println("测试对象:"+flag);
}
public static void main(String[] args) {
test a=new test('a');
System.out.println(a);
test b=new test('b');
System.out.println(b);
}
}
打印出的值:
测试对象:a
test@de6ced
测试对象:b
test@c17164
你的程序一些方法名对照不齐,看不懂。
----------------解决方案--------------------------------------------------------
回复 7# jdk2006 的帖子
但是我的 属性static Main fm;是累的静态的 应该是每个实例公用的啊 难道只是内存地址相同 而并不是真正的同一个fm
这么理解对吗
谢谢你的讲解
----------------解决方案--------------------------------------------------------
static Main fm只能算是创建了Main 的一个对象,而不是实例。new Main()才是实例。因此fm没有实例化
----------------解决方案--------------------------------------------------------
明白了 谢谢 有些东西 不做真的不懂啊 呵呵
----------------解决方案--------------------------------------------------------