Topic: JList的一个问题

  Print this page

1.JList的一个问题 Copy to clipboard
Posted by: probing
Posted on: 2006-03-04 19:25

程序如下
期待的运行结果是JList有三行显示

但是多运行几次此程序会发现有的时候只显示2行
而且出来的界面里这两行根本无法选中
这种情况的几率大概是10%左右
请问这是bug还是程序有问题呢?

import java.awt.BorderLayout;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JList;

public class ListTest extends JFrame {

  Vector data;
  private JList list;
  /**
   * Launch the application
   * @param args
   */
  public static void main(String args[]) {
    Vector myData = new Vector();
    try {
      ListTest frame = new ListTest( myData );
      frame.setVisible(true);
    } catch (Exception e) {
      e.printStackTrace();
    }
    myData.add("line3");
  }

  /**
   * Create the frame
  */
  public ListTest( Vector data ) {
    super();
    this.data = data;
    setBounds(100, 100, 500, 375);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    data.add( "line1" );
    data.add( "line2" );
    list = new JList( data );
    getContentPane().add(list, BorderLayout.CENTER);
    //
    
  }

}

2.Re:JList的一个问题 [Re: probing] Copy to clipboard
Posted by: xiaosilent
Posted on: 2006-03-04 22:36

以下仅代表个人观点

myData.add("line3"); 的位置有问题.

//====第一种建议
public static void main(String args[]) {
Vector myData = new Vector();
try {
ListTest frame = new ListTest( myData );
frame.setVisible(true);
myData.add("line3");
frame.validate();
} catch (Exception e) {
e.printStackTrace();
}

}

//==第二种
public static void main(String args[]) {
Vector myData = new Vector();
try {
ListTest frame = new ListTest( myData );
myData.add("line3");
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}

}

总之,在显示以后,如果改变了list的内容,应该重新验证.

3.Re:JList的一个问题 [Re: probing] Copy to clipboard
Posted by: yzdbj
Posted on: 2006-03-05 10:10

这要有MVC(Model-View-Controller)模型的概念!(可以与VB三层的概念相结合)
作用:Modell管理自己的状态且处理对状态的操作,当它改变时要负责通知View;View负责显示数据;Controller:管理Model与View之间的交互!
这是因为List控件是一个重量级控件!它只负责把数据给显示出来。
在这里M(Model)是你程序里的Vector ,List控件相当于你程序里的V(View)!List里面显示的数据只是初始化时的数据,当要进行添加、删除操作时Model要 通知List控件,关键在这里还要定义一个类:DefaultListModel,它负责通知View.
例如:
DefaultListModel idlm;
idlm= new DefaultListModel();
JList ijl ;
ijl= new JList(idlm);
idlm.addElement("要添加的项目");//在相关事件里添加
idlm.remove(“要删除的项目”);//在相关事件里添加
不知这样解释可以吗?
我是一新手,,大家可以常交互!

4.Re:JList的一个问题 [Re: probing] Copy to clipboard
Posted by: probing
Posted on: 2006-03-08 16:34

验证了一下二楼的第二个方法是可以的,第一个验证了一下也不行。
好像比较正规的做法就是楼上的这种了 或者自己继承AbstractListModel自己写一个model
看了一下swing的源码其实 DefaultListModel实现也就是里面包了一个Vector,只不过add的时候会调用父类里面的fireIntervalAdded方法。api里对这个的解释是AbstractListModel subclasses must call this method after one or more elements are added to the model.
看来直接传Vector给JList构造函数的方法一般是在以后不会对list内容改变的情况下用的,如果要动态改变就要继承AbstractListModel并使用fireIntervalAdded

我是这么理解的,不过觉得这个设计对开发者好像不够方便...


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923