最近在写一个虚拟教室的东东,其实也不是什么特难的东东,只是用到了我们以前未用过的新东东罢了,比如说JGroups等。
在写一个swing的界面时候碰到一个关于单例程的问题,在毛哥的帮助下,得到了解决...
下面我写了一个简单的界面东西,把问题展示出来。由于代码简单就没写注释了。相信大家都能看懂的。
这个类没什么问题
下面这个类就存在问题了
大家运行就知道了,这结果表明,所加的列并没有加到JList中,但是当我稍微改下,即把run()方法中的第一行改成
这样就行了,能加进去了...
更加让人觉得不可思议的是当我测试下面的代码时
居然返回的是true值
[size=large][color=red]下面是问题的所在:
其实此处并不是一个单例模式,而是可以创建多个实例的,当你多次new的时候,会调用init方法,从而又会有一个frame属性,通过getInstance方法使其创建一个新的对象,从而出现了两个对象了,因此主函数中用new方法创建的对象并不是用getInstance方法创建的对象,因而会出现类似不同的通道一样的,从而是对不同JList的操作,自然两个对象中的组件也不同。从而会出现上面的问题儿。
至于上面的为什么测试会出现true值,主要是因为当调用getInstance方法的时候是对静态变量frame进行了一次新的赋值,当调用new方法创建对象的时候frame属性为null值,当再次调用getInstance方法的时候就给frame赋了新值了,从而会是同一个,自然返回true。[/color][/size]
在写一个swing的界面时候碰到一个关于单例程的问题,在毛哥的帮助下,得到了解决...
下面我写了一个简单的界面东西,把问题展示出来。由于代码简单就没写注释了。相信大家都能看懂的。
这个类没什么问题
package test;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
/**
*
* @author ljp
*
*/
public class JListTestFrame extends JFrame{
private static JList list;
private static DefaultListModel model;
private static JListTestFrame frame;
private JButton btn;
public static JListTestFrame getInstance(){
if(frame==null){
frame=new JListTestFrame();
}
return frame;
}
public JListTestFrame(){
init();
}
public void init(){
btn=new JButton();
list=new JList();
model=new DefaultListModel();
list.setModel(model);
setLayout(new BorderLayout());
add(list,BorderLayout.CENTER);
add(btn,BorderLayout.SOUTH);
setSize(200,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
btn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
new JListThread().start();
}
});
}
public static DefaultListModel getModel(){
return model;
}
public static JListTestFrame getFrame(){
return frame;
}
public static void main(String args[]){
new JListTestFrame().setVisible(true);
}
}
下面这个类就存在问题了
package test;
import javax.swing.DefaultListModel;
/**
*
* @author ljp
*
*/
public class JListThread extends Thread{
public void run(){
JListTestFrame frame=JListTestFrame.getInstance();
DefaultListModel model=frame.getModel();
int i=0;
while(i<10){
String name="list -"+i;
model.addElement(name);
i++;
}
}
}
大家运行就知道了,这结果表明,所加的列并没有加到JList中,但是当我稍微改下,即把run()方法中的第一行改成
JListTestFrame frame=JListTestFrame.getFrame();
这样就行了,能加进去了...
更加让人觉得不可思议的是当我测试下面的代码时
JListTestFrame.getInstance().equals(frame);
居然返回的是true值
[size=large][color=red]下面是问题的所在:
其实此处并不是一个单例模式,而是可以创建多个实例的,当你多次new的时候,会调用init方法,从而又会有一个frame属性,通过getInstance方法使其创建一个新的对象,从而出现了两个对象了,因此主函数中用new方法创建的对象并不是用getInstance方法创建的对象,因而会出现类似不同的通道一样的,从而是对不同JList的操作,自然两个对象中的组件也不同。从而会出现上面的问题儿。
至于上面的为什么测试会出现true值,主要是因为当调用getInstance方法的时候是对静态变量frame进行了一次新的赋值,当调用new方法创建对象的时候frame属性为null值,当再次调用getInstance方法的时候就给frame赋了新值了,从而会是同一个,自然返回true。[/color][/size]