⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sample26_7.java

📁 Java SE 6.0前27-31章示的示例代码,简单易学
💻 JAVA
字号:
package wyf.jc;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
//自定义的表格数据模型
class MyTableModel extends AbstractTableModel
{
	//创建表示各个列类型的类型数组
	Class[] colClass={String.class,Number.class,Date.class};
	//创建列标题字符串数组
	Object[] head={"字符串","数值","日期"};
	//创建表示表格数据的二维对象数组
	Object[][] data={{"one",new Integer(70),new Date()},
					{"two",new Integer(30),new Date(105,7,1)},
					{"three",new Integer(70),new Date(107,8,1)},
					{"four",new Integer(30),new Date(106,0,1)},
					{"five",new Integer(50),new Date(107,1,1)},
					{"six",new Integer(50),new Date(107,8,2)},
					{"seven",new Integer(50),new Date(106,9,1)},
					{"eight",new Integer(60),new Date(107,5,1)},
					{"nine",new Integer(90),new Date(106,7,1)},
					{"ten",new Integer(60),new Date(107,11,1)},
					{"eleven",new Integer(60),new Date(105,4,1)}};
	//重写getColumnCount方法
	public int getColumnCount()
	{
		return head.length;
	}
	//重写getRowCount方法	
	public int getRowCount()
	{
		return data.length;
	}
	//重写getColumnName方法
	public String getColumnName(int col)
	{
		return head[col].toString();
	}
	//重写getValueAt方法
	public Object getValueAt(int r,int c)
	{
		return data[r][c];
	}
	//重写getColumnClass方法
	public Class getColumnClass(int c)
	{
		return colClass[c];
	}
}
//自定义的过滤条件获取控件面板
class MyFilterPane extends JPanel implements ItemListener
{
	//定义标识面板的字符串
	String snd;
	//创建一个复选框
	JCheckBox jcb=new JCheckBox();
	//创建两个标签控件
	JLabel jl1=new JLabel();
	JLabel jl2=new JLabel("设置该条件与其他条件的关系");
	//创建一个文本框控件
	JTextField jtf=new JTextField();
	//创建一个单选按扭数组,并为该单选按扭数组中的单选按扭创建一个按扭组
	JRadioButton[] jrb={new JRadioButton("与关系",true),new JRadioButton("或关系")};
	ButtonGroup bg=new ButtonGroup();
	public MyFilterPane(String snd)
	{
		//设置面板的布局管理器
		this.setLayout(null);
		//设置标识字符串
		this.snd=snd;
		//设置复选框的文本、大小位置并为其注册监听器,同时将其添加到面板中
		jcb.setText("设置"+snd+"过滤条件");
		jcb.addItemListener(this);
		jcb.setBounds(5,5,150,26);
		this.add(jcb);
		//设置jl1标签的文本以及大小位置,并将其添加到面板中
		jl1.setText("请输入与"+snd+"匹配的值");
		jl1.setBounds(10,30,150,26);
		this.add(jl1);
		//设置文本框的大小位置以及可编辑性,并将其添加到面板中
		jtf.setBounds(160,30,80,26);
		jtf.setEditable(false);
		this.add(jtf);
		//设置jl2标签的大小位置,并将其添加到面板中
		jl2.setBounds(10,60,200,26);
		this.add(jl2);
		//循环对单选按钮数组进行设置
		for(int i=0;i<jrb.length;i++)
		{
			//设置单选按扭的大小位置、可编辑性并且将其添加进按扭组与面板中
			jrb[i].setBounds(10+i*80,80,80,26);
			jrb[i].setEnabled(false);
			bg.add(jrb[i]);
			this.add(jrb[i]);
		}
	}
	//获取各个面板中条件对应过滤器的方法
	public RowFilter getFilter()
	{
		if(jcb.isSelected())
		{//测试复选框是否选中
			if(snd.equals("字符串"))
			{//测试标识字符串进而确定是否是字符串过滤条件的面板
				//将输入的字符串封装成过滤器返回 该过滤器将针对表中第一列进行过滤
				return RowFilter.regexFilter(jtf.getText().trim(),0);
			}
			else if(snd.equals("数值"))
			{//测试标识字符串进而确定是否是数值过滤条件的面板
				//获取输入的字符串
				String str=jtf.getText().trim();
				//测试输入的是否是整数
				if(!str.matches("[0-9]+"))
				{//若不是整数则返回
					return null;
				}
				//将字符串封装成Integer对象
				Integer i=new Integer(str);
				//根据Integer对象封装进过滤器,该过滤器将针对表中第二列进行过滤
				return RowFilter.numberFilter(RowFilter.ComparisonType.EQUAL,i,1);
			}
			else if(snd.equals("日期"))
			{//测试标识字符串进而确定是否是日期过滤条件的面板
				//获取输入的字符串
				String str=jtf.getText().trim();
				try
				{
					//将字符串解析成日期Date对象
					String[] tempsa=str.split("-");
					Date d=new Date(Integer.parseInt(tempsa[0])-1900,
					Integer.parseInt(tempsa[1])-1,Integer.parseInt(tempsa[2]));
					//根据日期对象创建过滤器,该过滤器将针对表中第三列进行过滤
					return RowFilter.dateFilter(RowFilter.ComparisonType.EQUAL,d,2);
				}
				catch(Exception e)
				{
					//若输入字符串不能解析成功将弹出提示框
					JOptionPane.showMessageDialog(this,
					     "格式错误,例如应为“2007-3-5”或“2006-12-30”!!!");
					return null;
				}
			}
		}
		return null;
	}	
	//实现ItemListener接口中的方法
	public void itemStateChanged(ItemEvent e)
	{
		if(e.getSource()==jcb&&jcb.isSelected())
		{//当复选框选中时设置所有控件的可用性
			this.setIsOpen(true);
		}			
		else if(e.getSource()==jcb&&!jcb.isSelected())
		{//当复选框未选中时设置所有控件的可用性
			this.setIsOpen(false);
		}			
	}
	//设置控件可用性的方法
	public void setIsOpen(boolean b)
	{
		//根据参数设置各个控件的可用性
		jtf.setEditable(b);
		jrb[0].setEnabled(b);
		jrb[1].setEnabled(b);
	}
}
//主类
public class Sample26_7 extends JFrame
{
	//创建自定义的表格模型对象
	MyTableModel mtm=new MyTableModel();
	//根据模型创建表格控件
	JTable jt=new JTable(mtm);
	//将表格控件放到滚动窗体中
	JScrollPane jsp=new JScrollPane(jt);
	//创建表格的行排序器
	TableRowSorter sorter = new TableRowSorter(mtm);
	//创建选项卡窗格
	JTabbedPane jtp=new JTabbedPane();
	//为三个列创建3个不同的面板
	MyFilterPane mfpStr=new MyFilterPane("字符串");
	MyFilterPane mfpNum=new MyFilterPane("数值");
	MyFilterPane mfpDate=new MyFilterPane("日期");
	//存放与条件过滤器的列表
	ArrayList andlist=new ArrayList();
	//存放或条件过滤器的列表
	ArrayList orlist=new ArrayList();
	//创建一个按扭
	JButton jb=new JButton("提交");				
	public Sample26_7()
	{
		//设置窗体容器为空布局
		this.setLayout(null);
		//设置包含表格的滚动窗体的大小位置
		jsp.setBounds(10,10,300,180);
		//将滚动窗体添加进窗体
		this.add(jsp);	
		//将3个面板添加到选项卡窗格中
		jtp.addTab("过滤字符串",mfpStr);
		jtp.addTab("过滤数值",mfpNum);
		jtp.addTab("过滤日期",mfpDate);
		//设置选项卡窗格的大小位置,并将选项卡窗格添加到窗体中
		jtp.setBounds(320,10,260,150);
		this.add(jtp);		
		//设置按扭的大小位置
		jb.setBounds(400,170,120,26);
		//通过匿名内部类为按扭注册监听器并编写事件处理代码
		jb.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				if(e.getSource()==jb)
				{
					Sample26_7.this.creatGeneralFilter();
				}
			}			
		});
		//将按扭添加进窗体
		this.add(jb);			
		//为表格设置行排序器
		jt.setRowSorter(sorter);		
		//设置窗体标题、大小位置以及可见性
		this.setTitle("表格排序器与过滤器示例");
		this.setResizable(false);
		this.setBounds(100,100,600,230);
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	//获取最后组装的过滤器的方法
	public void creatGeneralFilter()
	{
		//获取字符串过滤面板的过滤器
		RowFilter rf=mfpStr.getFilter();
		if(rf!=null)
		{//测试获取的过滤器是否为null
			if(mfpStr.jrb[0].isSelected())
			{//测试字符串面板中单选按扭是否选择的是与关系,若是则将过滤器添加进与列表
				andlist.add(rf);
			}				
			else
			{//否则将过滤器添加进或列表
				orlist.add(rf);
			}				
		}
		//获取数值过滤面板的过滤器
		rf=mfpNum.getFilter();
		if(rf!=null)
		{//测试获取的过滤器是否为null			
			if(mfpNum.jrb[0].isSelected())
			{//测试数值面板中单选按扭是否选择的是与关系,若是则将过滤器添加进与列表
				andlist.add(rf);
			}				
			else
			{//否则将过滤器添加进或列表
				orlist.add(rf);
			}				
		}
		//获取日期过滤面板的过滤器
		rf=mfpDate.getFilter();
		if(rf!=null)
		{//测试获取的过滤器是否为null			
			if(mfpDate.jrb[0].isSelected())
			{//测试日期面板中单选按扭是否选择的是与关系,若是则将过滤器添加进与列表
				andlist.add(rf);
			}				
			else
			{//否则将过滤器添加进或列表
				orlist.add(rf);
			}				
		}
		if(!andlist.isEmpty())
		{//测试与列表中是否没有元素,若有元素则将该列表中的过滤器根据与条件进行组装
			rf=RowFilter.andFilter(andlist);
			//将组装后的过滤器添加进或关系列表中
			orlist.add(rf);
		}
		if(!orlist.isEmpty())
		{//测试或列表中是否没有元素,若有元素则将该列表中的过滤器根据或条件进行组装
			rf=RowFilter.orFilter(orlist);
		}
		//将最后组装好的过滤器设置到表格排序器中进而体现在表格中
		sorter.setRowFilter(rf);
		//清除与列表与或列表中的所有元素
		andlist.clear();
		orlist.clear();
	}	
	public static void main(String args[])
	{
		//创建Sample26_7窗体对象
		new Sample26_7();
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -