Java JList应用

  前段时间做决策树,其中用JList来控制用户选择 选择属性和决策属性。


package Genera_decis_tree;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.event.*;
/**
 * 我们来看如何处理在JList上双击鼠标的操作。由于JList本身并无提供这样的EventListener,因此我们必须利用
MouseListener来达到捕获双击鼠标的事件。至于要怎么知道我们到底在哪个项目上双击鼠标呢?我们可以利用JList类所提供的
LocatToindex()方法得知。以下为我们所举的范例:
   这个例子一开始左边列有所有属性名称,当你在某个属性名称上双击鼠标,这个国家名称就会移到右边去,反之亦同。
   1.这个范例我们应用DefaultListModel类,因主DefaultListModel类实作了Vector中的方法,使我们在处理动态的JList项目值 
     比较容易.
   2.由于我们要处理鼠标事件,为了编写方便,在程序中我们继承MouseAdapte抽象类.
   3.在程序中,我们建立两个DataModel,第一个JList,也就是list1一开始时会将String Array s中的所有值依次放入list1的项目中,而list2一开始为空白。
 *
 */
public class Desion_Tree_SetAttr extends MouseAdapter implements ActionListener{
	/**
	 * 决策树中用来设置分类属性的frame
	 */
JList allattrlist=null; 
JList classattrlist=null; 
JList tarlist=null;
DefaultListModel mode1=null;
DefaultListModel mode2=null;
DefaultListModel mode3=null;

JLabel var=new JLabel("变量");
//JLabel selvar=new JLabel("自变量");
JLabel tarvar=new JLabel("因变量");
JPanel right=new JPanel();
JButton tarBut=new JButton("设置因变量");
JButton selBut=new JButton("设置自变量");
JButton submit=new JButton("提交");
JLabel blank=new JLabel();     //空白标签,用来布局时将提交按钮放在最右边

JScrollPane varpane=new JScrollPane();
JScrollPane tarpane=new JScrollPane();
JScrollPane selpane=new JScrollPane();

PublicData pd=new PublicData();
/**
 * 控制是否可以左右移动
 */
public static boolean leftFlag=false;
public static boolean rightFlag=false;

public int index=0;                    //整个类公用的 存储当前选择的list项的索引

String[] s = PublicData.getAttr();
 public static JFrame f=new JFrame("决策树属性设置");                 //不放在外面,会导致点击窗口退出时全部退出
public void creatUI(String title){
	s = PublicData.getAttr();
	f.setTitle(title);
	
	Container contentPane=f.getContentPane();
	contentPane.setLayout(new GridLayout(3,2));
	submit.setLocation(650,350);
	submit.setSize(20, 10);
	submit.addActionListener(this);
	
	tarBut.addActionListener(this);
	selBut.addActionListener(this);

	mode1=new DataModel(1);
	allattrlist=new JList(mode1);
	allattrlist.setBorder(BorderFactory.createTitledBorder("当前所有属性"));
	allattrlist.addMouseListener(this);//一遇到鼠标事件立即执行.

	mode2=new DataModel(2);
	classattrlist=new JList(mode2);
	classattrlist.setBorder(BorderFactory.createTitledBorder("作为自变量的属性"));
	classattrlist.addMouseListener(this);//一遇到鼠标事件立即执行.

	mode3=new DataModel(3);
	tarlist=new JList(mode3);
	tarlist.setVisibleRowCount(1);           //设置其显示行数,只显示一行
	tarlist.addMouseListener(this);
	tarlist.setBorder(BorderFactory.createTitledBorder("作为因变量的属性"));
	
    var.setBounds(420,120,20,15);
    varpane.setBounds(420,140,60,300);
    tarBut.setBounds(500,55,30,20);
    selBut.setBounds(500,175,30,20);
    
    tarvar.setBounds(550,45,20,10);
    tarpane.setBounds(550,140,60,10);
    selpane.setBounds(550,215,60,200);

    
    varpane.setViewportView(allattrlist);
   tarpane.setViewportView(tarlist);
    selpane.setViewportView(classattrlist);
    
	right.setLayout(new GridLayout(2,2));
	right.add(tarBut);

	right.add(tarpane);
	right.add(selBut);
	right.add(selpane);
   
	contentPane.removeAll();
	contentPane.add(var);
	contentPane.add(tarvar);
	contentPane.add(varpane);
	
	contentPane.add(right);
	contentPane.add(blank);
	contentPane.add(submit);
 
	f.setBounds(400,100,300,400);
    f.setVisible(true);
    f.addWindowListener(new WindowAdapter(){
      public void windowClosing(WindowEvent e){
         f.dispose();
      }
   });    
}
class DataModel extends DefaultListModel{
   DataModel(int flag){
      if (flag==1){
      for (int i=0;i<s.length;i++) addElement(s[i]);         
      }
   }
}
@Override
public void actionPerformed(ActionEvent e) {
	String s=e.getActionCommand();
	if(s.equals("设置因变量")&&(tarlist.getModel().getSize()==0)&&rightFlag==true){            //向目标变量List中添加结点
		String tmp=(String)mode1.getElementAt(index);
	    System.out.println("添加因变量"); 
		 mode3 .addElement(tmp);
	     tarlist.setModel(mode3);
	     mode1.removeElementAt(index);
	     allattrlist.setModel(mode1);
	}
	else if(s.equals("设置因变量")&&tarlist.getModel().getSize()>0&&leftFlag==true){   //从目标变量List中移除结点
		String tmp=(String)mode3.getElementAt(index);
		System.out.println("移除因变量");
		mode1.addElement(tmp);
		allattrlist.setModel(mode1);
		mode3.removeElementAt(index);
		tarlist.setModel(mode3);
	}
	else if(s.equals("设置自变量")&&rightFlag==true){
		String tmp=(String)mode1.getElementAt(index);
		mode2.addElement(tmp);
		classattrlist.setModel(mode2);
		mode1.removeElementAt(index);
		allattrlist.setModel(mode1);
	}
	else if(s.equals("设置自变量")&&leftFlag==true){
		String tmp=(String)mode2.getElementAt(index);
		mode1.addElement(tmp);
		allattrlist.setModel(mode1);
		mode2.removeElementAt(index);
		classattrlist.setModel(mode2);	
	}
	else if(s.equals("提交")){
		String tmp=null;
		allattrlist.clearSelection();
		classattrlist.clearSelection();
		tarlist.clearSelection();	
		if(tarlist.getModel().getSize()==1){
			tmp=(String)tarlist.getModel().getElementAt(0);
		    System.out.println("there is data"+"===="+tmp);
		    pd.setTarvar(tmp);
		}
		String v=(String)classattrlist.getModel().getElementAt(0);
		for(int i=1;i<classattrlist.getModel().getSize();i++){
			v=v+","+(String) classattrlist.getModel().getElementAt(i);
		}
		String[] var=v.split(",");
		pd.setSelvar(var);
		allattrlist.clearSelection();
		classattrlist.clearSelection();
		tarlist.clearSelection();
		f.dispose();
		f.invalidate();
		f.repaint();
		//evegain.showDescionTree();

	}
}

//处理鼠标键击事件.如果放在actionPerformed前面会导致
public void mouseClicked(MouseEvent e){
    /*对list1而言,当鼠标在某个项目连续按两下时,我们利用JList所提供的locationToIndex()方法,找到所键击的项目,并
     *由tmp取得此项目的项目值,然后将此项目值增加到mode2中[mode2.addElement(tmp)],用setModel重新设置list2的
     *ListModel,使list2可显示出所增加的项目,将刚刚在list1双击的项目删除.
     */
	if (e.getSource()==allattrlist){
    	rightFlag=true;
    	leftFlag=false;  	
       index=allattrlist.locationToIndex(e.getPoint());
      }
	if (e.getSource()==classattrlist){
    	leftFlag=true;
    	rightFlag=false;   //是一对开关  	
       index=classattrlist.locationToIndex(e.getPoint());
      }
	if(e.getSource()==tarlist){
	   leftFlag=true;
	   rightFlag=false;
	   //index=tarlist.locationToIndex(e.getPoint());
	   index=0;
      }
 }
public static void main(String[] args){
    new Desion_Tree_SetAttr().creatUI("决策树属性设置");
}
}


如下是PublicData类的关键方法,PublicData用来存储和处理数据。


package Genera_decis_tree;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

//公共数据类,主要是操作文件的文件名和属性名
public class PublicData {
        public static final String attrname="d:/predata/attr.txt";
    public static String[] getAttr() {
	BufferedReader r;
	String s=null;
	try{
		r=new BufferedReader(new FileReader(attrname));
		s=r.readLine();
		attr=s.split(",");                //假若属性有多行就会有问题
	}catch(IOException e){
         e.printStackTrace();		
         System.out.println("没有找到文件");
	}
	return attr;
}
public static void setAttr(String[] attr) {    //其实就是将属性全部存储在attrname文件中
 try{
 BufferedWriter writer = new BufferedWriter(new FileWriter(new File(attrname)));
 for(int i=0;i<attr.length;i++){
 if(i==0){
 writer.append(attr[i].replaceAll("\"", "").trim());
 }
 else{
 writer.append(","+attr[i].replaceAll("\"", "").trim()); //去掉双引号 
 }
 writer.flush();
 }   
 } catch (IOException e) {
 e.printStackTrace();
 } 
}
}


数据存储在
d:/predata/attr.txt
  包含内容是:    age,income,student,credit,suggestion




你可能感兴趣的:(java,JList)