关于JList的事件监听的神奇现象

心有阳光 2011-10-26 10:46:35
源代码如下
package lwj.xiti;

import java.awt.event.* ;

import javax.swing.* ;

import javax.swing.event.*;

import java.awt.* ;

/*
* 此程序主要展示JList的使用
*
* JList可以通过一个数组创建 ,也可以通过一个Vector创建,
* 通过前者创建的JList项目数量不能改变
* 通过Vector创建的JList项目数量可以改变
* 还可以通过一个ListModel 来创建,此时一般用DefaultListModel
* 这种方式也可以变化为先创立model ,然后,创建空Jlist,然后
* 通过setModel()方法将model设置上去。这是等效的!
*
*
* 它有三种选择模式 这三个模式常量 存在于 ListSelectionModel接口中
*
* 分别是 static int SINGLE_SELECTION
* SINGLE_INTERVAL_SELECTION
* MULTIPLE_INTERVAL_SELECTION
*
* 在将JList先加入到JScrollPane中,然后将JScrollPane
* 加入到JFrame中,就可以产生滚动条
*/
public class P191_6 extends JFrame implements ListSelectionListener

{


private JTextArea answerfield = new JTextArea ( "你选择的是" ) ;

private JList noteList = new JList ( ) ;

public P191_6 ( )

{
super ( " 通讯录" ) ;

add( answerfield , BorderLayout.NORTH ) ;

add( new JScrollPane( noteList ) , BorderLayout.CENTER) ;


noteList.addListSelectionListener( this ) ;

DefaultListModel model = new DefaultListModel ( ) ;

noteList.setModel( model ) ;
//设置model后,可以直接通过model来操作元素 model相当于一个Vector

//BorderFactory可以用来产生各种个性化的border

//设定列表边框
noteList.setBorder(BorderFactory.createTitledBorder( "选择你喜欢的数字" ) ) ;

//设定列表框选择模式
noteList.setSelectionMode(ListSelectionModel.
MULTIPLE_INTERVAL_SELECTION ) ;



//设定列表框显示元素数目

noteList.setVisibleRowCount( 10 ) ;

//设定每个元素所占的高度

noteList.setFixedCellHeight( 20 ) ;

//为列表框增加选择监听器

noteList.addListSelectionListener( this ) ;






//通过model来增加30个元素
for ( int element = 0 ; element < 30 ;element ++)

{

model.addElement( " 第 " + element + " 项 " ) ;

}


//为整个JFrame增加关闭监听接口

addWindowListener ( new WindowAdapter( )

{
public void windowClosing ( WindowEvent we )

{
System.exit( 0 ) ;
}
}) ;

//设置窗口大小

setSize ( 200 , 300 ) ;

//使窗口可见

setVisible ( true ) ;

}

public void valueChanged(ListSelectionEvent e) {

JList list = (JList ) e.getSource() ;

Object [ ] selectedvalues = list.getSelectedValues() ;

System.out.println( selectedvalues.length ) ;

for ( int i = 0 ; i < selectedvalues.length ; i ++ )

{
answerfield.setText( answerfield.getText() + selectedvalues [ i ] + "|" ) ;

}
}

public static void main(String[] args) {

new P191_6 ( ) ;

}

}


每次选中一项时。都会在textfield中打印四次。相当于事件监听执行了四次
在事件监听中加入如下语句时
System.out.println(answerfield.length) ;
控制台中也会重复打印四次数组的长度。
求高手指教,不胜感激!
...全文
416 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
hzxbz 2014-05-10
  • 打赏
  • 举报
回复
我也遇到这个问题,测试了一下,是鼠标按下和弹起都会触发此事件
心有阳光 2011-10-28
  • 打赏
  • 举报
回复

非常感谢,这样确实可以解决原有问题,但是又有新的问题出现,比如,在第一项上点两次,文本域中也将输出两次第一项,而实际上这时选择的项并没产生变化,所以不希望产生二次输出。
我想关键就是在什么情况下会触发ListSelectionEvent吧,希望能明示。谢谢![Quote=引用 1 楼 java2000_net 的回复:]
鼠标一次点击,会触发多次事件的。比如
onMouseDown, OnMouseUp,OnClick。。。。

具体的你自己分析吧。

建议你用 Mouse事件处理,比如如下的代码


Java code

package test;

import java.awt.BorderLayout;
import java.awt.event.MouseAdapter;
im……
[/Quote]
孟祥月 2011-10-27
  • 打赏
  • 举报
回复
学习了
另外建议楼主分清楚每个事件的监听器
老紫竹 2011-10-27
  • 打赏
  • 举报
回复
鼠标一次点击,会触发多次事件的。比如
onMouseDown, OnMouseUp,OnClick。。。。

具体的你自己分析吧。

建议你用 Mouse事件处理,比如如下的代码

package test;

import java.awt.BorderLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class Test extends JFrame implements ListSelectionListener {
private JTextArea answerfield = new JTextArea("你选择的是");
private JList noteList = new JList();

public Test() {
super(" 通讯录");
add(answerfield, BorderLayout.NORTH);
add(new JScrollPane(noteList), BorderLayout.CENTER);
noteList.addListSelectionListener(this);
DefaultListModel model = new DefaultListModel();
noteList.setModel(model);
// 设置model后,可以直接通过model来操作元素 model相当于一个Vector
// BorderFactory可以用来产生各种个性化的border
// 设定列表边框
noteList.setBorder(BorderFactory.createTitledBorder("选择你喜欢的数字"));
// 设定列表框选择模式
noteList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
// 设定列表框显示元素数目
noteList.setVisibleRowCount(10);
// 设定每个元素所占的高度
noteList.setFixedCellHeight(20);
// 为列表框增加选择监听器
noteList.addListSelectionListener(this);
noteList.addMouseListener(mouseListener);
// 通过model来增加30个元素
for (int element = 0; element < 30; element++) {
model.addElement(" 第 " + element + " 项 ");
}
// 为整个JFrame增加关闭监听接口
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
System.exit(0);
}
});
// 设置窗口大小
setSize(200, 300);
// 使窗口可见
setVisible(true);
}

MouseListener mouseListener = new MouseAdapter() {
public void mouseClicked(MouseEvent mouseEvent) {
JList list = (JList) mouseEvent.getSource();
Object[] selectedvalues = list.getSelectedValues();
System.out.println(selectedvalues.length);
for (int i = 0; i < selectedvalues.length; i++) {
answerfield.setText(answerfield.getText() + selectedvalues[i] + "|");
}
}
};

public void valueChanged(ListSelectionEvent e) {
}

public static void main(String[] args) {
new Test();
}
}

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧